自己构造扫雷的棋盘

来源:互联网 发布:乐视起诉b站2017 知乎 编辑:程序博客网 时间:2024/04/30 05:57
突然想自己构造一个扫雷游戏,用什么实现都无所谓,最近在学Python,或许过段时间使用Python来做一个GUI的扫雷游戏也未可知,但是现在Python的很多语法、功能还不太清楚,使用java的话好象太麻烦了。以后可能会使用Java来做就GUI的,但是觉得好麻烦啊,或许别的GUI做起来也很麻烦。
这里仅仅实现了随机生成棋盘的程序(C语言),有的地方比较啰嗦,如果有更好的方法,还希望各位大虾指教。使用srand()函数防止每次产生的随机数都是一样的。在调试过程中发现右上角经常出现一个“1”,但是周围都没有地雷,我看了下程序,是这个角落和左下角都没有处理,添加了一点,现在没有看到了,但是当地雷数目较多的时候,不方便检查是否会有重复的雷。另外,判断每个格子周围的雷的数目的方法getcounts()实在是纯粹的重复劳动,希望能有一个更好一点的方法,至少看上去简洁一点的。
按照Windows的扫雷,高级的游戏好象长宽不等,但是这样做比较麻烦,我的程序要求不管棋盘多大,必须是正方形的,这样只要修改程序开始处棋盘和棋子的数目即可,下边的程序无需改动即可生成扫雷游戏的棋盘。现在把棋盘生成的方法写出来,以后有机会再做GUI吧。
另外,如果某一次产生的随机数前边已经出现过一次,我仅仅是简单的重新生成一个随机数,而这个数是否已经重复则没有做检查。
整个C程序如下:
  1. /*
  2.  * Author: Hegc Huang
  3.  * Date  : 2008-08-31
  4.  * Name  : mines.c
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <math.h>
  9. #include <time.h>
  10. #define INT sizeof(int)
  11. int chessboard [25][25];
  12. int mines [149];
  13. int getcounts(int x, int y, int border);
  14. int init();
  15. int check(int i, int _rand);
  16. int main(int argc, char *argv[])
  17. {
  18.     int i = 0;
  19.     int j = 0;
  20.     int r = 0;
  21.     int border = sqrt(sizeof(chessboard)/INT);
  22.     init(); /*initialize the chess board*/
  23.     printf("All mines' location:/n");
  24.     for (i = 0;i<sizeof(mines)/INT ;i++ )
  25.     {
  26.         printf("%d ", mines[i]);
  27.     }
  28.     printf("/n/nChess board:/n");
  29.     for (i = 0;i<border ;i++ )
  30.     {
  31.         for (j=0;j<border ;j++ )
  32.         {
  33.             r = chessboard[i][j];
  34.             if (r == -1)
  35.                 printf("%3c"'/x0F');
  36.             else
  37.                 printf("%3d", r);
  38.         }
  39.         printf("/n");
  40.         
  41.     }
  42.     return 0;
  43. }
  44. int init ()
  45. {
  46.     int i = 0;
  47.     int j = 0;
  48.     int _rand = -1;
  49.     int boardsize = sizeof(chessboard)/INT;
  50.     int border = sqrt(boardsize);
  51.     int k = -2;
  52.     int m = -3;
  53.     /*create mines*/
  54.     srand((unsigned)time( NULL ));
  55.     for (i = 0 ;i<sizeof(mines)/INT ;i++ )
  56.     {
  57.         _rand = rand()%boardsize;
  58.         if (check(i, _rand) == 0)
  59.             _rand = rand()%boardsize;
  60.         mines[i] = _rand;
  61.     }
  62.     /*create chess board*/
  63.     for (i=0 ;i<sizeof(mines)/INT ;i++ )
  64.     {
  65.         k = mines[i]/border;
  66.         m = mines[i]%border;
  67.         chessboard[k][m] = -1;
  68.     }
  69.     for (i=0 ;i<border ;i++ )
  70.     {
  71.         for (j=0 ;j<border ;j++ )
  72.         {
  73.             chessboard[i][j] = getcounts(i, j, border-1);
  74.         }
  75.     }
  76.     return 0;
  77. }
  78. int check(int i, int _rand)
  79. {
  80.     int j = 0;
  81.     for (j=0; j<i ;j++ )
  82.     {
  83.         if (_rand == mines[j])
  84.         {
  85.             return 0;
  86.         }
  87.     }
  88.     return 1;
  89. }
  90. int getcounts(int i, int j, int border)
  91. {
  92.     int ret = 0;
  93.     int type = -1;
  94.     if (i==0 && j==0 && chessboard[i][j]!=-1)
  95.     {
  96.         if (chessboard[i+1][j] == -1)
  97.             ret += 1;
  98.         if (chessboard[i+1][j+1] == -1)
  99.             ret += 1;
  100.         if (chessboard[i][j+1] == -1)
  101.             ret += 1;
  102.     }
  103.     else if (i==border && j==border && chessboard[i][j]!=-1)
  104.     {
  105.         if (chessboard[i-1][j] == -1)
  106.             ret += 1;
  107.         if (chessboard[i-1][j-1] == -1)
  108.             ret += 1;
  109.         if (chessboard[i][j-1] == -1)
  110.             ret += 1;
  111.     }
  112.     else if (j==0 && chessboard[i][j]!=-1)
  113.     {
  114.         if (chessboard[i-1][j] == -1)
  115.             ret += 1;
  116.         if (chessboard[i-1][j+1] == -1)
  117.             ret += 1;
  118.         if (chessboard[i][j+1] == -1)
  119.             ret += 1;
  120.         if (i<border)
  121.         {
  122.             if (chessboard[i+1][j] == -1)
  123.                 ret += 1;
  124.             if (chessboard[i+1][j+1] == -1)
  125.                 ret += 1;
  126.         }
  127.     }
  128.     else if (i==0 && chessboard[i][j]!=-1)
  129.     {
  130.         if (chessboard[i+1][j] == -1)
  131.             ret += 1;
  132.         if (chessboard[i+1][j-1] == -1)
  133.             ret += 1;
  134.         if (chessboard[i][j-1] == -1)
  135.             ret += 1;
  136.         if (j<border)
  137.         {
  138.             if (chessboard[i+1][j+1] == -1)
  139.                 ret += 1;
  140.             if (chessboard[i][j+1] == -1)
  141.                 ret += 1;
  142.         }
  143.     }
  144.     else if (i==border && chessboard[i][j]!=-1)
  145.     {
  146.         if (chessboard[i-1][j] == -1)
  147.             ret += 1;
  148.         if (chessboard[i-1][j-1] == -1)
  149.             ret += 1;
  150.         if (chessboard[i][j-1] == -1)
  151.             ret += 1;
  152.         if (chessboard[i-1][j+1] == -1)
  153.             ret += 1;
  154.         if (chessboard[i][j+1] == -1)
  155.             ret += 1;
  156.     }
  157.     else if (j==border && chessboard[i][j]!=-1)
  158.     {
  159.         if (chessboard[i-1][j] == -1)
  160.             ret += 1;
  161.         if (chessboard[i+1][j] == -1)
  162.             ret += 1;
  163.         if (chessboard[i][j-1] == -1)
  164.             ret += 1;
  165.         if (chessboard[i+1][j-1] == -1)
  166.             ret += 1;
  167.         if (chessboard[i-1][j-1] == -1)
  168.             ret += 1;
  169.     }
  170.     else if (chessboard[i][j]!=-1)
  171.     {
  172.         if (chessboard[i-1][j-1] == -1)
  173.             ret += 1;
  174.         if (chessboard[i-1][j] == -1)
  175.             ret += 1;
  176.         if (chessboard[i-1][j+1] == -1)
  177.             ret += 1;
  178.         if (chessboard[i][j+1] == -1)
  179.             ret += 1;
  180.         if (chessboard[i+1][j+1] == -1)
  181.             ret += 1;
  182.         if (chessboard[i+1][j] == -1)
  183.             ret += 1;
  184.         if (chessboard[i+1][j-1] == -1)
  185.             ret += 1;
  186.         if (chessboard[i][j-1] == -1)
  187.             ret += 1;
  188.     }
  189.     else if (chessboard[i][j]==-1)
  190.     {
  191.         ret = -1;
  192.     }
  193.     return ret;
  194. }

对于这个程序,棋盘是25*25的,雷一共有149个,大约比例是1/4,要是太少的话,可能空的位置很多。
某一次生成的棋盘的结果如下:
All mines' location:
163 558 476 573 310 615 538 58 45 143 26 86 25 463 337 77 112 343 236 20 557 467 248 105 229 11 391 438 241 349 157 132 355 325 289 6 360 307 68 125 297 572 87 276 456 194 238 577 150 109 212 401 29 193 494 139 119 341 264 475 509 275 259 142 594 246 172 405 24 176 177 620 483 395 441 366 571 84 616 358 223 611 374 539 544 437 174 247 243 536 206 600 329 51 344 332 436 441 623 609 381 91 267 264 210 8 112 503 563 414 18 22 9 250 525 315 515 428 519 82 114 553 506 171 531 133 169 459 244 134 589 578 255 260 154 291 123 294 454 582 72 426 384 546 221 325 227 559 283

Chess board:

原创粉丝点击