C#扫雷(9*9阉割版)
来源:互联网 发布:矩阵化为行最简形 编辑:程序博客网 时间:2024/06/05 11:07
首先写一个类,用来保存每个格子可以携带的信息
class FK { //是否是雷 public bool lei; public bool Lei { get { return lei; } set { lei = value; } } //如果不是雷,它的周围有几颗雷 public int num; public int Num { get { return num; } set { num = value; } } //第一次右击 public bool first; public bool First { get { return first; } set { first = value; } } //第二次右击 private bool second; public bool Second { get { return second; } set { second = value; } } //被鼠标点击的次数 private int cli_num; public int Cli_num { get { return cli_num; } set { cli_num = value; } } }
然后进入主程序
public partial class Form1 : Form { public Form1() { InitializeComponent(); } FK[] fk = new FK[81]; //方块信息,携带方块的各种信息 int[] nn = new int[9]; //有雷的方块的标记 Button[] bu = new Button[81]; //可点击方块 Random r = new Random(); //随机数 int ss; //记录剩余雷(玩家认为的)的个数 Label lei = new Label(); //显示 ss private void Form1_Load(object sender, EventArgs e) { //对游戏界面初始化 start(); } private void start() { this.Width = 800; this.Height = 600; this.Top = this.Left = 50; this.BackColor = Color.Black; //初始设置剩余9个雷 ss = 9; //定义一个Lable,记录标记了多少个方块是 雷 lei.Top = 20; lei.Left = 700; lei.Width = 50; lei.Height = 20; lei.Text = ss.ToString(); lei.BackColor = Color.Red; lei.ForeColor = Color.White; this.Controls.Add(lei); //生产 雷 的方块记号 ran_num(); //做方块 int k = 0; for (int i = 0; i < 81; i++) { fk[i] = new FK(); if (i == nn[k]) //如果是 雷 { //避免数组 越界 if (k <= 7) { k++; } fk[i].Cli_num = -1; //雷 的初始点击次数为-1 fk[i].Lei = true; //是 雷 fk[i].Num = -1; //雷 的周围有多少 雷 初始设为-1 } else { fk[i].Cli_num = 0; //不是雷 的初始点击次数为0 fk[i].Lei = false; //不是雷 fk[i].Num = 0; //方块周围有多少雷 初始设为0 } fk[i].First = false; //初始没有单击鼠标右键 fk[i].Second = false; //初始没有第二次单击鼠标右键 bu[i] = new Button(); bu[i].Height = bu[i].Width = 50; //利用坐标关系,就爱那个方块9*9排列 bu[i].Top = i / 9 * 50 + 100; bu[i].Left = i % 9 * 50 + 30; bu[i].FlatStyle = FlatStyle.Standard; bu[i].BackColor = Color.Red; bu[i].Tag = i; //利用Tag将类fk与方块绑定 bu[i].MouseDown += new MouseEventHandler(lb_MouseDown); this.Controls.Add(bu[i]); } //将每个 雷 的周围方块加入提示信息 for (int i = 0; i < 81; i++) { if (fk[i].Lei) { make_num(i); } } } //每个雷处于9*9中心,其四周方块判断这里有雷,提示有雷(Num+1) private void make_num(int i) { if (i %9 != 8) { fk[i + 1].Num++; } if (i %9 != 0) { fk[i - 1].Num++; } if (i <72) { fk[i + 9].Num++; } if (i >=9) { fk[i - 9].Num++; } if (i >= 9 && i % 9 != 8) { fk[i - 8].Num++; } if (i >= 9 && i % 9 != 0) { fk[i - 10].Num++; } if (i < 72 && i % 9 != 0) { fk[i + 8].Num++; } if (i < 72 && i % 9 != 8) { fk[i + 10].Num++; } } //鼠标单机事件 void lb_MouseDown(object sender, MouseEventArgs e) { Button lb = (Button)sender; int ii = (int)lb.Tag; //如果左击且不处于右键单击情况下 if (e.Button == MouseButtons.Left&&fk[ii].Second==false&&fk[ii].First==false) { //是雷 if (fk[ii].Lei) { lb.Text = "雷"; lb.MouseDown -= new MouseEventHandler(lb_MouseDown); //游戏结束 MessageBox.Show("失败"); //游戏重新开始 this.Controls.Clear(); start(); } //不是 雷 else if(fk[ii].Num > 0) { fk[ii].Cli_num++; //单击次数+1 lb.MouseDown -= new MouseEventHandler(lb_MouseDown); lb.Text = fk[ii].Num.ToString(); //将其周围有多烧 雷 显示出来 } else if(fk[ii].Num == 0 && fk[ii].Lei==false) { //如果方块周围没有 雷 down0(ii); } } // 右键单击方块 else if(e.Button==MouseButtons.Right) { //第一次右键单击,表示玩家认为这里是 雷 if (fk[ii].First == false && fk[ii].Second == false) { fk[ii].First = true; lb.Text = "旗旗"; ss--; } //第二次右键单击,表示玩家怀疑这里是 雷 else if (fk[ii].First == true && fk[ii].Second == false) { fk[ii].Second = true; lb.Text = "?"; ss++; } //第三次右键单击,表示玩家取消以上两种状态 else if (fk[ii].First == true && fk[ii].Second == true) { fk[ii].First = fk[ii].Second= false; lb.Text = ""; } lei.Text = ss.ToString(); } //判断是否游戏成功 if (suc()) { MessageBox.Show("成功"); this.Controls.Clear(); start(); } } //产生9个在1~81之间的互不相同的随机数 void ran_num() { //产生随机数 for (int i = 0; i < 9; i++) { nn[i] = r.Next(1, 82); for (int j = 0; j <i; j++) { //保证互不相同 if (nn[i] == nn[j]) { i--; break; } } } //将这些随机数排序(冒泡排序) int temp; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8 - i; j++) { if (nn[j] > nn[j + 1]) { temp = nn[j + 1]; nn[j + 1] = nn[j]; nn[j] = temp; } } } } //如果左键点击到方块 int down0(int i) { fk[i].Cli_num++; //单击次数+1 bu[i].BackColor = Color.White; bu[i].MouseDown -= new MouseEventHandler(lb_MouseDown); //开始向周围扩散 //直到遇到周围的方块是 雷,或者这个方块的周围有雷 if (i + 9 < 81 ) { if (fk[i + 9].Num > 0) { fk[i+9].Cli_num++; bu[i+9].Text= fk[i + 9].Num.ToString(); } if (fk[i + 9].Num == 0 && bu[i + 9].BackColor != Color.White) { //利用 递归 继续向周围扩散 down0(i+9); } } if (i - 9 >= 0) { if (fk[i - 9].Num > 0) { fk[i-9].Cli_num++; bu[i - 9].Text = fk[i - 9].Num.ToString(); } if (fk[i - 9].Num == 0 && bu[i - 9].BackColor != Color.White) { down0(i - 9); } } if (i % 9 != 0) { if (fk[i - 1].Num > 0) { fk[i-1].Cli_num++; bu[i - 1].Text = fk[i - 1].Num.ToString(); } if (fk[i - 1].Num == 0 && bu[i - 1].BackColor != Color.White) { down0(i - 1); } } if (i % 9 != 8) { if (fk[i + 1].Num > 0) { fk[i+1].Cli_num++; bu[i + 1].Text = fk[i + 1].Num.ToString(); } if (fk[i + 1].Num == 0 && bu[i + 1].BackColor != Color.White) { down0(i + 1); } } if (i - 9 >= 0 && i % 9 != 0) { if (fk[i - 10].Num > 0) { fk[i-10].Cli_num++; bu[i - 10].Text = fk[i - 10].Num.ToString(); } if (fk[i - 10].Num == 0 && bu[i - 10].BackColor != Color.White) { down0(i - 10); } } if (i - 9 >= 0 && i % 9 != 8) { if (fk[i - 8].Num > 0) { fk[i-8].Cli_num++; bu[i - 8].Text = fk[i - 8].Num.ToString(); } if (fk[i - 8].Num == 0 && bu[i - 8].BackColor != Color.White) { down0(i - 8); } } if (i < 72 && i % 9 != 0) { if (fk[i + 8].Num > 0) { fk[i+8].Cli_num++; bu[i + 8].Text = fk[i + 8].Num.ToString(); } if (fk[i + 8].Num == 0 && bu[i + 8].BackColor != Color.White) { down0(i + 8); } } if (i < 72 && i % 9 != 8) { if (fk[i + 10].Num > 0) { fk[i+10].Cli_num++; bu[i + 10].Text = fk[i + 10].Num.ToString(); } if (fk[i + 10].Num == 0 && bu[i + 10].BackColor != Color.White) { down0(i + 10); } } return 0; } //判断是否游戏成功 bool suc() { int k = 0; int j = 0; for (int i=0; i < 81; i++) { //所有的雷没有被左键单击过 if (fk[i].Cli_num == -1) { k++; } //所有不是雷的方块被单机过 if (fk[i].Cli_num > 0) { j++; } } //满足9个雷,72个不是雷 if (k == 9 && j == 72) { for (int i = 0; i < 81;i++) { //将所有有雷的格子自动标记 if (fk[i].Lei) { bu[i].Text = "旗旗"; } } return true; } return false; } }
结束!
欢迎关注我的微信个人订阅号
每天多学一点0.0
0 0
- C#扫雷(9*9阉割版)
- 扫雷(C#版)
- c#版扫雷网络版
- 扫雷算法(C#版)
- C#版扫雷游戏
- 阉割版和MVP
- C#控制台版扫雷游戏
- C# 扫雷
- c++阉割版binder实现
- 扫雷(java版)
- C#扫雷游戏-1(砖块部分)
- C#扫雷游戏-2(游戏部分)
- C#扫雷游戏-3(界面部分)
- POJ 2823 阉割版线段树
- 扫雷游戏(js版)
- 扫雷(通俗易懂简易版)
- 扫雷-----C#窗体
- C#小游戏之扫雷
- Codeforces Round #315 (Div. 2) C - Primes or Palindromes?(暴力打表)
- 纯js文件中向php传送json格式数据
- Identify的Mousedown事件冲突解决方法
- phonegap自定义插件实现
- Centos6.5下Hbase配置
- C#扫雷(9*9阉割版)
- Sky数
- C++ Primer Plus 第6版 中文版 第4章编程练习
- linux 打包某用户所有文件,到另一机器上新建同名用户并导入备份文件
- 碰撞体(Collider)以及触发器(Is Trigger)----碰撞的条件,触发碰撞器和触发器的条件
- HTML背景图的显示
- struts2的工作流程和运行原理
- Groovy SQL 分页组件
- POJ 2653 线段相交问题