当前位置:   article > 正文

C语言:【项目实现】扫雷

C语言:【项目实现】扫雷

目录

     一.思路

     1.成果展示

     2.思路

     二.具体操作

     1.创建"棋盘"

     2.初始化雷

     3.布置雷

      4.打印

      5.排除雷

     三.代码实现

     1.test.c文件

     2.thunder.h文件

      3.thunder.c文件


       Hello,大家好,今天我们来实现扫雷游戏,希望这一篇博客能给带给大家一些收获。

     一.思路

     1.成果展示

       在真正开始讲解之前,我们先来看一下我的成果展示:

屏幕录制 2024-07-03 165322-CSDN直播

     2.思路

       我们先来讲解一下扫雷游戏的思路:这个思路就是和我们在完游戏时候的那个思路时一模一样的,就是排除雷,简单来说,就是我们给定一个位置,看这个位置是不是雷,如果我们不幸,选中的这个位置就刚好是一个雷的话,那么我们就被炸死了,反之如果这个位置不是雷的话,那么,相应的,我们就要统计一下这个位置旁边与这个位置相邻的位置中雷的个数。

     二.具体操作

     1.创建"棋盘"

       实际上就是创建框架,就是创建如下面所示的一个"棋盘"。

44008fbadb024f3fb105eb832386d885.png

我们首先要创建一个如上图一样的类似于"棋盘"一样的框架,要制作这个框架其实是很简单的,就是建立一个二维数组就可以了,将数组中的所有的元素均设置成 ' * ' 就可以了。这里我们在创建框架的时候需要注意一件事情,就必须要创建两个一模一样的二维数组,大家不妨看一看我们上面的那个游戏思路,如果这个位置是雷,我们就"死了",反之,就要在这个位置上写上周围的所有位置的雷的数目总和。为了区分有雷和无雷,我们将有雷的位置赋值1,无雷的位置赋值为0,那么,这样的话,我们在玩游戏的过程中出现了1的话,我们是无法知道这个位置是雷还是说这个位置不是雷,周围总共有1个雷?如果我们只是使用一个二维数组的话,是无法明白这个出现的1的含义的,会让我们产生歧义。因此,我们在这里要使用两个一模一样的数组来实现,我们呈现在屏幕上面的"棋盘"样式就是上面的那幅图所示,由于 ' * ' 符号属于字符,因此,我们要建立一个字符数组,但是如果按照我们上面所说的那样的话,一个数组是int类型,另一个数组是char类型,这样写的话有一点点麻烦,为了统一,我们这里将两个数组均写成是char类型的。

     2.初始化雷

       通过上面的思路我们可知我们建立了两个char类型的数组,我们接下来就要进行初始化操作了,在进行初始化操作之前,我们首先要知道创建的两个数组是干什么的,一个数组是用来布置雷的,我们为了方便,将雷使用字符 ' 1 ' 来表示,不是雷的位置使用字符 ' 0 ' 来表示,这个数组我们不可以展示出来(因为这个数组中存放的是雷的分布情况),另一个数组就是我们要展示出来的数组,是用来显示我们要查的这个位置又没有雷的存在。

我们将不展示出来的这个数组命名为mine数组,如下图所示:

2e1f2a8c971b4897a77c87fa69724c5a.png

mine数组我们在进行初始化的时候,将这个数组中的所有的元素全部初始化为字符 ' 0 ' (通过我们上面的解释我们可知 ' 0 ' 代表的是要排查的这个位置没有雷)。

我们将展示出来的这个数组命名为show数组,如下图所示:

08bacb328fc74ce3a86f65cd635cd5b4.png

show数组我们在进行初始化的时候,将这个数组中的所有元素全部初始化为 ' * ' ,我们这个数组是作为展示的一个数组,因此,我们不能暴露里面的雷的放置情况。

     3.布置雷

       我们的雷的布置这一操作是在mine数组中进行的,我们的"棋盘"是采用的是 9 * 9实现的,我们这里在布置是只布置10个雷就i可以了,我们是要在这个"棋盘"中去进行雷的布置的,因此,不能超过这个"棋盘"的范围,这里我们要使用一个函数,就是 rand( ) 函数,下面是关于这个函数的链接,大家可以去了解一下,这个函数可以随机生成一个随机数,

