Advertisement
zhangsongcui

Mine

Dec 15th, 2011
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.96 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Drawing;
  5. using System.Windows.Forms;
  6.  
  7. namespace Mine
  8. {
  9.     static class Program
  10.     {
  11.         [STAThread]
  12.         static void Main()
  13.         {
  14.             Application.EnableVisualStyles();
  15.             Application.SetCompatibleTextRenderingDefault(false);
  16.             Application.Run(new MainForm(10, 10, 10));
  17.         }
  18.     }
  19.  
  20.     class MineField : CheckBox
  21.     {
  22.         bool isMile;
  23.  
  24.         public MineField()
  25.         {
  26.             this.Appearance = Appearance.Button;
  27.             this.Width = this.Height;
  28.             this.TextAlign = ContentAlignment.MiddleCenter;
  29.         }
  30.  
  31.         public static void SetMines(MineField[,] MineFields, int MineCount)
  32.         {
  33.             Random rand = new Random();
  34.             var Temp = new List<int>(Enumerable.Range(0, MineFields.Length));
  35.             for (int i = Temp.Count - 1; i > 0; --i)
  36.             {
  37.                 int t = Temp[i], n = rand.Next(i + 1);
  38.                 Temp[i] = Temp[n];
  39.                 Temp[n] = t;
  40.             }
  41.             Temp.RemoveRange(MineCount, MineFields.Length - MineCount);
  42.             foreach (int n in Temp)
  43.                 MineFields[n / MineFields.GetLength(1), n % MineFields.GetLength(1)].isMile = true;
  44.         }
  45.  
  46.         static bool isVaild(int row, int col, MineField[,] MineFields)
  47.         {
  48.             return col >= 0 && col < MineFields.GetLength(1)
  49.                 && row >= 0 && row < MineFields.GetLength(0);
  50.         }
  51.  
  52.         IEnumerable<MineField> MineFieldsRound()
  53.         {
  54.             int rowNow = this.Top / 30, colNow = this.Left / 30;
  55.             MainForm frmMain = (MainForm)this.FindForm();
  56.             if (isVaild(rowNow - 1, colNow - 1, frmMain.MineFields)) yield return frmMain.MineFields[rowNow - 1, colNow - 1];
  57.             if (isVaild(rowNow - 1, colNow    , frmMain.MineFields)) yield return frmMain.MineFields[rowNow - 1, colNow    ];
  58.             if (isVaild(rowNow - 1, colNow + 1, frmMain.MineFields)) yield return frmMain.MineFields[rowNow - 1, colNow + 1];
  59.             if (isVaild(rowNow    , colNow - 1, frmMain.MineFields)) yield return frmMain.MineFields[rowNow    , colNow - 1];
  60.             if (isVaild(rowNow    , colNow + 1, frmMain.MineFields)) yield return frmMain.MineFields[rowNow    , colNow + 1];
  61.             if (isVaild(rowNow + 1, colNow - 1, frmMain.MineFields)) yield return frmMain.MineFields[rowNow + 1, colNow - 1];
  62.             if (isVaild(rowNow + 1, colNow    , frmMain.MineFields)) yield return frmMain.MineFields[rowNow + 1, colNow    ];
  63.             if (isVaild(rowNow + 1, colNow + 1, frmMain.MineFields)) yield return frmMain.MineFields[rowNow + 1, colNow + 1];
  64.             yield break;
  65.         }
  66.  
  67.         protected override void OnClick(EventArgs e)
  68.         {
  69.             if (this.Checked)
  70.                 return;
  71.             MainForm frmMain = (MainForm)this.FindForm();
  72.             if (isMile)
  73.                 frmMain.Text = "扫雷:游戏结束,你输了";
  74.             else
  75.             {
  76.                 this.Checked = true;
  77.                 int MineCount = 0;
  78.                 foreach (MineField field in this.MineFieldsRound())
  79.                     MineCount += field.isMile ? 1 : 0;
  80.                 if (MineCount != 0)
  81.                 {
  82.                     this.Text = MineCount.ToString();
  83.                     int count = 0;
  84.                     foreach (MineField field in frmMain.MineFields)
  85.                         count += field.Checked ? 0 : 1;
  86.                     if (count == 10)
  87.                     {
  88.                         frmMain.Text = "扫雷:游戏结束,你赢了";
  89.                         return;
  90.                     }
  91.                 }
  92.                 else
  93.                 {
  94.                     foreach (MineField field in this.MineFieldsRound())
  95.                         field.OnClick(e);
  96.                 }
  97.             }
  98.         }
  99.     }
  100.  
  101.     class MainForm : Form
  102.     {
  103.         public MineField[,] MineFields { get; private set; }
  104.  
  105.         public MainForm(int RowCount, int ColCount, int MineCount)
  106.         {
  107.             TableLayoutPanel layout = new TableLayoutPanel();
  108.             MineFields = new MineField[RowCount, ColCount];
  109.             layout.RowCount = RowCount;
  110.             layout.ColumnCount = ColCount;
  111.             for (int row = 0; row != RowCount; ++row)
  112.             {
  113.                 for (int col = 0; col != ColCount; ++col)
  114.                 {
  115.                     MineField btn = new MineField();
  116.                     layout.Controls.Add(btn);
  117.                     MineFields[row, col] = btn;
  118.                 }
  119.             }
  120.             MineField.SetMines(MineFields, MineCount);
  121.             layout.Dock = DockStyle.Fill;
  122.             layout.AutoSize = true;
  123.             this.Controls.Add(layout);
  124.             this.Text = "扫雷";
  125.             this.MaximizeBox = false;
  126.             this.AutoSizeMode = AutoSizeMode.GrowAndShrink;
  127.             this.AutoSize = true;
  128.         }
  129.     }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement