游戏部分包含:
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)计算砖块周围的雷数
这个方法放在这里不符合逻辑,但是问题是砖块的设计我们采用了自定义控件,砖块和砖块是没有联系的,某一砖块并不知道周围砖块情况。怎么办呢?我们在只能在游戏加载时,先把每个砖块周围的情况都设置到砖块属性中。
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Text;
- usingSystem.Windows.Forms;
- usingSystem.Drawing;
- namespaceMineSweeper{
- classGame{
- publicstaticBrick[,]Bricks;
- Controlctrl;
- introws;
- intcols;
- intmineCount;
- int[]mines;
- Randomrandom=newRandom();
- #region初始化
- ///<summary>
- ///初始化
- ///</summary>
- ///<paramname="level"></param>
- publicvoidInit(Controlctrl,intlevel){
- this.ctrl=ctrl;
- SetLevel(level);
- CreateMines();
- CreateBricks();
- }
- //设置级别
- privatevoidSetLevel(intlevel){
- switch(level){
- case1:
- rows=9;
- cols=9;
- mineCount=10;
- break;
- case2:
- rows=16;
- cols=16;
- mineCount=40;
- break;
- case3:
- rows=16;
- cols=30;
- mineCount=99;
- break;
- }
- }
- //创建随机地雷
- privatevoidCreateMines(){
- mines=newint[mineCount];
- intcount=0;
- while(count<mineCount){
- intrand=random.Next(rows*cols);
- //判断是否重复
- boolisRepeat=false;
- foreach(intmIndexinmines){
- if(mIndex==rand){
- isRepeat=true;
- break;
- }
- }
- if(!isRepeat){
- mines[count++]=rand;
- }
- }
- }
- //创建砖块
- privatevoidCreateBricks(){
- Bricks=newBrick[rows,cols];
- ctrl.Controls.Clear();
- for(inti=0;i<rows;i++){
- for(intj=0;j<cols;j++){
- Brickbrick=newBrick();
- brick.X=i;
- brick.Y=j;
- brick.Left=j*brick.Width;
- brick.Top=i*brick.Height;
- Bricks[i,j]=brick;
- ctrl.Controls.Add(brick);
- }
- }
- //标识有地雷的砖块
- foreach(intmIndexinmines){
- intx=mIndex/cols;
- inty=mIndex%cols;
- Console.Write("({0},{1})",x,y);
- Bricks[x,y].IsMine=true;
- }
- Console.WriteLine();
- for(inti=0;i<rows;i++){
- for(intj=0;j<cols;j++){
- GetArroundMineCount(i,j);
- }
- }
- ctrl.Parent.Width=Bricks[0,0].Width*cols+8;
- ctrl.Parent.Height=Bricks[0,0].Height*rows+33+24+50;
- }
- //获取四周的地雷数
- privatevoidGetArroundMineCount(intx,inty){
- intcount=0;
- for(inti=x-1;i<=x+1;i++){
- for(intj=y-1;j<=y+1;j++){
- if(i==x&&j==y||i<0||j<0||i==rows||j==cols)continue;
- if(Bricks[i,j].IsMine)count++;
- }
- }
- Bricks[x,y].ArroundMines=count;
- }
- #endregion
- }
- }