经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C语言实现简易的扫雷游戏
来源:jb51  时间:2021/11/15 17:22:13  对本文有异议

本文实例为大家分享了C语言实现简易的扫雷游戏的具体代码,供大家参考,具体内容如下

在正式讲内容之前先说一说扫雷游戏的规则

游戏规则很简单,点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利

.刚开始需要碰运气,只要点开一个区域,就可以正式开始了。

3.根据现有情况,判断出一定有雷的位置。

4.进一步计算,因为“2”右边的“1”已经有从属的雷了,所以右边的“2”的正下方没有雷,因此可以判断出左边有两颗雷,满足两个“2”。

5.红圈表明的“1”已经有一颗确定的雷了,这时只需要把鼠标放在“1”上,按住右键不放,再点一下左键,“1”周围的其他方块就全被点开了。这个小技巧对于提升速度非常有帮助。

6.左上角的“1”旁边必须有一颗雷,可能在红圈圈住的两个块中,目前还无法确定。但是不论在两个中的哪一个,都从属于“3”,因此“3”周围已经有了三颗雷,“3”左下角的方块可以确定没有雷。

7.红圈框住的位置肯定有一颗雷,因为“3”周围必须有三颗雷。不论在两个中的哪一个,都从属于“3旁边的“2”,这样“2”就满足两颗雷的条件了。因此“2”左下角的块是没有雷的。

8.这样一来,“3”下面的两个块可以确定都是有雷的。

9.把这些有雷的地方标出来,就打开了一片新天地。

10.再根据现有的条件把确定有雷的地方表明,点开其他的地方。这时我们发现刚才左上角遗留的问题解决了。

11.重复上面的各种方法,不断推理出,最后就能完成扫雷

好了,规则已经讲完了,现在来说一说怎么实现的吧:

首先还是得创建三个文件夹,分别为game.c 游戏需要的具体函数的实现 game.h (所要用的头文件)test.c(游戏的逻辑,菜单,以及函数顺序调用)。

首先看一下test.c:

游戏大概的逻辑就是布置雷,把棋盘打印出来,然后玩家自己扫雷,这部分代码不是很难理解

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include"game.h"
  3. void game()
  4. {
  5. char mine[ROWS][COLS] = { 0 };//存放布置雷的信息 0无雷 1有雷
  6. char show[ROWS][COLS] = { 0 };//展示给用户看并且存放排查出的雷的信息
  7. InitBoard(mine, ROWS, COLS, '0');
  8. InitBoard(show, ROWS, COLS, '*');
  9. //布置雷
  10. SetMine(mine, ROW, COL);
  11. //打印棋盘
  12. //DisplayBoard(mine, ROW, COL);
  13. DisplayBoard(show, ROW, COL);
  14. //排雷
  15. FindMine(mine,show, ROW, COL);
  16. }
  17. //游戏菜单界面
  18. void menu()
  19. {
  20. printf("************\n");
  21. printf("***1.开始***\n");
  22. printf("***0.退出***\n");
  23. printf("************\n");
  24. }
  25. //选择玩或不玩
  26. void test()
  27. {
  28. int input = 0;
  29. srand((unsigned int)time(NULL));
  30. do
  31. {
  32. menu();
  33. printf("请选择->;");
  34. scanf_s("%d", &input);
  35. switch (input)
  36. {
  37. case 1:
  38. //扫雷
  39. game();
  40. break;
  41. case 0:
  42. printf("%d\n",input);
  43. printf("即将退出游戏\n");
  44. break;
  45. default:
  46. printf("输入错误,请重新输入:\n");
  47. break;
  48. }
  49. } while (input);
  50. }
  51. int main(void)
  52. {
  53. test();
  54. return 0;
  55. }

接下来是game.h:

我将所使用到的函数和代码段都写入了代码里应该不难理解

  1. #pragma once
  2. #include<stdio.h>
  3. #include<time.h>
  4. #include<Windows.h>
  5. #define ROW 9//打印出来的棋盘大小
  6. #define COL 9//打印出来的棋盘大小
  7. #define ROWS ROW+2//实际棋盘大小,为了防止越界
  8. #define COLS COL+2//实际棋盘大小,为了防止越界
  9. #define EASY_COUNT 10//简单模式10个雷然后根据自己的需要调整大小
  10. //初始化棋盘
  11. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
  12. //打印棋盘
  13. void DisplayBoard(char mine[ROWS][COLS], int row, int col);
  14. //布置雷
  15. void SetMine(char mine[ROWS][COLS], int row, int col);
  16. //找雷
  17. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

接下来是game.c:

