小游戏系列——低配版扫雷

举报
安然无虞 发表于 2022/05/27 00:07:12 2022/05/27
【摘要】 目录 一、测试游戏逻辑 二、封装游戏函数 1.游戏菜单 2.创建雷区 3.初始化雷区 4.打印雷区 5.布置雷 6.排雷 三、完整代码 1.声明 2.定义 3.测试 四、结语 【前言】 更新一款小游戏,想必大家应该都玩过扫雷,今天咱们自己实现一个。 一、测试游戏逻辑 #include<...

目录

一、测试游戏逻辑

二、封装游戏函数

1.游戏菜单

2.创建雷区

3.初始化雷区

4.打印雷区

5.布置雷

6.排雷

三、完整代码

1.声明

2.定义

3.测试

四、结语


【前言】

更新一款小游戏,想必大家应该都玩过扫雷,今天咱们自己实现一个。

一、测试游戏逻辑


  
  1. #include<stdio.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. int input = 0;
  12. do
  13. {
  14. menu();
  15. printf("请选择:>");
  16. scanf("%d", &input);
  17. switch (input)
  18. {
  19. case 1:
  20. printf("扫雷\n");
  21. break;
  22. case 0:
  23. printf("退出游戏\n");
  24. break;
  25. default:
  26. printf("选择错误,请重新选择\n");
  27. break;
  28. }
  29. } while (input);
  30. }
  31. int main()
  32. {
  33. test();
  34. return 0;
  35. }

 

经过测试发现以上代码逻辑没有问题,我们只需要将“扫雷”那块内容封装成函数即可。 

二、封装游戏函数

先简单看一下封装后的运行效果:

虽然被炸死了,但是看起来还不错哦。

1.游戏菜单

选择1:玩游戏;

选择0:退出游戏

代码执行:


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

2.创建雷区


  
  1. //雷区是9行9列的
  2. #define ROW 9
  3. #define COL 9
  4. //为了防止排查时出现越界将雷区扩大至11行11列
  5. #define ROWS ROW+2
  6. #define COLS COL+2
  7. #define EASY_COUNT 10//布置10个雷
  8. //需要创建两个数组
  9. char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息
  10. char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息

【敲黑板】:之所以选择宏定义的方式,有两点原因:

        一是方便程序的修改;

        二可以提高程序的可读性

3.初始化雷区

注意哦,需要初始化两个区域,一个用于存放布置好雷的信息,初始时用字符0;另外一个用于存放排查出雷的信息,初始时用字符*


  
  1. //初始化mine数组为全'0'
  2. InitBoard(mine, ROWS, COLS, '0');
  3. //初始化show数组为全'*'
  4. InitBoard(show, ROWS, COLS, '*');
  5. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
  6. {
  7. int i = 0;
  8. int j = 0;
  9. for (i = 0; i < rows; i++)
  10. {
  11. for (j = 0; j < cols; j++)
  12. {
  13. board[i][j] = set;
  14. }
  15. }
  16. }

4.打印雷区

【敲黑板】:注意对于行号和列号的打印。方便玩家使用 

代码执行: 


  
  1. void DisplayBoard(char board[ROWS][COLS], int row, int col)
  2. {
  3. int i = 0;
  4. int j = 0;
  5. //列号的打印
  6. for (i = 0; i <= col; i++)
  7. {
  8. printf("%d ", i);
  9. }
  10. putchar('\n');
  11. //打印1~9列、行
  12. for (i = 1; i <= row; i++)
  13. {
  14. printf("%d ", i);//打印行号
  15. for (j = 1; j <= col; j++)
  16. {
  17. printf("%c ", board[i][j]);
  18. }
  19. putchar('\n');
  20. }
  21. }

5.布置雷

在mine数组中布置雷。

代码执行:


  
  1. void SetMine(char mine[ROWS][COLS], int row, int col)
  2. {
  3. int count = EASY_COUNT;//随机布置10个雷
  4. while (count)
  5. {
  6. int x = rand() % row + 1;//1~9 --- 某个数模上9,结果一定是0~8之间的数
  7. int y = rand() % col + 1;
  8. //坐标是'1',就是雷;是'0',就不是雷
  9. if (mine[x][y] == '0')
  10. {
  11. mine[x][y] = '1';
  12. count--;//布置完一个雷就要--
  13. }
  14. }
  15. }