rand - C++ Referencehttps://legacy.cplusplus.com/reference/cstdlib/rand/?kw=rand我们可以通过这个函数来确定雷的位置,使用这个函数我们就可以得到两个值x,y作为坐标来确定一个地址(这个地址必须在mine函数的范围之内),将这个地址赋值为字符 ' 1 ' ,利用循环,创建10个雷。

      4.打印

        我们在进行打印这一操作的时候,就是将mine数组和show数组中的各个元素均打印到屏幕上即可,这里使用for循环,(最后有代码)。

      5.排除雷

        前面的几步都是我们的准备操作,这一步才是我们玩游戏的步骤,我们给定一个坐标位置,去判断这个位置是否有雷(判断这一步操作是在mine数组中判断的(雷的分布是在mine数组中的)),若mine数组中这个位置是字符 ' 1 ' 的话,就说明我们碰到雷了,反之,若mine数组中这个位置是字符 ' 0 ' 的话,我们就要去统计一下这个位置周围的位置的雷的个数,然后将这个个数转化为字符赋值给show数组中的这个相同的位置,为了方便观看,我们这里将show数组在打印到屏幕上就可以了,这里还要有一个结束条件,就是我们将所有的雷全部都排完之后,我们就扫雷成功了,因此,我们还要定义一个变量来表示我们找到的非雷位置的个数,用这个变量来表示雷有没有被扫完。

     三.代码实现

     1.test.c文件

  1. #include"thunder.h"
  2. void menu()
  3. {
  4. printf("********************\n");
  5. printf("**** 1.play ****\n");
  6. printf("**** 0.exit ****\n");
  7. printf("********************\n");
  8. }
  9. void game()
  10. {
  11. char mine[COWS][COLS] = { 0 };
  12. char show[COWS][COLS] = { 0 };
  13. // 初始化雷
  14. Initebroad(mine, COWS, COLS, '0');
  15. Initebroad(show, COWS, COLS, '*');
  16. // 布置雷
  17. Setmine(mine, COW, COL);
  18. // 打印
  19. Displaydroad(mine, COW, COL);
  20. Displaydroad(show, COW, COL);
  21. // 排除雷
  22. Findmine(mine, show, COW, COL);
  23. }
  24. void test()
  25. {
  26. int input = 0;
  27. srand((unsigned int)time(NULL));
  28. do
  29. {
  30. menu();
  31. printf("请选择:");
  32. scanf("%d", &input);
  33. switch (input)
  34. {
  35. case 1:
  36. game();
  37. break;
  38. case 0:
  39. printf("游戏结束,退出游戏\n");
  40. break;
  41. default:
  42. printf("输入错误,请重新输入\n");
  43. }
  44. } while (input);
  45. }
  46. int main()
  47. {
  48. test();
  49. return 0;
  50. }

     2.thunder.h文件

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<time.h>
  5. #include<string.h>
  6. #define COW 9
  7. #define COL 9
  8. #define COWS COW+2
  9. #define COLS COL+2
  10. #define mount 10
  11. void Initebroad(char arr[COWS][COLS], int cows, int cols, char set);
  12. void Setmine(char arr[COWS][COLS], int cow, int col);
  13. void Displaydroad(char arr[COWS][COLS], int cows, int cols);
  14. void Findmine(char mine[COWS][COLS], char show[COWS][COLS], int cow, int col);

      3.thunder.c文件

  1. #include"thunder.h"
  2. void Initebroad(char arr[COWS][COLS], int cows, int cols, char set)
  3. {
  4. for (int i = 0; i < cows; i++)
  5. {
  6. for (int j = 0; j < cols; j++)
  7. {
  8. arr[i][j] = set;
  9. }
  10. }
  11. }
  12. void Setmine(char arr[COWS][COLS], int cow, int col)
  13. {
  14. int count = mount;
  15. while (count > 0)
  16. {
  17. int x = rand() % cow + 1;
  18. int y = rand() % col + 1;
  19. if (arr[x][y] == '0')
  20. {
  21. arr[x][y] = '1';
  22. count--;
  23. }
  24. }
  25. }
  26. void Displaydroad(char arr[COWS][COLS], int cow, int col)
  27. {
  28. printf("------开始游戏-----\n");
  29. for (int i = 0; i <= col; i++)
  30. {
  31. printf("%d ",i);
  32. }
  33. printf("\n");
  34. for (int i = 1; i <= cow; i++)
  35. {
  36. printf("%d ",i);
  37. for (int j = 1; j <= col; j++)
  38. {
  39. printf("%c ", arr[i][j]);
  40. }
  41. printf("\n");
  42. }
  43. }
  44. //static这个关键字可以保证这个函数只能在当前.c文件中使用,其他的文件使用不了。
  45. static int Getminecount(char arr[COWS][COLS], int x, int y)
  46. {
  47. int count = 0;
  48. for (int i = x - 1; i <= x + 1; i++)
  49. {
  50. for (int j = y - 1; j <= y + 1; j++)
  51. {
  52. count += arr[i][j] - '0';
  53. }
  54. }
  55. return count;
  56. }
  57. void Findmine(char mine[COWS][COLS], char show[COWS][COLS], int cow, int col)
  58. {
  59. int x = 0, y = 0;
  60. int win = 0;
  61. while (win < cow * col - mount)//确保雷全部被排完。
  62. {
  63. printf("请输入要排查的坐标位置\n");
  64. scanf("%d %d", &x, &y);
  65. if (x >= 1 && x <= cow && y >= 1 && y <= col)
  66. {
  67. if (show[x][y] == '*')
  68. {
  69. if (mine[x][y] == '1')
  70. {
  71. printf("很遗憾,您被炸死了\n");
  72. Displaydroad(show, COW, COL);
  73. break;
  74. }
  75. else
  76. {
  77. // 当程序进行到这里时,就说明要排查的当前位置不是雷,那么,就要统计周围一圈的雷的个数。
  78. int count = Getminecount(mine, x, y);
  79. show[x][y] = count + '0';
  80. Displaydroad(show, COW, COL);
  81. win++;
  82. }
  83. }
  84. else
  85. {
  86. printf("这个位置您已经排查过了,请另排查一个\n");
  87. }
  88. }
  89. else
  90. {
  91. printf("输入的坐标不存在,请重新输入\n");
  92. }
  93. }
  94. if (win == cow * col - mount)
  95. {
  96. printf("恭喜您,排雷成功\n");
  97. Displaydroad(mine, COW, COL);
  98. }
  99. }

       OK,以上就是我们对于扫雷游戏的全部讲解了,希望能对大家有所收获,感谢大家的支持。 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/925903
推荐阅读
相关标签
  

闽ICP备14008679号