• C语言习题练习8--扫雷游戏


    目录

    一、功能介绍

    二、数组的展示 

    1.布置雷

    2.排查雷的消息

     3.设置随机雷

     4.计算出所点出周围的雷

    ​  5.找雷过程

    三、测试过程

     四、全部代码


    一、功能介绍

    1. 显示该点周围雷的个数
    2. 第一次下子,不炸死
    3. 坐标周围没雷,可以实现展开
    4. 游戏结束后展示玩家用时

    二、数组的展示 

    核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置。

    使用宏常量,后期可以任意修改游戏难度。

    9*9数组 

    1.布置雷

    //因为排查的是周围一圈的雷,所以在9*9的边界处是无法找到一圈的雷,所以就要增加不布置雷的虚拟数组框,即就是11*11列数组

    //char类型数组

    //数组1&'1'是有区别的

    1. //布置雷
    2. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)//11*11数组
    3. {
    4. int i = 0;
    5. for (i = 0; i < rows; i++)
    6. {
    7. int j = 0;
    8. for (j = 0; j < cols; j++)
    9. {
    10. board[i][j] = set;
    11. }
    12. }
    13. }

    2.排查雷的消息

    1. //排查雷
    2. void DisplayBoard(char board[ROWS][COLS], int row, int col)
    3. {
    4. int i = 0;
    5. int j = 0;
    6. printf("---------扫雷----------\n");
    7. //控制列号
    8. for (j = 0; j <= col; j++)
    9. {
    10. printf("%d ", j);
    11. }
    12. printf("\n");
    13. for (i = 1; i <= row; i++)
    14. {
    15. printf("%d ", i);
    16. for (j = 1; j <= col; j++)
    17. {
    18. printf("%c ", board[i][j]);
    19. }
    20. printf("\n");
    21. }
    22. printf("---------扫雷----------\n");
    23. }
    1. DisplayBoard(mine, ROW, COL);
    2. DisplayBoard(show, ROW, COL);

    分解:

    1.先打印一行

     2.在打印9*10数组---分解:先打印一个数字,再用循环打印----------这样的操作进行9次

     3.设置随机雷

    1. void SetMine(char mine[ROWS][COLS], int row, int col)
    2. {
    3. int count = EASY_COUNT;
    4. while (count)//可以进行count次雷的布置
    5. {
    6. //1. 生成随机下标
    7. int x = rand() % row + 1;//随机坐标0--(row-1)//1--row
    8. int y = rand() % col + 1;
    9. //2. 布置雷
    10. //如果还没有被布置雷,就可以布置雷
    11. if (mine[x][y] == '0')//布置的字符
    12. {
    13. mine[x][y] = '1';
    14. count--;
    15. }
    16. }
    17. }

     4.计算出所点出周围的雷

    1. int get_mine_count(char mine[ROWS][COLS], int x, int y)
    2. {
    3. return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] +
    4. mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] +
    5. mine[x][y + 1] + mine[x - 1][y + 1] - 8*'0');
    6. }

    字符1和字符0之差的ascii值==字符1的个数

    (3条消息) a+'0' 和 a-'0'的区别_qianlyf的博客-CSDN博客

      5.找雷过程

    点中的部分---你被炸死了,退出

    未点中则算出所点部分周围的雷的数目

    点的地方已经放入东西了,则重新输入坐标

    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. if (x >= 1 && x <= row && y >= 1 && y <= col)//合法坐标
    11. {
    12. if (show[x][y] != '*')
    13. {
    14. printf("该坐标被排查过了\n");
    15. continue;
    16. }
    17. if (mine[x][y] == '1')
    18. {
    19. printf("很遗憾,你被炸死了\n");
    20. DisplayBoard(mine, ROW, COL);
    21. break;
    22. }
    23. else
    24. {
    25. int n = get_mine_count(mine, x, y);
    26. show[x][y] = n + '0';//周围的雷//数字加上字符0==数字变为字符类型
    27. DisplayBoard(show, ROW, COL);
    28. win++;
    29. }
    30. }
    31. else
    32. {
    33. printf("坐标非法,重新输入\n");
    34. }
    35. }
    36. if ( (row * col - EASY_COUNT)==win)
    37. {
    38. printf("恭喜你,排雷成功\n");
    39. DisplayBoard(mine, ROW, COL);
    40. }
    41. }

    三、测试过程

    #define EASY_COUNT 80

     四、全部代码

    #game.c

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include "game.h"
    3. void menu()
    4. {
    5. printf("**************************************\n");
    6. printf("**********欢迎来到扫雷游戏!**********\n");
    7. printf("**************************************\n");
    8. printf("********1-----游戏开始****************\n");
    9. printf("********2-----游戏结束****************\n");
    10. printf("**************************************\n");
    11. }
    12. //布置雷
    13. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)//11*11数组
    14. {
    15. int i = 0;
    16. for (i = 0; i < rows; i++)
    17. {
    18. int j = 0;
    19. for (j = 0; j < cols; j++)
    20. {
    21. board[i][j] = set;//9*9数列全部都放入“set”符号
    22. }
    23. }
    24. }
    25. //排查雷
    26. void DisplayBoard(char board[ROWS][COLS], int row, int col)//row,col为9
    27. {
    28. int i = 0;
    29. int j = 0;
    30. printf("---------扫雷----------\n");
    31. //控制列号
    32. for (j = 0; j <= col; j++)
    33. {
    34. printf("%d ", j);
    35. }
    36. printf("\n");
    37. for (i = 1; i <= row; i++)
    38. {
    39. printf("%d ", i);//先打印一个数字,在开始
    40. for (j = 1; j <= col; j++)
    41. {
    42. printf("%c ", board[i][j]);
    43. }
    44. printf("\n");
    45. }
    46. printf("---------扫雷----------\n");
    47. }
    48. //布置雷
    49. void SetMine(char mine[ROWS][COLS], int row, int col)
    50. {
    51. int count = EASY_COUNT;
    52. while (count)//可以进行count次雷的布置
    53. {
    54. //1. 生成随机下标
    55. int x = rand() % row + 1;//随机坐标0--(row-1)//1--row
    56. int y = rand() % col + 1;
    57. //2. 布置雷
    58. //如果还没有被布置雷,就可以布置雷
    59. if (mine[x][y] == '0')//布置的字符
    60. {
    61. mine[x][y] = '1';
    62. count--;
    63. }
    64. }
    65. }
    66. static int get_mine_count(char mine[ROWS][COLS], int x, int y)
    67. {
    68. return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] +mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] +
    69. mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
    70. }
    71. //找雷
    72. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
    73. {
    74. int x = 0;
    75. int y = 0;
    76. int win = 0;
    77. while (win < (row * col - EASY_COUNT))//除了雷全部点到了
    78. {
    79. printf("请输入要排查的坐标:>");
    80. scanf("%d %d", &x, &y);
    81. if (x >= 1 && x <= row && y >= 1 && y <= col)//合法坐标
    82. {
    83. if (show[x][y] != '*')
    84. {
    85. printf("该坐标被排查过了\n");
    86. continue;
    87. }
    88. if (mine[x][y] == '1')
    89. {
    90. printf("很遗憾,你被炸死了\n");
    91. DisplayBoard(mine, ROW, COL);
    92. break;
    93. }
    94. else
    95. {
    96. int n = get_mine_count(mine, x, y);
    97. show[x][y] = n + '0';//周围的雷//数字加上字符0==数字变为字符类型
    98. DisplayBoard(show, ROW, COL);
    99. win++;
    100. }
    101. }
    102. else
    103. {
    104. printf("坐标非法,重新输入\n");
    105. }
    106. }
    107. if ( (row * col - EASY_COUNT)==win)
    108. {
    109. printf("恭喜你,排雷成功\n");
    110. DisplayBoard(mine, ROW, COL);
    111. }
    112. }

    #test.c

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include "game.h"
    3. void game()
    4. {
    5. //1. 需要存放布置好的雷的信息,存放排查出的雷的信息,我们需要2个二维数组
    6. //2. 排查坐标的时候,为了防止坐标越界,我们给数组的行增加2行,列增加了2列
    7. char mine[ROWS][COLS] = { 0 };//布置好的雷的信息
    8. char show[ROWS][COLS] = { 0 };//排查出的雷的信息
    9. //初始化棋盘
    10. InitBoard(mine, ROWS, COLS, '0');//不打印,在这里布置雷
    11. InitBoard(show, ROWS, COLS, '*');//打印出的最终雷
    12. //打印棋盘
    13. /*DisplayBoard(mine, ROW, COL);*/
    14. DisplayBoard(show, ROW, COL);
    15. //布置雷
    16. SetMine(mine, ROW, COL);
    17. DisplayBoard(mine, ROW, COL);
    18. //排查雷,仅供展示,游戏中不展示此表格
    19. FindMine(mine, show, ROW, COL);
    20. }
    21. int main()
    22. {
    23. srand((unsigned int)time(NULL));
    24. int input = 0;
    25. do
    26. {
    27. menu();
    28. printf("请选择数字:");
    29. scanf("%d", &input);
    30. switch (input)
    31. {
    32. case 0:
    33. printf("退出游戏\n");
    34. break;
    35. case 1:
    36. game();
    37. break;
    38. default:
    39. printf("选择错误,请重新选择\n");
    40. break;
    41. }
    42. } while (input);
    43. menu();
    44. game();
    45. }

    #main.h

    1. #pragma once
    2. #define ROW 9
    3. #define COL 9
    4. #define ROWS ROW+2
    5. #define COLS COL+2
    6. #define EASY_COUNT 80
    7. #include
    8. #include
    9. #include
    10. void menu();
    11. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
    12. void DisplayBoard(char board[ROWS][COLS], int row, int col);
    13. void SetMine(char board[ROWS][COLS], int row, int col);
    14. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
    15. int get_mine_count(char mine[ROWS][COLS], int x, int y);

  • 相关阅读:
    Spring @ComponentScan 自定义扫描规则
    AI 从代码中自动生成注释文档
    三维医学图像处理系统(PACS)源码
    python毕业设计作品基于django框架 电影院购票选座系统毕设成品(5)任务书
    小样本利器3. 半监督最小熵正则 MinEnt & PseudoLabel代码实现
    Java多线程机制
    Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs笔记
    责任链模式之Tomcat Filter应用
    spring总结,从底层源码角度概括,一文看懂打通spring任督二脉
    [暑假]Vue生命周期-笔记
  • 原文地址:https://blog.csdn.net/m0_47017197/article/details/127827647