对于rand()函数的使用在这里就不赘述咯,之前的博文中已经提过两次啦。

6.排雷

代码执行:


  
  1. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
  2. {
  3. int x = 0;
  4. int y = 0;
  5. int win = 0;
  6. while (win < row * col - EASY_COUNT)
  7. {
  8. printf("请输入要排查的坐标:>");
  9. scanf("%d %d", &x, &y);
  10. //保证坐标的合法性
  11. if (x >= 1 && x <= row && y >= 1 && y <= col)
  12. {
  13. if (mine[x][y] == '1')
  14. {
  15. printf("很遗憾你被炸死了\n");
  16. DisplayBoard(mine, row, col);
  17. break;
  18. }
  19. else
  20. {
  21. //计算x、y坐标周围有几个雷
  22. int n = get_mine_count(mine, x, y);
  23. //注意哦,数字加上字符0,可以转化为对应的数字字符 比如2 + '0' == '2'(2 + 48 == 50)
  24. show[x][y] = n + '0';
  25. DisplayBoard(show, row, col);
  26. win++;
  27. }
  28. }
  29. else
  30. {
  31. printf("输入坐标非法,无法排雷,请重新输入\n");
  32. }
  33. }
  34. if (win == row * col - EASY_COUNT)
  35. {
  36. printf("恭喜你,排雷成功\n");
  37. DisplayBoard(mine, row, col);
  38. }
  39. }

这里面调用了一个用于计算x,y周围有几个雷的函数,所以要在外边实现以下。


  
  1. //用static之后,这个函数只能在这个文件中使用
  2. static int get_mine_count(char mine[ROWS][COLS], int x, int y)
  3. {
  4. //x,y不会越界,设计数组的时候就已经安排好了
  5. return mine[x - 1][y - 1] +
  6. mine[x - 1][y] +
  7. mine[x - 1][y + 1] +
  8. mine[x][y - 1] +
  9. mine[x][y + 1] +
  10. mine[x + 1][y - 1] +
  11. mine[x + 1][y] +
  12. mine[x + 1][y + 1] - 8 * '0';
  13. }

这下就能感受到为什么采用的是11行11列的好处了吧。

总的来说,这个小游戏比之前的井字棋要容易实现一些。

三、完整代码

这个小游戏是按照项目工程来写的,分为声明、定义和测试。

1.声明


  
  1. //此处需要自己定义一个头文件"game.h"
  2. #pragma once
  3. #include<stdio.h>
  4. #include<time.h>
  5. #include<stdlib.h>
  6. #define ROW 9
  7. #define COL 9
  8. #define ROWS ROW+2
  9. #define COLS COL+2
  10. #define EASY_COUNT 10
  11. //初始化棋盘
  12. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
  13. //打印棋盘
  14. void DisplayBoard(char board[ROWS][COLS], int row, int col);
  15. //布置雷
  16. void SetMine(char mine[ROWS][COLS], int row, int col);
  17. //排雷
  18. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

