zoukankan      html  css  js  c++  java
  • C# 实现扫雷

    这次写的是小游戏扫雷,由于时间问题,扫雷的成功失败判断还没有写的很好,只是把大体的思路写出来了。

    这次最主要的是有两个类

    第一个是地雷类 :lanmine

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Drawing;
     4 using System.Linq;
     5 using System.Text;
     6 using System.Threading.Tasks;
     7 using System.Windows.Forms;
     8 using 扫雷.Properties;
     9 
    10 namespace 扫雷
    11 {
    12     class landmine
    13     {
    14 
    15         #region 地雷属性
    16         //创建button按钮作为地雷
    17         public Button btnLandmine { get; set; }
    18         //地雷的位置
    19         public int X { get; set; }
    20         public int Y { get; set; }
    21         //地雷的大小
    22         public int width { get; set; }
    23         public int height { get; set; }
    24         //按钮状态
    25         public bool isClick { get; set; }
    26         //按钮分数
    27         public int number { get; set; }
    28         //是否为地雷
    29         public bool isLandmine { get; set; } 
    30         #endregion
    31        
    32         #region 构造函数
    33         public landmine(Button btnLandmine, int width, int height, int x, int y, bool isClick, int number, bool isLandmine)
    34         {
    35             this.btnLandmine = btnLandmine;
    36             this.X = x;
    37             this.Y = y;
    38             this.width = width;
    39             this.height = height;
    40             this.isClick = isClick;
    41             this.number = number;
    42             this.isLandmine = isLandmine;
    43         } 
    44         #endregion
    45         
    46         #region 控件添加函数
    47         public void addLandmine(Control control)
    48         {
    49             //初始化按钮属性
    50             this.btnLandmine.Text = "";
    51             this.btnLandmine.Font = new Font("宋体",15,FontStyle.Bold);
    52             this.btnLandmine.Location = new Point(this.X+10, this.Y);
    53             this.btnLandmine.Size = new Size(this.width, this.height);
    54             //给按钮添加点击事件
    55             this.btnLandmine.MouseDown += btnLandmine_MouseDown;
    56             //将控件添加到父控件上(父控件为函数参数传入)
    57             this.btnLandmine.Parent = control;
    58         } 
    59         #endregion
    60        
    61         #region 鼠标点击事件
    62         void btnLandmine_MouseDown(object sender, MouseEventArgs e)
    63         {
    64             //当鼠标左击
    65             if (e.Button == MouseButtons.Left)
    66             {
    67                 //如果是地雷
    68                 if (this.isLandmine)
    69                 {
    70                     this.btnLandmine.BackgroundImage = Resources.bomb;
    71                     MessageBox.Show("踩雷了");
    72                 }
    73                 if (!this.isLandmine)
    74                 {
    75                     this.btnLandmine.Text = this.number.ToString();
    76                     this.btnLandmine.Enabled = false;
    77                 }
    78             }
    79             //鼠标右击
    80             else if (e.Button == MouseButtons.Right)
    81             {
    82                 Image flag = Resources.flag;
    83                 if (this.btnLandmine.BackgroundImage != null)
    84                 {
    85                     this.btnLandmine.BackgroundImage = null;
    86                 }
    87                 else
    88                 {
    89                     this.btnLandmine.BackgroundImage = flag;
    90                 }
    91 
    92             }
    93         } 
    94         #endregion
    95         
    96 
    97     }
    98 }
    View Code

     第二个是地雷集合类:lanmineList

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Drawing;
      4 using System.Linq;
      5 using System.Text;
      6 using System.Threading.Tasks;
      7 using System.Windows.Forms;
      8 using 扫雷.Properties;
      9 
     10 namespace 扫雷
     11 {
     12     class landmineList
     13     {
     14         //创建地雷数组
     15         public landmine[,] landmineArr;        
     16                
     17         //初始化地雷数组
     18         #region 初始化地雷数组
     19         public void landmineArrSet()
     20         {
     21             this.landmineArr = new landmine[10, 10];
     22             for (int i = 0; i < 10; i++)
     23             {
     24                 for (int j = 0; j < 10; j++)
     25                 {
     26                     landmine item = new landmine(new Button(),30,30,i*35,j*35,false,0,false);
     27                     this.landmineArr[i, j] = item;                       
     28                 }
     29             }
     30         } 
     31         #endregion
     32 
     33         //添加地雷数组到父控件
     34         #region 将地雷数组添加到父控件
     35         public void addControl(Control control)
     36         {
     37             for (int i = 0; i < 10; i++)
     38             {
     39                 for (int j = 0; j < 10; j++)
     40                 {
     41                     this.landmineArr[i, j].addLandmine(control);
     42                 }
     43             }
     44         } 
     45         #endregion
     46 
     47         //地雷生成存储
     48         public List<randomList> landmineNumber { get; set; }
     49 
     50         //随机产生地雷函数
     51         #region 随机产生地雷函数
     52         public List<randomList> randomLandmine(int number)
     53         {
     54             List<randomList> result = new List<randomList>();
     55             Random r = new Random();
     56             for (int i = 0; i < number; i++)
     57             {
     58                 randomList item = new randomList();
     59                 item.i = r.Next(0, 9);
     60                 item.j = r.Next(0, 9);
     61                 result.Add(item);
     62             }
     63             return result;
     64         }
     65 
     66         #endregion
     67 
     68         //将地雷的周围控件的number值加1
     69         #region 将地雷控件周围的number值加1
     70         public void numberAdd()
     71         {
     72             foreach (randomList item in this.landmineNumber)
     73             {
     74                 landmineArr[item.i, item.j].isLandmine = true;
     75                 //左上角                        
     76                 if (item.i - 1 >= 0 && item.j - 1 >= 0)
     77                 {
     78                     landmineArr[item.i-1, item.j-1].number++;
     79                 }
     80                 //中上位置
     81                 if (item.i - 1 >= 0)
     82                 {
     83                     landmineArr[item.i - 1, item.j].number++;
     84                 }
     85                 //右上角
     86                 if (item.i - 1 >= 0 && item.j + 1 < 10)
     87                 {
     88                     landmineArr[item.i - 1, item.j + 1].number++;
     89                 }
     90                 //左中位置
     91                 if (item.j - 1 >= 0)
     92                 {
     93                     this.landmineArr[item.i, item.j - 1].number++;
     94                 }
     95                 //右中位置
     96                 if (item.j + 1 < 10)
     97                 {
     98                     landmineArr[item.i, item.j + 1].number++;
     99                 }
    100                 //左下角
    101                 if (item.i + 1 < 10 && item.j - 1 >= 0)
    102                 {
    103                     landmineArr[item.i + 1, item.j - 1].number++;
    104                 }
    105                 //中下位置
    106                 if (item.i + 1 < 10)
    107                 {
    108                     landmineArr[item.i + 1, item.j].number++;
    109                 }
    110                 //右下位置
    111                 if (item.i + 1 < 10 && item.j + 1 < 10)
    112                 {
    113                     landmineArr[item.i + 1, item.j + 1].number++;
    114                 }
    115             }
    116         }
    117 
    118         #endregion
    119 
    120         //判断红旗是否全部插在地雷上
    121         #region 判断红旗是否全部插在地雷上
    122         public bool insterFlag()
    123         {
    124             foreach (randomList item in this.landmineNumber)
    125             {
    126                 if (this.landmineArr[item.i, item.j].btnLandmine.BackgroundImage != Resources.flag)
    127                 {
    128                     return false;
    129                 }
    130             }
    131             return true;
    132         } 
    133         #endregion        
    134     }
    135 
    136 }
    View Code

    第三是from窗体:from1

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Threading.Tasks;
     9 using System.Windows.Forms;
    10 using 扫雷;
    11 
    12 namespace 扫雷
    13 {
    14     public partial class Form1 : Form
    15     {
    16         public Form1()
    17         {
    18             InitializeComponent();
    19         }
    20 
    21 
    22         landmineList landmine = new landmineList(); 
    23         private void Form1_Load(object sender, EventArgs e)
    24         {
    25             Control control=this.panel1;          
    26             landmine.landmineArrSet();
    27             landmine.landmineNumber = landmine.randomLandmine(10);
    28             landmine.numberAdd();
    29             landmine.addControl(control);
    30         }
    31 
    32         private void panel1_Paint(object sender, PaintEventArgs e)
    33         {
    34 
    35         }
    36 
    37         private void timer1_Tick(object sender, EventArgs e)
    38         {
    39             if (landmine.insterFlag())
    40             {
    41                 MessageBox.Show("通过");
    42                 this.timer1.Enabled = false;
    43             }
    44         }
    45     }
    46 }
    View Code

    第四是随机数类:randomList

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace 扫雷
     8 {
     9     class randomList
    10     {
    11         //随机 i值
    12         public int i { get; set; }
    13         //随机 j值
    14         public int j { get; set; }
    15     }
    16 }
    View Code

    最主要的思路是

    1.地雷类中有number属性,在地雷集合类中,如果有一个地雷,那么地雷周围的lanmine的number属性值加1,这样就可以实现地图的布置

    2.判断扫雷的输赢方法是看是否所有的地雷都插上红旗,或者所有不是地雷的方块都被左键单击。如果地雷被左击,那么久结束游戏。

  • 相关阅读:
    c# Linq及Lamda表达式应用经验之 GroupBy 分组
    页面加载完之后在执行js代码
    C#循环声明一个类
    通过文件流stream下载文件
    jquery validate如何不提交表单就做验证(ajax提交数据)
    用vs2012的命令利用xsd文件生成对应的C#类,把xml的string类型映射到生成的类
    用xsd验证xml
    MVC中如何跳过对模型中某个属性的验证
    用list<类>集合接收一个网址返回的一个类的集合的XML
    Mac 查看Volumes
  • 原文地址:https://www.cnblogs.com/niaofei123/p/13765599.html
Copyright © 2011-2022 走看看