当前位置:   article > 正文

C语言——扫雷小游戏

C语言——扫雷小游戏

        扫雷小游戏:

游戏最终效果:

1.先写一下游戏开始的简单界面。

用一个函数来写一下

  1. void menu()
  2. {
  3. printf(" ---------------------------- \n");
  4. printf("| 1.play |\n");
  5. printf("| 0.exit |\n");
  6. printf(" ---------------------------- \n");
  7. }

这里的功能(说明):

        输入 1  代表游戏开始;

        输入 0  代表游戏结束,并退出页面;

既然写扫雷,那地图中的地雷应该是随机出现的,那我们可以用一个srand函数让它随机出现生成地雷。

            srand((unsigned int)time(NULL));   //生成随机数的一个函数

具体用法可以百度一下,简单的概括就是生成一个随机数字。

  1. int main()
  2. {
  3. srand((unsigned int)time(NULL));
  4. int input = 0; //用与while函数循环的选择
  5. do { //也就是刚开始说的界面选择开始或结束的选项
  6. menu();
  7. printf("请选择>");
  8. scanf("%d", &input); //这里的input就是游戏开始或结束的选择
  9. switch (input) //再循环里面嵌套一个switch
  10. {
  11. case 1: // 当输入1的时候,那就进入游戏开始的逻辑
  12. printf("游戏开始!\n");
  13. system("cls"); // :这里是系统函数,用于清空控制台的消息与文字
  14. game(); // 这个是游戏开始的函数接口
  15. break;
  16. case 0: // 当选择0的时候,即退出游戏退出循环,并程序结束。
  17. printf("\n即将退出游戏!\n");
  18. break;
  19. default : //因为只有输入0/1,否则就是输入错误,需要重新输入
  20. printf("您的选择有误,请重新输入:\n");
  21. }
  22. } while (input);
  23. return 0;
  24. }

当我们选择play时,我们将进入游戏,之后就是游戏逻辑的代码了。

  1. #define ROW 9 //棋盘 行
  2. #define COL 9 //棋盘 列
  3. #define ROWS ROW+2 //判断-棋盘 行
  4. #define COLS COL+2 //判断-棋盘 列
  5. #define COUNT 10 //地雷个数

扫雷,我们需要创建两个二维数组,之后的操作与逻辑都是围绕这两个棋盘来写

一个用来展示覆盖与否的画面(代码中的  show数组):

一个用来记载着地雷的位置与判断(代码中的mine数组) :

  1. void game()
  2. {
  3. char mine[ROWS][COLS]; //注: ROWS COLS 为头文件define出来的行和列
  4. char show[ROWS][COLS];
  5. //初始化数据
  6. Initboard(mine, ROWS, COLS, '0');
  7. Initboard(show, ROWS, COLS, '*');
  8. //棋盘打印
  9. Displayboard(show, ROW, COL);
  10. //布置雷
  11. Setmine(mine, ROW, COL);
  12. //排查雷
  13. Findmine(mine, show, ROW, COL);
  14. //Displayboard(show, ROW, COL);
  15. }

     之后我们需要先把两个二维数组给初始化一下:

这里我们写一个函数Initboard

  1. //初始化棋盘
  2. void Initboard(char borad[ROWS][COLS], int rows, int cols,char set)
  3. {
  4. int i = 0;
  5. for (i = 0; i < rows; i++)
  6. {
  7. for (int j = 0; j < cols; j++)
  8. {
  9. borad[i][j] = set;
  10. }
  11. }
  12. }

我们将mine的二维数组都初始化为’0‘

        将show二维数组都初始化为’*‘

注:我们展示出来的一般都是show的二维数组
 

所以我们需要写一个格式函数

  1. //打印棋盘 //并设置格式
  2. void Displayboard(char borad[ROWS][COLS], int row, int col)
  3. {
  4. printf("======扫雷游戏======\n");
  5. int i = 0;
  6. for (i = 0; i <= row; i++)
  7. {
  8. printf("%d ", i);
  9. }
  10. printf("\n");
  11. for (int a = 1; a <=row; a++)
  12. {
  13. printf("%d ", a);
  14. for (int b = 1; b <= col; b++)
  15. {
  16. Sleep(10);
  17. printf("%c ", borad[a][b]);
  18. }
  19. printf("\n");
  20. }
  21. printf("======扫雷游戏======\n");
  22. }

