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

游戏部分包含:
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. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Text;
  4. usingSystem.Windows.Forms;
  5. usingSystem.Drawing;
  6. namespaceMineSweeper{
  7. classGame{
  8. publicstaticBrick[,]Bricks;
  9. Controlctrl;
  10. introws;
  11. intcols;
  12. intmineCount;
  13. int[]mines;
  14. Randomrandom=newRandom();
  15. #region初始化
  16. ///<summary>
  17. ///初始化
  18. ///</summary>
  19. ///<paramname="level"></param>
  20. publicvoidInit(Controlctrl,intlevel){
  21. this.ctrl=ctrl;
  22. SetLevel(level);
  23. CreateMines();
  24. CreateBricks();
  25. }
  26. //设置级别
  27. privatevoidSetLevel(intlevel){
  28. switch(level){
  29. case1:
  30. rows=9;
  31. cols=9;
  32. mineCount=10;
  33. break;
  34. case2:
  35. rows=16;
  36. cols=16;
  37. mineCount=40;
  38. break;
  39. case3:
  40. rows=16;
  41. cols=30;
  42. mineCount=99;
  43. break;
  44. }
  45. }
  46. //创建随机地雷
  47. privatevoidCreateMines(){
  48. mines=newint[mineCount];
  49. intcount=0;
  50. while(count<mineCount){
  51. intrand=random.Next(rows*cols);
  52. //判断是否重复
  53. boolisRepeat=false;
  54. foreach(intmIndexinmines){
  55. if(mIndex==rand){
  56. isRepeat=true;
  57. break;
  58. }
  59. }
  60. if(!isRepeat){
  61. mines[count++]=rand;
  62. }
  63. }
  64. }
  65. //创建砖块
  66. privatevoidCreateBricks(){
  67. Bricks=newBrick[rows,cols];
  68. ctrl.Controls.Clear();
  69. for(inti=0;i<rows;i++){
  70. for(intj=0;j<cols;j++){
  71. Brickbrick=newBrick();
  72. brick.X=i;
  73. brick.Y=j;
  74. brick.Left=j*brick.Width;
  75. brick.Top=i*brick.Height;
  76. Bricks[i,j]=brick;
  77. ctrl.Controls.Add(brick);
  78. }
  79. }
  80. //标识有地雷的砖块
  81. foreach(intmIndexinmines){
  82. intx=mIndex/cols;
  83. inty=mIndex%cols;
  84. Console.Write("({0},{1})",x,y);
  85. Bricks[x,y].IsMine=true;
  86. }
  87. Console.WriteLine();
  88. for(inti=0;i<rows;i++){
  89. for(intj=0;j<cols;j++){
  90. GetArroundMineCount(i,j);
  91. }
  92. }
  93. ctrl.Parent.Width=Bricks[0,0].Width*cols+8;
  94. ctrl.Parent.Height=Bricks[0,0].Height*rows+33+24+50;
  95. }
  96. //获取四周的地雷数
  97. privatevoidGetArroundMineCount(intx,inty){
  98. intcount=0;
  99. for(inti=x-1;i<=x+1;i++){
  100. for(intj=y-1;j<=y+1;j++){
  101. if(i==x&&j==y||i<0||j<0||i==rows||j==cols)continue;
  102. if(Bricks[i,j].IsMine)count++;
  103. }
  104. }
  105. Bricks[x,y].ArroundMines=count;
  106. }
  107. #endregion
  108. }
  109. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值