程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 趣味編程:C#掃雷代碼

趣味編程:C#掃雷代碼

編輯:關於C語言

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.     } 

【編輯推薦】

  1. C#編程刪除系統自帶游戲
  2. 教你寫不可思議的C#代碼
  3. C#調試從入門到精通
  4. C#與.Net程序員面試寶典
  5. C#代碼規范 .Net程序員需要提升的修養
【責任編輯:鄭添龍 TEL:(010)68476606】
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved