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

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

1、思路

一、创建二维数组,来表示地图

每一个格子要表示的信息:

1、未翻开状态(草地)和已翻开状态(数字)
2、该格子是地雷或者不是地雷(1表示是地雷,0表示不是)

二、使用两个二维数组来分别表示以上的两种状态

第一个二维数组
char showMap[9][9];表示每个格子的翻开和未翻开状态
表示未翻开,字符'0'-'8'表示已翻开的数字
第二个二维数组
char mineMap[9][9];表示每个格子是否是地雷
'1'表示是地雷,'0'表是不是地雷

三、扫雷游戏流程

1、创建地图并初始化
针对showMap来说,初始化全是
针对mineMap来说,先把整个数组都初始化成'0',随机生成10个位置,作为地雷,设为'1',
2、打印地图showMap
3、让玩家输入坐标,表示要翻开的位置
4、判定是否踩雷
5、更新showMap,再翻开位置显示周围有多少个地雷
6、判定玩家是否翻开了所有的位置
如果为否则返回第二步

2、源代码:

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<time.h>
  6.  
  7.  
  8. #define MAX_ROW 9
  9. #define MAX_COL 9
  10. #define MINE_COUNT 10
  11.  
  12. void init(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL])
  13. {
  14. //初始化第一张地图
  15. /*for (int row = 0; row < MAX_ROW; row++)
  16. for (int col = 0; col < MAX_COL; col++)
  17. showMap[row][col] = '*';*/
  18. //mem=>memory 内存
  19. //set:设置,集合
  20. //memset的功能就是把一段内存上的每一个字节都设置成一个具体的值
  21. //二维数组的每个元素都是在一个连续的内存空间上布局的
  22. memset(showMap,'*',MAX_ROW*MAX_COL);
  23. //第一个参数表示起始位置,第二个参数表示把这段内存的值设为啥,第三个参数表示这段内存多少字节
  24. memset(mineMap, '0', MAX_ROW * MAX_COL);
  25. //随机产生十个位置作为地雷
  26. //先设置随机种子
  27. srand((unsigned int)time(0));
  28. int mineCount = 0;
  29. while (mineCount< MINE_COUNT) {
  30. int row = rand() % MAX_ROW;
  31. int col = rand() % MAX_COL;
  32. if (mineMap[row][col] == '1') {
  33. continue;
  34. }
  35. mineMap[row][col] = '1';
  36. mineCount++;
  37. }
  38.  
  39. }
  40. //打印地图,希望这一个函数同时具备打印两种地图的功能
  41. //取决于实参填啥
  42. //形参名字叫做"map"不太合适,C++标准库里有一个std::map
  43. void print(char theMap[MAX_ROW][MAX_COL]) {
  44. for (int row = 0; row < MAX_ROW; row++) {
  45. for (int col = 0; col < MAX_COL; col++) {
  46. printf("%c",theMap[row][col]);
  47. }
  48. printf("\n");
  49. }
  50. }
  51.  
  52. void update(char showMap[MAX_ROW][MAX_COL],
  53. char mineMap[MAX_ROW][MAX_COL],int row,int col){
  54. //count表示周围的地雷个数
  55. int count = 0;
  56. for (int r = row - 1; r <= row + 1; r++) {
  57. for (int c = col - 1; c <= col + 1; c++) {
  58. if (r < 0 || r >= MAX_ROW || c < 0 || c >= MAX_COL) {
  59. //此时r,c坐标超出棋盘的范围,直接跳出
  60. continue;
  61. }
  62. if (r == row && c == col) {
  63. //如果为这个点本身,不需要循环,直接下次循环
  64. continue;
  65. }
  66. if (mineMap[r][c] == '1') {
  67. count++;
  68. }
  69. }
  70. }
  71. //如果直接赋值,此时假设count是2,
  72. //当前row,col位置的元素就被设置成了ASCLL值为
  73. //2的字符而不是'2'
  74. showMap[row][col] ='0'+ count;
  75. }
  76. int main() {
  77. //1、创建地图并初始化
  78. char showMap[MAX_ROW][MAX_COL] = { 0 };
  79. char mineMap[MAX_ROW][MAX_COL] = { 0 };
  80. init(showMap, mineMap);
  81. int openedCount = 0;//用来表示翻开的个数
  82. while (1) {
  83. //清屏
  84. system("cls");
  85. //2、打印地图
  86. print(showMap);
  87. //为了验证update函数的正确性,先把地雷的布局也打印出来
  88. //printf("============================\n");
  89. //print(mineMap);
  90. //3、玩家输入坐标
  91. int row = 0;
  92. int col = 0;
  93. printf("请输入坐标(row,col):");
  94. scanf("%d %d", &row, &col);
  95. //进行合法性判定
  96. if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
  97. printf("你输入的坐标有误!请重新输入!\n");
  98. continue;
  99. }
  100. //判断玩家输入的位置是否已经翻开
  101. if (showMap[row][col] != '*') {
  102. printf("您输入的位置已经翻开了!请重新输入!\n");
  103. continue;
  104. }
  105. //4、判定是否踩雷
  106. if (mineMap[row][col] == '1') {
  107. printf("您踩雷了!!!游戏结束!\n");
  108. break;
  109. }
  110. //5、更新showMap,显示当前位置周围有多少个雷
  111. update(showMap, mineMap, row, col);
  112. //6、进行游戏胜利的判定,统计当前一共翻开了多少个格子
  113. openedCount++;
  114. if (openedCount == MAX_ROW * MAX_COL - MINE_COUNT) {
  115. printf("恭喜你,获胜了!\n");
  116. break;
  117. }
  118. }
  119. system("pause");
  120. return 0;
  121. }

3、总结

a.memset函数的使用
b.使用数组时应时刻注意越界问题
c.在update函数中数坐标周围地雷个数时注意不要直接赋值,而应该加字符0,因为地图元素为char型。

  1. showMap[row][col] ='0'+ count;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持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号