当前位置:   article > 正文

扫雷游戏实现_扫雷小游戏

扫雷小游戏

目录

【前言】

1.游戏的功能说明

2.游戏的分析设计

3.扫雷游戏的代码实现

【前言】

本次我们将就前面所学知识编写一个小游戏:扫雷。下面是项目具体实施。

1.游戏的功能说明

扫雷游戏的功能主要包括以下几个方面:

游戏可以通过菜单实现继续玩或者退出游戏

  1. 扫雷的棋盘是9*9的格子
  2. 随机布置雷
  3. 可以排查雷
  4. 展示雷的坐标
  5. 位置不是雷,就显示周围有几个雷,并展开周围的一片
  6. 是雷,游戏结束

2.游戏的分析设计

扫雷游戏中,雷的布置以及以及排查雷的信息我们都需要存储,此时我们可以设计一个9*9的二维数组用来存储雷的信息以及排查雷的信息。

空格处如果布置雷则存放1,否则为0

当我们排查(3,2)这个坐标时,改位置不是雷,则需要将周围一圈八个位置雷的信息统计下来。

若排查(9,5)这个坐标时,这时候在统计周围八个坐标就会变为数组越界,所以我们需要将数组周围扩大一圈变成11*11的二维数组。

但雷的信息也是1,若周围统计的雷的个数也为1的话,就会导致含义混淆,所以我们可以将储存雷和非雷的换成字符。

但是这样做棋盘上有雷和非雷的信息,还有排查出的雷的个数信息,就比较混杂,不够方便。我们专门给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息。给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不⼲扰了,把雷布置到 mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期 排查参考。

我们可以设计三个文件

  1. test.c //⽂件中写游戏的测试逻辑
  2. game.c //⽂件中写游戏中函数的实现等
  3. game.h //⽂件中写游戏需要的数据类型和函数声明等

3.扫雷游戏的代码实现

test.c

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

game.h

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define ROW 9
  5. #define COL 9
  6. #define ROWS ROW+2
  7. #define COLS COL+2
  8. #define EASY_COUNT 10
  9. //初始化棋盘
  10. void InitBoard(char arr[ROWS][COLS], int rows, int cols, char ret);
  11. //打印棋盘
  12. void PrintBoard(char arr[ROWS][COLS], int row, int col);
  13. //生成雷
  14. void Setmine(char arr[ROWS][COLS], int row, int col);
  15. //排查雷
  16. void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
  17. //展开雷
  18. char Around(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);

game.c

  1. #include "game.h"
  2. //初始化棋盘
  3. void InitBoard(char arr[ROWS][COLS], int rows, int cols,char ret)
  4. {
  5. int i = 0;
  6. int j = 0;
  7. for (i = 0; i < rows; i++)
  8. {
  9. for (j = 0; j < cols; j++)
  10. {
  11. arr[i][j] = ret;
  12. }
  13. }
  14. }
  15. //打印棋盘
  16. void PrintBoard(char arr[ROWS][COLS], int row, int col)
  17. {
  18. int i = 0;
  19. int j = 0;
  20. printf("----------扫雷游戏-----------\n");
  21. for (j = 0; j <= col; j++)
  22. {
  23. printf("%d ", j);
  24. }
  25. printf("\n");
  26. for (i = 1; i <= row; i++)
  27. {
  28. printf("%d ", i);
  29. for (j = 1; j <= col; j++)
  30. {
  31. printf("%c ", arr[i][j]);
  32. }
  33. printf("\n");
  34. }
  35. }
  36. //生成雷
  37. void Setmine(char arr[ROWS][COLS], int row, int col)
  38. {
  39. int count = EASY_COUNT;
  40. while (count)
  41. {
  42. int x = rand() % row + 1;
  43. int y = rand() % col + 1;
  44. if (arr[x][y] == '0')
  45. {
  46. arr[x][y] = '1';
  47. count--;
  48. }
  49. }
  50. }
  51. //排查雷
  52. void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
  53. {
  54. int x = 0;
  55. int y = 0;
  56. int win = 0;
  57. while (win<row*col- EASY_COUNT)
  58. {
  59. printf("请输入坐标:");
  60. scanf("%d %d", &x, &y);
  61. //坐标合法性
  62. if (x >= 1 && x <= row && y >= 1 && y <= col)
  63. {
  64. if (show[x][y] == '*')
  65. {
  66. //该位置是雷
  67. if (mine[x][y] == '1')
  68. {
  69. printf("很遗憾,你被炸死了\n");
  70. PrintBoard(mine, ROW, COL);
  71. break;
  72. }
  73. else
  74. {
  75. //展开雷
  76. Around(mine, show, x, y);
  77. PrintBoard(show, ROW, COL);
  78. win++;
  79. }
  80. }
  81. else
  82. {
  83. printf("输入不合法,请重新输入\n");
  84. }
  85. }
  86. else
  87. {
  88. printf("输入不合法\n");
  89. }
  90. }
  91. if (win == row * col - EASY_COUNT)
  92. {
  93. printf("排雷成功\n");
  94. PrintBoard(mine, ROW, COL);
  95. }
  96. }
  97. //统计雷
  98. int Getmine(char arr[ROWS][COLS], int x, int y)
  99. {
  100. int i = 0;
  101. int j = 0;
  102. int count = 0;
  103. for (i = x - 1; i <= x + 1; i++)
  104. {
  105. for (j = y - 1; j <= y + 1; j++)
  106. {
  107. if (arr[i][j] == '1')
  108. {
  109. count++;
  110. }
  111. }
  112. }
  113. return count;
  114. }
  115. //展开雷
  116. char Around(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
  117. {
  118. int i = 0;
  119. int j = 0;
  120. if (x <= ROW && x >= 1 && y <= COL && y >= 1 && show[x][y] == '*' && mine[x][y] != '1')
  121. {
  122. int sum = Getmine(mine, x, y);
  123. if (sum == 0)//若周围无雷,则将该位置赋值为‘ ’
  124. {
  125. show[x][y] = ' ';
  126. for (i = (x - 1 > 1 ? x - 1 : 1); i <= (x + 1 > ROW ? ROW : x + 1); i++)
  127. {
  128. for (j = (y - 1 > 1 ? y - 1 : 1); j <= (y + 1 > COL ? COL : y + 1); j++)
  129. {
  130. Around(mine, show, i, j);
  131. }
  132. }
  133. }
  134. else//若有雷,则将该位置赋值为几,代表该点周围有几个雷
  135. {
  136. show[x][y] = sum + '0';
  137. }
  138. }
  139. }

游戏试玩

这里为了具体看游戏有无问题,我们将雷的个数设计为80个

制作不易,有问题请指正!!!

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