2.定义


  
  1. //此处需要自己定义一个源文件"game.c"
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #include"game.h"
  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. void DisplayBoard(char board[ROWS][COLS], int row, int col)
  17. {
  18. int i = 0;
  19. int j = 0;
  20. //列号的打印
  21. for (i = 0; i <= col; i++)
  22. {
  23. printf("%d ", i);
  24. }
  25. putchar('\n');
  26. //打印1~9列、行
  27. for (i = 1; i <= row; i++)
  28. {
  29. printf("%d ", i);//打印行号
  30. for (j = 1; j <= col; j++)
  31. {
  32. printf("%c ", board[i][j]);
  33. }
  34. putchar('\n');
  35. }
  36. }
  37. void SetMine(char mine[ROWS][COLS], int row, int col)
  38. {
  39. int count = EASY_COUNT;//随机布置10个雷
  40. while (count)
  41. {
  42. int x = rand() % row + 1;//1~9 --- 某个数模上9,结果一定是0~8之间的数
  43. int y = rand() % col + 1;
  44. //坐标是'1',就是雷;是'0',就不是雷
  45. if (mine[x][y] == '0')
  46. {
  47. mine[x][y] = '1';
  48. count--;//布置完一个雷就要--
  49. }
  50. }
  51. }
  52. //用static之后,这个函数只能在这个文件中使用
  53. static int get_mine_count(char mine[ROWS][COLS], int x, int y)
  54. {
  55. //x,y不会越界,设计数组的时候就已经安排好了
  56. return mine[x - 1][y - 1] +
  57. mine[x - 1][y] +
  58. mine[x - 1][y + 1] +
  59. mine[x][y - 1] +
  60. mine[x][y + 1] +
  61. mine[x + 1][y - 1] +
  62. mine[x + 1][y] +
  63. mine[x + 1][y + 1] - 8 * '0';
  64. }
  65. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
  66. {
  67. int x = 0;
  68. int y = 0;
  69. int win = 0;
  70. while (win < row * col - EASY_COUNT)
  71. {
  72. printf("请输入要排查的坐标:>");
  73. scanf("%d %d", &x, &y);
  74. //保证坐标的合法性
  75. if (x >= 1 && x <= row && y >= 1 && y <= col)
  76. {
  77. if (mine[x][y] == '1')
  78. {
  79. printf("很遗憾你被炸死了\n");
  80. DisplayBoard(mine, row, col);
  81. break;
  82. }
  83. else
  84. {
  85. //计算x、y坐标周围有几个雷
  86. int n = get_mine_count(mine, x, y);
  87. //注意哦,数字加上字符0,可以转化为对应的数字字符 比如2 + '0' == '2'(2 + 48 == 50)
  88. show[x][y] = n + '0';
  89. DisplayBoard(show, row, col);
  90. win++;
  91. }
  92. }
  93. else
  94. {
  95. printf("输入坐标非法,无法排雷,请重新输入\n");
  96. }
  97. }
  98. if (win == row * col - EASY_COUNT)
  99. {
  100. printf("恭喜你,排雷成功\n");
  101. DisplayBoard(mine, row, col);
  102. }
  103. }

3.测试


  
  1. //此处需要自己定义一个源文件"test.c"
  2. #define _CRT_SECURE_NO_WARNINGS 1
  3. #include"game.h"
  4. void menu()
  5. {
  6. printf("****************************\n");
  7. printf("******* 1.play *******\n");
  8. printf("******* 0.exit *******\n");
  9. printf("****************************\n");
  10. }
  11. void game()
  12. {
  13. //创建数组
  14. char mine[ROWS][COLS] = { 0 };//存放布置好的雷的信息
  15. char show[ROWS][COLS] = { 0 };//存放排查出的雷的信息
  16. //初始化mine数组为全'0'
  17. InitBoard(mine, ROWS, COLS, '0');
  18. //初始化show数组为全'*'
  19. InitBoard(show, ROWS, COLS, '*');
  20. //布置雷
  21. SetMine(mine, ROW, COL);
  22. //打印棋盘--很有讲究哦,尤其要注意行号和列号的打印
  23. DisplayBoard(show, ROW, COL);//先在mine中布置雷,然后在show数组中打印
  24. //打印棋盘--很有讲究哦,尤其要注意行号和列号的打印
  25. //DisplayBoard(mine, ROW, COL);
  26. //排雷
  27. FindMine(mine, show, ROW, COL);
  28. }
  29. int main()
  30. {
  31. int input = 0;
  32. srand((unsigned int)time(NULL));
  33. do
  34. {
  35. menu();
  36. printf("请选择:>");
  37. scanf("%d", &input);
  38. switch (input)
  39. {
  40. case 1:
  41. game();
  42. break;
  43. case 0:
  44. printf("退出游戏\n");
  45. break;
  46. default:
  47. printf("选择错误,请重新选择\n");
  48. break;
  49. }
  50. } while (input);
  51. return 0;
  52. }

也就是下面这样:

四、结语

由于笔者选择的是后端开发,所以界面这块暂时就没有学,等到后面可能会学一些,但是不影响玩游戏哦。 OK,溜了溜了。

 

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121300751

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。