展示出来就是这个样子。

游戏页面的大概就展示出来了,接下来我们需要写一下游戏判断逻辑了

首先我们需要埋雷,但雷的位置是随机的,所以我们需要用一下srand函数,把雷随机的放进mine二维数组中,就是随机生成一个坐标

        注:mine二维数组中 “0”代表该位置是安全的坐标

                                         “1”代表该位置是埋有地雷的坐标)

  1. //布置雷
  2. void Setmine(char mine[ROWS][COLS], int row, int col)
  3. {
  4. int count = COUNT; //COUNT代表的雷的个数,可以自己设置
  5. while (count)
  6. {
  7. int x = rand() % row + 1; //随机生成x坐标
  8. int y = rand() % col + 1; //随机生成y坐标
  9. if (mine[x][y] =='0')
  10. {
  11. mine[x][y] = '1'; //把mine二维数组的该位置改为1
  12. count--;
  13. } //代表着埋入地雷
  14. }
  15. }

接下来就是输入坐标来排查雷的步骤了

  1. //排查雷
  2. void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
  3. {
  4. int a = 0;
  5. int b= 0;
  6. int win = 0;
  7. while(win<row*col-COUNT){
  8. printf("请输入您的坐标:");
  9. scanf("%d", &a); //输入坐标x和y
  10. scanf("%d", &b);
  11. if ((a <= row + 1 && a > 0) && (b <= col + 1 && b > 0))
  12. { //这里需要用if来判断一下x和y的值是否大于坐标,不在这个范围就需要重新输入坐标
  13. if (mine[a][b] == '1') //这里判断的是如果坐标刚好在雷的位置,游戏就结束了
  14. {
  15. system("cls"); //清空屏幕
  16. printf("很抱歉,您被炸死了。\n");
  17. Displayboard(mine, ROW, COL); //当炸死后,这里在打印一下mine的棋盘
  18. Sleep(1000); //提示一下并答应雷的位置告诉玩家这里是雷
  19. break; //游戏结束后这里需要break一下结束这一层的循环
  20. }
  21. else
  22. {
  23. int count=Getminecount(mine,a,b);//Getminecount函数排查这个坐标周围有多少颗雷
  24. show[a][b] = count+'0';
  25. system("cls");
  26. Displayboard(show, ROW, COL);
  27. win++;
  28. }
  29. }
  30. else //当不在取值范围内就需要重新输入一下 并输出一个坐标有误的提示
  31. {
  32. printf("您输入的坐标有误,请重新输入:\n ");
  33. }
  34. }
  35. if (win == row * col - COUNT) 当把雷的排完后,就获胜了!
  36. {
  37. printf("恭喜你,排雷成功。\n");
  38. Displayboard(show, ROW, COL);
  39. }
  40. }

 该函数用于统计坐标周围有多少颗雷。

  1. //统计周围雷的个数
  2. int Getminecount(char mine[ROWS][COLS], int x, int y)
  3. {
  4. return (mine[x - 1][y - 1] +
  5. mine[x][y - 1] +
  6. mine[x + 1][y - 1] +
  7. mine[x + 1][y] +
  8. mine[x + 1][y + 1] +
  9. mine[x][y + 1] +
  10. mine[x - 1][y + 1] +
  11. mine[x - 1][y] - 8 * '0');
  12. }

