1、扫雷游戏代码using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace Mine public partial class Form1 : Form public Form1() InitializeComponent(); private Button, Mines; private int XNum=8; /一行方块的
2、数目 private int YNum=9; /一列方块的数目 private int MineNum = 10; /雷的总数 private int, Turn; /=-1 表示这个位置已经翻开; /=0 表示这个位置没有翻开; /=1 表示这个位置插上红旗; private int CostTime = 0; /所用时间 private int RestMine = 10; /剩余的雷数 private int MineWidth = 30; /雷方块的大小(宽度为30像素) private void Form1_Load(object sender, EventArgs e) Turn
3、= new intXNum, YNum; Mines = new ButtonXNum, YNum; for (int x = 0; x XNum; x += 1) for (int y = 0; y YNum; y += 1) Minesx, y = new Button(); this.Controls.Add(Minesx, y); Minesx, y.Left = 10 + MineWidth * x; Minesx, y.Top = 50 + MineWidth * y; Minesx, y.Width = MineWidth; Minesx, y.Height = MineWidt
4、h; Minesx, y.Font = new Font(宋体, 10.5F, FontStyle.Bold, GraphicsUnit.Point, (byte)(134); Minesx, y.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; Minesx, y.Name = Mines + (x + y * XNum).ToString(); Minesx, y.MouseUp += new MouseEventHandler(bt_MouseUp); Minesx, y.Visible = false;
5、private void GameInit()/游戏初始化 for (int x = 0; x XNum; x += 1) for (int y = 0; y YNum; y += 1) Minesx, y.Text = ; Minesx, y.Visible = true; Minesx, y.Enabled = true; Minesx, y.Tag = null; Minesx, y.BackgroundImage = null; Turnx, y = 0; LayMines(); / / 布雷 / private void LayMines() int x,y; Random s =
6、new Random(); /取随机数 for (int i = 0; i MineNum; ) /取随机数 x = s.Next(XNum) ; y = s.Next(YNum) ; if (Convert.ToInt16(Minesx,y.Tag)!= 1) /=1时,代表这个位置是地雷 Minesx, y.Tag = 1;/修改属性为雷 /Minesx, y.Text = u; i+; / / 获取某个小方块区域相邻8个区域的雷个数 / private int GetAroundNum(int row,int col) int i, j; int around = 0; int minR
7、ow = (row = 0) ? 0 : row - 1; int maxRow = row + 2; int minCol = (col = 0) ? 0 : col - 1; int maxCol = col + 2; for (i = minRow; i maxRow; i+) for (j = minCol; j = 0 & row = 0 & col YNum); / /雷方块拓展(对于周围无雷的空白区域) / private void ExpandMines(int row, int col) int i, j; int minRow = (row = 0) ? 0 : row -
8、 1; int maxRow = row + 2; int minCol = (col = 0) ? 0 : col - 1; int maxCol = col + 2; int around = GetAroundNum(row, col); /对周围一个雷都没有的空白区域拓展 if (around = 0) Minesrow,col.Enabled = false; for (i = minRow; i maxRow; i+) for (j = minCol; j maxCol; j+) /对于周围可以拓展的区域进行的规拓展 if (!IsInMineArea(i, j) continue
9、; if (!(i = row & j = col) & Minesi, j.Enabled != false) /& Convert.ToInt16(Minesi,j.Tag)!= 1 ExpandMines(i, j); Minesi, j.Enabled = false;/周围无雷的区域按钮无效 if (GetAroundNum(i,j) != 0) /周围无雷*6-28 Minesi, j.Text = GetAroundNum(i, j).ToString(); / / 胜利判断并处理 / private bool Victory()/ 检测是否胜利 for (int i = 0;
10、i XNum; i+) for (int j = 0; j YNum; j+) /没翻开且未标示,则未成功 if (Minesi, j.Enabled= true&Turni, j != 1) return false; /不是雷却误标示为雷,则也未成功 if (Convert.ToInt16(Minesi, j.Tag) != 1 & Turni, j = 1) return false; return true ; /添加按钮控件Click事件与处理方法bt_Click: private void bt_MouseUp(object sender, MouseEventArgs e) /这
11、里处理事件方法 String btName; Button bClick=(Button)sender;/将被击的按钮赋给定义的bClick变量 btName = bClick.Name;/获取按钮的Name int n=Convert.ToInt16 (btName.Substring(5); int x = n % XNum; int y = n / XNum; /通过按钮Name属性来判断是哪个Button被点击,并执行相应的操作 switch (e.Button) case MouseButtons.Left: if (Convert.ToInt16(Minesx, y.Tag) !=
12、 1)/不是雷 Minesx, y.BackgroundImage = null; Minesx, y.Text = GetAroundNum(x, y).ToString(); Minesx, y.Enabled = false; ExpandMines(x, y);/完成无雷拓展 if (Victory() / 判断是否胜利,是则将地图中所有雷标识出来 show(); MessageBox.Show(胜利!, 结束); timer1.Enabled = false;/停止计时 else/触雷 Minesx, y.BackgroundImage = Image.FromFile(mine1.
13、bmp); MessageBox.Show(失败!, 结束); timer1.Enabled = false;/停止计时 show();/将地图中所有雷标识出来 break; case MouseButtons.Right: Minesx, y.BackgroundImage = Image.FromFile(flag.bmp); if (Turnx, y = 1)/表示这个位置插上红旗 Turnx, y = 0;/取消红旗,表示这个位置没有翻开 RestMine+; Minesx, y.BackgroundImage = null; else Turnx, y = 1;/表示这个位置插上红旗
14、 RestMine-; lblMine.Text = RestMine.ToString(); if (Victory() MessageBox.Show(胜利!, 结束); timer1.Enabled = false;/停止计时 break; private void show()/将地图中所有雷标识出来 for (int i = 0; i XNum; i+) for (int j = 0; j YNum; j+) if (Convert.ToInt16(Minesi, j.Tag) = 1) /=1时,代表这个位置是地雷 Minesi, j.BackgroundImage = Image
15、.FromFile(mine.bmp); private void btnStart_Click(object sender, EventArgs e) GameInit();/游戏初始化 timer1.Enabled = true; private void timer1_Tick(object sender, EventArgs e) CostTime+; lblTime.Text = CostTime.ToString();/ 用时: + CostTime.ToString() + 秒; private void button2_Click(object sender, EventArgs e) show();/将地图中所有雷标识出来
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1