C#扫雷游戏-2(游戏部分)

来源:互联网 发布:福建师范大学网络 编辑:程序博客网 时间:2024/05/22 04:52

游戏部分包含:
1)砖块集合,这里我们用二维数组替代
2)砖块的行数和列数
3)地雷数
4)地雷位置
5)根据游戏的级别设置砖块行数和地雷数
6)创建随机地雷
7)标识有地雷的砖块
8)计算砖块周围的雷数
基本上是这些内容,下面我们就一项项讲解

1)砖块集合,这里我们用二维数组替代
2)砖块的行数和列数
3)地雷数
4)地雷位置
这些都是属性,重点讲解方法内容
5)根据游戏的级别设置砖块行数和地雷数
这里我们使用属性来设置,首先了解属性的作用:对字段的封装,通过属性的get和set可以对字段进行约束。
//设置级别
private void SetLevel(int level) {
 switch(level) {
  case 1:
   rows = 9;
   cols = 9;
   mineCount = 10;
   break;
  case 2:
   rows = 16;
   cols = 16;
   mineCount = 40;
   break;
  case 3:
   rows = 16;
   cols = 30;
   mineCount = 99;
   break;
 }
}

6)创建随机地雷
很容易,不详述

7)标识有地雷的砖块
根据地雷的位置来标识地雷处在哪个砖块中

8)计算砖块周围的雷数
这个方法放在这里不符合逻辑,但是问题是砖块的设计我们采用了自定义控件,砖块和砖块是没有联系的,某一砖块并不知道周围砖块情况。怎么办呢?我们在只能在游戏加载时,先把每个砖块周围的情况都设置到砖块属性中。

Code:
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. using System.Windows.Forms;   
  5. using System.Drawing;   
  6.   
  7. namespace MineSweeper {   
  8.     class Game {   
  9.   
  10.         public static Brick[,] Bricks;   
  11.         Control ctrl;   
  12.         int rows;   
  13.         int cols;   
  14.         int mineCount;   
  15.         int[] mines;   
  16.         Random random = new Random();  
  17.  
  18.         #region 初始化   
  19.         /// <summary>   
  20.         /// 初始化   
  21.         /// </summary>   
  22.         /// <param name="level"></param>   
  23.         public void Init(Control ctrl, int level) {   
  24.             this.ctrl = ctrl;   
  25.             SetLevel(level);   
  26.             CreateMines();   
  27.             CreateBricks();   
  28.         }   
  29.   
  30.         //设置级别   
  31.         private void SetLevel(int level) {   
  32.             switch(level) {   
  33.                 case 1:   
  34.                     rows = 9;   
  35.                     cols = 9;   
  36.                     mineCount = 10;   
  37.                     break;   
  38.                 case 2:   
  39.                     rows = 16;   
  40.                     cols = 16;   
  41.                     mineCount = 40;   
  42.                     break;   
  43.                 case 3:   
  44.                     rows = 16;   
  45.                     cols = 30;   
  46.                     mineCount = 99;   
  47.                     break;   
  48.             }   
  49.         }   
  50.         //创建随机地雷   
  51.         private void CreateMines() {   
  52.             mines = new int[mineCount];   
  53.             int count = 0;   
  54.             while(count < mineCount) {   
  55.                 int rand = random.Next(rows * cols);   
  56.                 //判断是否重复   
  57.                 bool isRepeat = false;   
  58.                 foreach(int mIndex in mines) {   
  59.                     if(mIndex == rand) {   
  60.                         isRepeat = true;   
  61.                         break;   
  62.                     }   
  63.                 }   
  64.                 if(!isRepeat) {   
  65.                     mines[count++] = rand;   
  66.                 }   
  67.             }   
  68.         }   
  69.         //创建砖块   
  70.         private void CreateBricks() {   
  71.             Bricks = new Brick[rows, cols];   
  72.   
  73.             ctrl.Controls.Clear();   
  74.   
  75.             for(int i = 0; i < rows; i++) {   
  76.                 for(int j = 0; j < cols; j++) {   
  77.                     Brick brick = new Brick();   
  78.                     brick.X = i;   
  79.                     brick.Y = j;   
  80.                     brick.Left = j * brick.Width;   
  81.                     brick.Top = i * brick.Height;   
  82.   
  83.                     Bricks[i, j] = brick;   
  84.   
  85.                     ctrl.Controls.Add(brick);   
  86.                 }   
  87.             }   
  88.             //标识有地雷的砖块   
  89.             foreach(int mIndex in mines) {   
  90.                 int x = mIndex / cols;   
  91.                 int y = mIndex % cols;   
  92.                 Console.Write("({0},{1})", x, y);   
  93.                 Bricks[x, y].IsMine = true;   
  94.             }   
  95.             Console.WriteLine();   
  96.   
  97.             for(int i = 0; i < rows; i++) {   
  98.                 for(int j = 0; j < cols; j++) {   
  99.                     GetArroundMineCount(i, j);   
  100.                 }   
  101.             }   
  102.   
  103.             ctrl.Parent.Width = Bricks[0, 0].Width * cols + 8;   
  104.             ctrl.Parent.Height = Bricks[0, 0].Height * rows + 33 + 24 + 50;   
  105.         }   
  106.         //获取四周的地雷数   
  107.         private void GetArroundMineCount(int x, int y) {   
  108.             int count = 0;   
  109.             for(int i = x - 1; i <= x + 1; i++) {   
  110.                 for(int j = y - 1; j <= y + 1; j++) {   
  111.                     if(i == x && j == y || i < 0 || j < 0 || i == rows || j == cols) continue;   
  112.                     if(Bricks[i, j].IsMine) count++;   
  113.                 }   
  114.             }   
  115.             Bricks[x, y].ArroundMines = count;   
  116.         }  
  117.         #endregion   
  118.     }   
  119. }