下面是全代码: 

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<stdlib.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 COUNT 10 //地雷个数
  10. //初始化棋盘
  11. void Initboard(char borad[ROWS][COLS], int rows, int cols,char set)
  12. {
  13. int i = 0;
  14. for (i = 0; i < rows; i++)
  15. {
  16. for (int j = 0; j < cols; j++)
  17. {
  18. borad[i][j] = set;
  19. }
  20. }
  21. }
  22. //打印棋盘 //并设置格式
  23. void Displayboard(char borad[ROWS][COLS], int row, int col)
  24. {
  25. printf("======扫雷游戏======\n");
  26. int i = 0;
  27. for (i = 0; i <= row; i++)
  28. {
  29. printf("%d ", i);
  30. }
  31. printf("\n");
  32. for (int a = 1; a <=row; a++)
  33. {
  34. printf("%d ", a);
  35. for (int b = 1; b <= col; b++)
  36. {
  37. Sleep(10);
  38. printf("%c ", borad[a][b]);
  39. }
  40. printf("\n");
  41. }
  42. printf("======扫雷游戏======\n");
  43. }
  44. //布置雷
  45. void Setmine(char mine[ROWS][COLS], int row, int col)
  46. {
  47. int count = COUNT;
  48. while (count)
  49. {
  50. int x = rand() % row + 1;
  51. int y = rand() % col + 1;
  52. if (mine[x][y] =='0')
  53. {
  54. mine[x][y] = '1';
  55. count--;
  56. }
  57. }
  58. }
  59. //排查雷
  60. void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
  61. {
  62. int a = 0;
  63. int b= 0;
  64. int win = 0;
  65. while(win<row*col-COUNT){
  66. printf("请输入您的坐标:");
  67. scanf("%d", &a);
  68. scanf("%d", &b);
  69. // a = a / a * a;
  70. // b = b / b * b;
  71. if ((a <= row + 1 && a > 0) && (b <= col + 1 && b > 0))
  72. {
  73. if (mine[a][b] == '1')
  74. {
  75. system("cls");
  76. printf("很抱歉,您被炸死了。\n");
  77. Displayboard(mine, ROW, COL);
  78. Sleep(1000);
  79. break;
  80. }
  81. else
  82. {
  83. int count=Getminecount(mine,a,b);
  84. show[a][b] = count+'0';
  85. system("cls");
  86. Displayboard(show, ROW, COL);
  87. win++;
  88. }
  89. }
  90. else
  91. {
  92. printf("您输入的坐标有误,请重新输入:\n ");
  93. }
  94. }
  95. if (win == row * col - COUNT)
  96. {
  97. printf("恭喜你,排雷成功。\n");
  98. Displayboard(show, ROW, COL);
  99. }
  100. }
  101. //统计周围雷的个数
  102. int Getminecount(char mine[ROWS][COLS], int x, int y)
  103. {
  104. return (mine[x - 1][y - 1] +
  105. mine[x][y - 1] +
  106. mine[x + 1][y - 1] +
  107. mine[x + 1][y] +
  108. mine[x + 1][y + 1] +
  109. mine[x][y + 1] +
  110. mine[x - 1][y + 1] +
  111. mine[x - 1][y] - 8 * '0');
  112. }
  113. void menu()
  114. {
  115. printf(" ---------------------------- \n");
  116. printf("| 1.play |\n");
  117. printf("| 0.exit |\n");
  118. printf(" ---------------------------- \n");
  119. }
  120. void game()
  121. {
  122. char mine[ROWS][COLS];
  123. char show[ROWS][COLS];
  124. //初始化数据
  125. Initboard(mine, ROWS, COLS, '0');
  126. Initboard(show, ROWS, COLS, '*');
  127. //棋盘打印
  128. //Displayboard(mine, ROW, COL);
  129. Displayboard(show, ROW, COL);
  130. //布置雷
  131. Setmine(mine, ROW, COL);
  132. //排查雷
  133. Findmine(mine, show, ROW, COL);
  134. //Displayboard(show, ROW, COL);
  135. }
  136. int main()
  137. {
  138. srand((unsigned int)time(NULL));
  139. int input = 0;
  140. do {
  141. menu();
  142. printf("请选择>");
  143. scanf("%d", &input);
  144. switch (input)
  145. {
  146. case 1:
  147. printf("游戏开始!\n");
  148. Sleep(1000);
  149. system("cls");
  150. game();
  151. break;
  152. case 0:
  153. printf("\n即将退出游戏!\n");
  154. break;
  155. default :
  156. printf("您的选择有误,请重新输入:\n");
  157. }
  158. } while (input);
  159. return 0;
  160. }

 

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

闽ICP备14008679号