首页 > 编程 > C# > 正文

C#版扫雷游戏源代码

2023-05-17 11:41:57
字体:
来源:转载
供稿:网友

很多人都喜欢Windows附带的扫雷游戏,从上学的学生到上班一族,都在玩扫雷游戏,现在在网上找到了C#版得扫雷游戏,放到下面供需要者参考。

  1.     using System;  
  2.     using System.Drawing;  
  3.     using System.Windows.Forms;  
  4.     namespace WindowsFormsApplication1  
  5.     {  
  6.     public partial class Frm1 : Form  
  7.     {  
  8.     #region 变量  
  9.     public int qishu;  
  10.     public static int ls=20, hs=11;  
  11.     public int lgs = 30; //列数,行数。  
  12.     public int bl=0; //是否重新布雷  
  13.     public int time ;  
  14.     public int[,] bulei = new int[ls, hs]; //bulei数组的值0代表无雷,1-8代表雷的个数,9代表雷  
  15.     public int ceshi = 0;  
  16.     public int[,] click = new int[ls, hs]; //10表示要清除既是单击的 11表示右击一次,12表示右击两次 16表示以清除过了  
  17.     public int sum = 0;  
  18.     public int timerEnable = 0; //游戏所处的状态 0是游戏中  
  19.     #endregion  
  20.     public Frm1()  
  21.     {  
  22.     InitializeComponent();  
  23.     }  
  24.     ///  
  25.     /// 标识雷的个数 和可插的旗数  
  26.     ///  
  27.     public void Qishu()  
  28.     {  
  29.     if (qishu <= lgs)  
  30.     {  
  31.     gamesource.Text = "00" + (lgs - qishu)。ToString();  
  32.     }  
  33.     else 
  34.     {  
  35.     gamesource.Text = "00" + (lgs - qishu)。ToString();  
  36.     }  
  37.     }  
  38.     ///  
  39.     /// 画方格  
  40.     ///  
  41.     /// <实例对象>  
  42.     /// <要画图的位置>  
  43.     /// <要画图的位置>  
  44.     /// <画图使用的颜色>  
  45.     public void Dline(Graphics dline,int mx1,int my1,Pen mypen)  
  46.     {  
  47.     dline.DrawLine(mypen , mx1, my1, mx1 + 20, my1);  
  48.     dline.DrawLine(mypen, mx1, my1, mx1, my1 + 20);  
  49.     dline.DrawLine(new Pen(Color.Black), mx1 + 20, my1, mx1 + 20, my1 + 20);  
  50.     dline.DrawLine(new Pen(Color.Black), mx1, my1 + 20, mx1 + 20, my1 + 20);  
  51.     }  
  52.     ///  
  53.     /// 看是否可以向周围移动  
  54.     ///  
  55.     /// <移动的基本X坐标>  
  56.     /// <移动的基本Y坐标>  
  57.     public void Panjie(int x,int y)  
  58.     {  
  59.     Pl(x, y);  
  60.     if (y - 1 >= 0)  
  61.     {  
  62.     Pl(x,y-1);  
  63.     if (x - 1 >= 0)  
  64.     {  
  65.     Pl(x-1,y-1);  
  66.     }  
  67.     if (x + 1  
  68.     {  
  69.     Pl(x + 1, y - 1);  
  70.     }  
  71.     }  
  72.     if (y + 1 < hs)  
  73.     {  
  74.     Pl(x,y+1);  
  75.     if (x - 1 >= 0)  
  76.     {  
  77.     Pl(x - 1, y + 1);  
  78.     }  
  79.     if (x + 1 < ls)  
  80.     {  
  81.     Pl(x + 1, y +1);  
  82.     }  
  83.     }  
  84.     if (x - 1 >= 0)  
  85.     {  
  86.     Pl(x - 1 ,y);  
  87.     }  
  88.     if (x + 1 < ls)  
  89.     {  
  90.     Pl(x + 1,y);  
  91.     }  
  92.     }  
  93.     ///  
  94.     /// 判断是否要清清除  
  95.     ///  
  96.     /// <要判断的基本X坐标>  
  97.     /// <要判断的基本Y坐标>  
  98.     public void Pl(int x, int y)  
  99.     {  
  100.     if (bulei[x, y] == 0 && click[x, y] != 10 && click[x, y] != 11 && click[x, y] != 16)  
  101.     {  
  102.     click[x, y] = 10;  
  103.     Panjie(x,y);  
  104.     }  
  105.     if (bulei[x, y] > 0 && bulei[x, y] < 9 && click[x, y] != 10 && click[x, y] != 11 && click[x, y] != 16)  
  106.     {  
  107.     click[x, y] = 10;  
  108.     }  
  109.     }  
  110.     ///  
  111.     /// 初始化数组,布雷,判断周围的雷数  
  112.     ///  
  113.     public void Blpl()  
  114.     {  
  115.     sum = ls * hs;  
  116.     qishu = 0;  
  117.     int mx,my;  
  118.     //初始化数组 9表示雷数  
  119.     int mx1,my1;  
  120.     int sum1=0;  
  121.     for (mx = 0; mx < ls; mx++)  
  122.     {  
  123.     for (my = 0; my  
  124.     {  
  125.     bulei[mx, my] = 0;  
  126.     click[mx, my] = 0;  
  127.     }  
  128.     }  
  129.     while(sum1  
  130.     //决定雷的个数和雷德位置  
  131.     {  
  132.     sum1= 0;  
  133.     Random r = new Random((int)DateTime.Now.Ticks);  
  134.     mx = r.Next(ls-1);  
  135.     my = r.Next(hs-1);  
  136.     bulei[mx,my] = 9;  
  137.     for (mx1 = 0; mx1 < ls; mx1++)  
  138.     {  
  139.     for (my1 = 0; my1 < hs; my1++)  
  140.     {  
  141.     sum1 += bulei[mx1, my1];  
  142.     }  
  143.     }  
  144.     }  
  145.     //判断周围雷的个数  
  146.     for (mx = 0; mx < ls; mx++)  
  147.     {  
  148.     for (my = 0; my < hs; my++)  
  149.     {  
  150.     if (bulei[mx,my] != 9)  
  151.     {  
  152.     if (mx - 1 >= 0)  
  153.     {  
  154.     if (bulei[mx - 1, my] == 9)  
  155.     {  
  156.     bulei[mx, my]++;  
  157.     }  
  158.     if (my - 1 >= 0 && bulei[mx - 1, my - 1] == 9)  
  159.     {  
  160.     bulei[mx, my]++;  
  161.     }  
  162.     if ( my + 1 < hs && bulei[mx - 1, my + 1] == 9)  
  163.     {  
  164.     bulei[mx , my]++;  
  165.     }  
  166.     }  
  167.     if (mx +1  
  168.     {  
  169.     if (bulei[mx + 1, my] == 9)  
  170.     {  
  171.     bulei[mx, my]++;  
  172.     }  
  173.     if (my- 1 >= 0 && bulei[mx+ 1, my - 1] == 9)  
  174.     {  
  175.     bulei[mx, my]++;  
  176.     }  
  177.     if (my + 1 < hs && bulei[mx + 1, my + 1] == 9)  
  178.     {  
  179.     bulei[mx, my]++;  
  180.     }  
  181.     }  
  182.     if(my-1>=0 && bulei[mx,my-1]==9)  
  183.     {  
  184.     bulei[mx, my]++;  
  185.     }  
  186.     if (my +1  
  187.     {  
  188.     bulei[mx, my]++;  
  189.     }  
  190.     }  
  191.     }  
  192.     }  
  193.     }  
  194.     ///  
  195.     /// 右击的重绘  
  196.     ///  
  197.     /// >  
  198.     public void Rdraw(Graphics dline)  
  199.     {  
  200.     string text;  
  201.     int mx,my;  
  202.     int mx1, my1;  
  203.     for (mx = 0;mx < ls; mx++)  
  204.     {  
  205.     for (my = 0; my < hs; my++)  
  206.     {  
  207.     mx1 = mx * 2 + mx * 20 + 4;  
  208.     my1 = my * 2 + my * 20 + 4;  
  209.     if ( click[mx, my] == 11)  
  210.     {  
  211.     //第一次右击画旗  
  212.     dline.DrawLine(new Pen(Color.White), mx1, my1, mx1 + 20, my1 + 20);  
  213.     dline.DrawLine(new Pen(Color.White), mx1, my1, mx1, my1 + 20);  
  214.     dline.DrawLine(new Pen(Color.Black), mx1 + 20, my1, mx1 + 20, my1 + 20);  
  215.     dline.DrawLine(new Pen(Color.Black), mx1, my1 + 20, mx1 + 20, my1 + 20);  
  216.     dline.FillRectangle(new SolidBrush(Color.FromArgb(224, 224, 224)), mx1 + 1, my1 + 1, 18, 18);  
  217.     text = "P";  
  218.     dline.DrawString(text, new Font("宋体", 15), new SolidBrush(Color.Red), mx1 + 2, my1 + 2);  
  219.     }  
  220.     if ( click[mx, my] == 12)  
  221.     {  
  222.     //第二次右击画问号  
  223.     dline.DrawLine(new Pen(Color.White), mx1, my1, mx1 + 20, my1 + 20);  
  224.     dline.DrawLine(new Pen(Color.White), mx1, my1, mx1, my1 + 20);  
  225.     dline.DrawLine(new Pen(Color.Black), mx1 + 20, my1, mx1 + 20, my1 + 20);  
  226.     dline.DrawLine(new Pen(Color.Black), mx1, my1 + 20, mx1 + 20, my1 + 20);  
  227.     dline.FillRectangle(new SolidBrush(Color.FromArgb(224, 224, 224)), mx1 + 1, my1 + 1, 18, 18);  
  228.     text = "?";  
  229.     dline.DrawString(text, new Font("宋体", 15), new SolidBrush(Color.Black), mx1 + 2, my1 + 2);  
  230.     }  
  231.     if (click[mx, my] == 13)  
  232.     {  
  233.     //第三次右击 恢复原样  
  234.     click[mx, my] = 2;  
  235.     dline.DrawLine(new Pen(Color.White), mx1, my1, mx1 + 20, my1 + 20);  
  236.     dline.DrawLine(new Pen(Color.White), mx1, my1, mx1, my1 + 20);  
  237.     dline.DrawLine(new Pen(Color.Black), mx1 + 20, my1, mx1 + 20, my1 + 20);  
  238.     dline.DrawLine(new Pen(Color.Black), mx1, my1 + 20, mx1 + 20, my1 + 20);  
  239.     dline.FillRectangle(new SolidBrush(Color.FromArgb(224, 224, 224)), mx1 + 1, my1 + 1, 18, 18);  
  240.     }  
  241.     }  
  242.     }  
  243.     }  
  244.     ///  
  245.     /// 初始化屏幕 (包还所有的)  
  246.     ///  
  247.     public void Startscr()  
  248.     {  
  249.     Graphics dline = labdraw.CreateGraphics();  
  250.     time = 0;  
  251.     Blpl();  
  252.     timer1.Enabled = false;  
  253.     Color c = Color.FromArgb(224, 224, 224);  
  254.     labdraw.CreateGraphics()。Clear(c);  
  255.     Drawscreen(dline);  
  256.     timerEnable = 0;  
  257.     labtime.Text = ("000");  
  258.     }  
  259.     ///  
  260.     /// 画界面  
  261.     ///  
  262.     /// >  
  263.     public void Drawscreen(Graphics dline)  
  264.     {  
  265.     sum = 0; //得到没清楚的格子数  
  266.     int mx, my;  
  267.     int mx1 = 0, my1 = 0; //得到要画图的坐标  
  268.     string text;  
  269.     for (mx = 0; mx < ls; mx++)  
  270.     {  
  271.     for (my = 0; my < hs; my++)  
  272.     {  
  273.     //画图地位置 mx,my分别是屏幕x,y轴  
  274.     mx1 = mx * 2 + mx * 20 + 4;  
  275.     my1 = my * 2 + my * 20 + 4;  
  276.     if (click[mx, my] != 10 && click[mx, my] != 12 && click[mx, my] != 16 && click[mx, my] != 15)  
  277.     {  
  278.     //下面用于画立体形矩形;  
  279.     sum++;  
  280.     Pen mypen = new Pen(Color.Gray);  
  281.     Dline(dline, mx1, my1, mypen);  
  282.     dline.FillRectangle(new SolidBrush(Color.FromArgb(224, 224, 224)), mx1 + 1, my1 + 1, 18, 18);  
  283.     }  
  284.     if ((click[mx, my] == 10 || click[mx, my] == 16))  
  285.     {  
  286.     click[mx, my] = 16; //清除的格子  
  287.     //提示周围的雷数  
  288.     if (bulei[mx, my] <= 8 && bulei[mx, my] > 0)  
  289.     {  
  290.     text = bulei[mx, my].ToString();  
  291.     dline.DrawString(text, new Font("宋体", 15), new SolidBrush(Color.Black), mx1 + 2, my1 + 2);  
  292.     }  
  293.     //显示雷  
  294.     if ((bulei[mx, my] == 9 || bulei[mx, my] == 100))  
  295.     {  
  296.     text = "*";  
  297.     dline.DrawString(text, new Font("宋体", 15), new SolidBrush(Color.Black), mx1 + 2, my1 + 2);  
  298.     if (bulei[mx, my] == 100)  
  299.     {  
  300.     //被单击的雷上画上叉号  
  301.     dline.DrawLine(new Pen(Color.Red), mx1, my1, mx1 + 20, my1 + 20);  
  302.     dline.DrawLine(new Pen(Color.Red), mx1, my1 + 20, mx1 + 20, my1);  
  303.     }  
  304.     }  
  305.     }  
  306.     }  
  307.     //用于画旗 和问号  
  308.     Rdraw(dline);  
  309.     }  
  310.     }  
  311.     ///  
  312.     /// 当为雷时的算法  
  313.     ///  
  314.     /// >  
  315.     /// >  
  316.     public void Panlei(int x, int y)  
  317.     {  
  318.     if (bulei[x, y] != 0)  
  319.     {  
  320.     if (bulei[x, y] == 9)  
  321.     {  
  322.     timer1.Enabled = false//使计时器停止  
  323.     timerEnable = 1; //使游戏出游结束状态  
  324.     bulei[x, y] = 100;  
  325.     int i, j;  
  326.     for (i = 0; i < ls; i++)  
  327.     {  
  328.     for (j = 0; j < hs; j++)  
  329.     {  
  330.     if (bulei[i, j] == 9 || bulei[i, j] ==100)  
  331.     {  
  332.     click[i, j] = 10; //显示所有的雷  
  333.     }  
  334.     }  
  335.     }  
  336.     }  
  337.     if (bulei[x, y] > 0 && bulei[x, y] < 9)  
  338.     {  
  339.     click[x, y] = 10;  
  340.     }  
  341.     }  
  342.     else 
  343.     {  
  344.     Panjie(x, y);  
  345.     }  
  346.     }  
  347.     ///  
  348.     /// 回到游戏开始的界面  
  349.     ///  
  350.     ///  
  351.     ///  
  352.     private void btnreplay_Click(object sender, EventArgs e)  
  353.     {  
  354.     //初始化一切 包括布雷 ,界面, click数组  
  355.     Startscr();  
  356.     }  
  357.     ///  
  358.     /// 计算游戏所用的时间  
  359.     ///  
  360.     ///  
  361.     ///  
  362.     private void timer1_Tick(object sender, EventArgs e)  
  363.     {  
  364.     time++;  
  365.     if (time <= 99)  
  366.     {  
  367.     if (time < 10)  
  368.     {  
  369.     labtime.Text = ("00" + time.ToString());  
  370.     }  
  371.     else 
  372.     {  
  373.     labtime.Text = ("0" + time.ToString());  
  374.     }  
  375.     }  
  376.     else 
  377.     {  
  378.     if (time < 99)  
  379.     {  
  380.     labtime.Text = (time.ToString());  
  381.     }  
  382.     else 
  383.     {  
  384.     timer1.Enabled = false;  
  385.     MessageBox.Show("RIME OVER ");  
  386.     time = 0;  
  387.     timerEnable = 1;  
  388.     }  
  389.     }  
  390.     }  
  391.     ///  
  392.     /// 在启动的游戏时初始化界面  
  393.     ///  
  394.     ///  
  395.     ///  
  396.     private void labdraw_Paint(object sender, PaintEventArgs e)  
  397.     {  
  398.     Graphics dline = e.Graphics;  
  399.     if (bl == 0)  
  400.     {  
  401.     Blpl();  
  402.     Drawscreen(dline);  
  403.     }  
  404.     else 
  405.     {  
  406.     Drawscreen(dline);  
  407.     }  
  408.     }  
  409.     ///  
  410.     /// //单击时触发的事件  
  411.     ///  
  412.     ///  
  413.     ///  
  414.     private void labdraw_MouseClick(object sender, MouseEventArgs e)  
  415.     {  
  416.     bl = 10;  
  417.     int i=0, j=0;  
  418.     if (timerEnable == 0) //判断游戏是否处于结束状态  
  419.     {  
  420.     timer1.Enabled = true;  
  421.     Graphics dline = labdraw.CreateGraphics(); //将LAB1建立成图形对象  
  422.     int mx = 0, my = 0;  
  423.     int mx2 = 0, my2 = 0;  
  424.     int mx3 = 0, my3 = 0;  
  425.     //判断鼠标所点位置  
  426.     mx2 = e.X;  
  427.     my2 = e.Y;  
  428.     for (i = 0; i < ls; i++)  
  429.     {  
  430.     for (j = 0; j < hs; j++)  
  431.     {  
  432.     mx = 4 + i * 2 + i * 20;  
  433.     my = 4 + j * 2 + j * 20;  
  434.     //找到单击位置代表的数组  
  435.     if (mx < mx2 && mx + 20+4 > mx2 && my < my2 && my2 < my + 20+4 )  
  436.     {  
  437.     mx3 = i;  
  438.     my3 = j;  
  439.     break;  
  440.     }  
  441.     }  
  442.     if (j < 9)  
  443.     {  
  444.     break;  
  445.     }  
  446.     }  
  447.     //判断是左击还是右击  
  448.     if (e.Button == MouseButtons.Right && click[mx3, my3] != 10 && mx3 >= 0 && my3 >= 0 && click[mx3, my3] != 16)  
  449.     {  
  450.     //第2次右击  
  451.     if (click[mx3, my3] == 11 && click[mx3, my3] != 10)  
  452.     {  
  453.     click[mx3, my3] = 12;  
  454.     --qishu;  
  455.     }  
  456.     else 
  457.     {  
  458.     //第1次右击  
  459.     if (click[mx3, my3] != 12 && click[mx3, my3] != 10)  
  460.     {  
  461.     if (qishu  
  462.     {  
  463.     click[mx3, my3] = 11;  
  464.     qishu++;  
  465.     }  
  466.     }  
  467.     if (click[mx3, my3] == 12 && click[mx3, my3] != 10)  
  468.     {  
  469.     click[mx3, my3] = 13;  
  470.     }  
  471.     }  
  472.     //右击的绘图事件  
  473.     Rdraw(dline);  
  474.     Qishu();  
  475.     }  
  476.     else 
  477.     {  
  478.     //左击  
  479.     if (click[mx3, my3] != 11 && click[mx3, my3] != 16)  
  480.     {  
  481.     click[mx3, my3] = 15;  
  482.     Color c = Color.FromArgb(224, 224, 224);  
  483.     //清屏 用背景颜色  
  484.     labdraw.CreateGraphics()。Clear(c);  
  485.     Panlei (mx3, my3);  
  486.     Drawscreen(dline);  
  487.     }  
  488.     if (bulei[mx3, my3] == 100)  
  489.     {  
  490.     MessageBox.Show("GAME OVER");  
  491.     timer1.Enabled = false;  
  492.     timerEnable = 1;  
  493.     }  
  494.     }  
  495.     if (sum == lgs)  
  496.     {  
  497.     MessageBox.Show("GAME WIN");  
  498.     timer1.Enabled = false;  
  499.     timerEnable = 1;  
  500.     }  
  501.     }  
  502.     }  
  503.     private void Frm1_Load(object sender, EventArgs e)  
  504.     {  
  505.     Qishu(); //输出雷的个数  
  506.     // this.Height = hs * 22 + 20;  
  507.     // this.Width = ls * 22 + 8;  
  508.     }  
  509.     }  
  510.     }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表