扫雷游戏有一个功能是,点开一个位置,如果周围都没有雷的话就会展开那一片,我们这里用递归来实现:

  1. //将棋盘展开的函数
  2. void Open(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y)
  3. {
  4. int n = get_mine_count(mine, x, y);
  5. if (n != 0)
  6. {
  7. show[x][y] = '0' + n;
  8. }
  9. else if (show[x][y] != ' ')
  10. {
  11. show[x][y] = ' ';
  12. int i = 0;
  13. for (i = x - 1; i <= x + 1; i++)
  14. {
  15. int j = 0;
  16. for (j = y - 1; j <= y + 1; j++)
  17. {
  18. Open(mine, show, i, j);
  19. }
  20. }
  21. }
  22. else
  23. {
  24. return;
  25. }
  26. }

完整代码:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include"game.h"
  3. //初始化棋盘:全部为'*'
  4. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
  5. {
  6. int i = 0;
  7. int j = 0;
  8. for (i = 0; i < rows; i++)
  9. {
  10. for (j = 0; j < cols; j++)
  11. {
  12. board[i][j] = set;
  13. }
  14. }
  15. }
  16. // 显示应该给用户显示的界面‘*'
  17. void DisplayBoard(char board[ROWS][COLS], int row, int col)
  18. {
  19. int i = 0;
  20. int j = 0;
  21. for (i = 0; i <= row; i++)
  22. {
  23. printf("%d|", i);
  24. }
  25. printf("\n");
  26. for (i = 0; i < 10; i++)
  27. {
  28. printf("-|");
  29. }
  30. printf("\n");
  31. for (i = 1; i <= row; i++)
  32. {
  33. printf("%d|", i );
  34. for (j = 1; j <= col; j++)
  35. {
  36. printf("%c|", board[i][j]);
  37. }
  38. printf("\n");
  39. for (j = 0; j <col+1; j++)
  40. {
  41. printf("-|");
  42. }
  43. printf("\n");
  44. }
  45. }
  46. void SetMine(char board[ROWS][COLS], int row, int col)
  47. {
  48. int count = EASY_COUNT;
  49. while (count)
  50. {
  51. int x = rand() % row + 1;
  52. int y = rand() % col + 1;
  53. if (board[x][y] == '0')
  54. {
  55. board[x][y] = '1';
  56. count--;
  57. }
  58. }
  59. }
  60. static int get_mine_count(char mine[ROWS][COLS], int x, int y)
  61. {
  62. return mine[x + 1][y] +
  63. mine[x - 1][y] +
  64. mine[x][y + 1] +
  65. mine[x][y - 1] +
  66. mine[x - 1][y - 1] +
  67. mine[x - 1][y + 1] +
  68. mine[x + 1][y - 1] +
  69. mine[x + 1][y + 1] -
  70. 8 * '0';
  71. }
  72. //将棋盘展开的函数
  73. void Open(char mine[ROWS][COLS], char show[ROWS][COLS],int x,int y)
  74. {
  75. int n = get_mine_count(mine, x, y);
  76. if (n != 0)
  77. {
  78. show[x][y] = '0' + n;
  79. }
  80. else if (show[x][y] != ' ')
  81. {
  82. show[x][y] = ' ';
  83. int i = 0;
  84. for (i = x - 1; i <= x + 1; i++)
  85. {
  86. int j = 0;
  87. for (j = y - 1; j <= y + 1; j++)
  88. {
  89. Open(mine, show, i, j);
  90. }
  91. }
  92. }
  93. else
  94. {
  95. return;
  96. }
  97. }
  98. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
  99. {
  100. int x = 0;
  101. int y = 0;
  102. while (1)
  103. {
  104. printf("请输入你要查询的坐标->");
  105. scanf("%d%d", &x, &y);
  106. Sleep(500);
  107. if (x >= 1 && x <= row && y >= 1 && y <= col)
  108. {
  109. if ('1' == mine[x][y])
  110. {
  111. printf("很遗憾,你无了\n");
  112. Sleep(500);
  113. DisplayBoard(mine, row, col);
  114. break;
  115. }
  116. else
  117. {
  118. //计算坐标x,y周围有几个雷
  119. Open(mine,show,x,y);
  120. DisplayBoard(show, row, col);
  121. }
  122. }
  123. else
  124. {
  125. printf("输入坐标非法,无法排雷,请重新输入\n");
  126. }
  127. int i = 0;
  128. int j = 1;
  129. int flag = 0;
  130. for (i = 1; i <= row; i++)
  131. {
  132. for (j = 1; j <= col; j++)
  133. {
  134. if (show[i][j] == '*')
  135. {
  136. flag++;
  137. }
  138. }
  139. }
  140. if (flag == EASY_COUNT)//棋盘全部展开后扫描玩家找的雷的个数是否复合实际雷的个数
  141. {
  142. printf("恭喜你,你赢了!\n");
  143. DisplayBoard(mine, row, col);
  144. break;
  145. }
  146. }
  147. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号