• 扫雷小游戏(简单详细)(内附完整代码)


     设计总体思路

    实现游戏可以一直玩,先打印棋盘,玩家和电脑下棋,最后分出胜负。

    如果编写较大的程序,我们可以分不同模块

    例如这个扫雷,我们可以创建三个文件

    分别为:

    1. game.h     函数的声明
    2. game.c     函数的实现
    3. test.c        测试游戏逻辑

    一、打印游戏菜单界面

    首先要有开始界面并且有选项选择,开始你的游戏,代码以及效果图如下:

    1. void menu()
    2. {
    3. printf("*********************************************\n");
    4. printf("************* 1. play *********\n");
    5. printf("************* 0. exit *********\n");
    6. printf("*********************************************\n");
    7. }
    8. int main()
    9. {
    10. srand((unsigned int)time(NULL)); //随机数 无符号整型 时间戳
    11. //头文件:stdlib.h time.h
    12. int input = 0;
    13. do
    14. {
    15. menu(); //先打印菜单
    16. printf("请选择>:"); //选项选择
    17. scanf("%d", &input);
    18. switch(input)
    19. {
    20. case 1:
    21. game();
    22. break;
    23. case 0:
    24. printf("退出游戏\n");
    25. break;
    26. default:
    27. printf("选择错误,重新选择\n");
    28. break;
    29. }
    30. } while (input);
    31. return 0;
    32. }

    二、初始化棋盘

    test.c

    1. void game()
    2. {
    3. //mine数组是专门存放布置好的雷的信息
    4. char mine[ROWS][COLS] = {0};
    5. //show数组是专门存放排查出的雷的信息
    6. char show[ROWS][COLS] = {0};
    7. //初始化棋盘
    8. InitBoard(mine, ROWS, COLS, '0');//'0'
    9. InitBoard(show, ROWS, COLS, '*');//'*'
    10. }

    game.c

    1. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
    2. {
    3. int i = 0;
    4. int j = 0;
    5. for (i = 0; i < rows; i++)
    6. {
    7. for (j = 0; j < cols; j++)
    8. {
    9. board[i][j] = set; #因为两次调用,数组填充不同,set("0","*")
    10. }
    11. }
    12. }

    三、打印棋盘

    test.c

    1. //打印棋盘
    2. DisplayBoard(show, ROW, COL); //打印show数组

    game.c

    1. void DisplayBoard(char board[ROWS][COLS], int row, int col)
    2. {
    3. int i = 0;
    4. int j = 0;
    5. printf("******* 扫雷 *******\n");
    6. for (j = 0; j <= col; j++)
    7. {
    8. printf("%d ", j);
    9. }
    10. printf("\n");
    11. for (i = 1; i <= row; i++)
    12. {
    13. printf("%d ", i);
    14. for (j = 1; j <= col; j++)
    15. {
    16. printf("%c ", board[i][j]);
    17. }
    18. printf("\n");
    19. }
    20. }

    四、布置雷

    test.c

    1. //布置雷
    2. SetMine(mine,ROW,COL);

    game.c

    1. void SetMine(char mine[ROWS][COLS], int row, int col)
    2. {
    3. int count = EASY_COUNT;
    4. while (count)
    5. {
    6. //rand()随机生成范围0-32767
    7. int x = rand() % row + 1;
    8. int y = rand() % col + 1;
    9. if (mine[x][y] == '0')
    10. {
    11. mine[x][y] = '1';
    12. count--;
    13. }
    14. }
    15. }

    五、排查雷

    test.c

    1. //排查雷
    2. FindMine(mine,show,ROW,COL);

    game.c

    1. int GetMineCount(char mine[ROWS][COLS], int x, int y)
    2. {
    3. return (mine[x - 1][y] +
    4. 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] - 8 * '0');
    11. }
    12. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
    13. {
    14. int x = 0;
    15. int y = 0;
    16. int win = 0;
    17. while (win
    18. {
    19. printf("请输入要排查的坐标>:");
    20. scanf("%d %d", &x, &y);
    21. if (x >= 1 && x <= row && y >= 1 && y <= col)
    22. {
    23. if (show[x][y] == '*')
    24. {
    25. if (mine[x][y] == '1')
    26. {
    27. printf("很遗憾,你被炸死了\n");
    28. DisplayBoard(mine, ROW, COL);
    29. break;
    30. }
    31. else
    32. {
    33. //如果该坐标不是雷,就要统计这个坐标周围有几个雷
    34. int count = GetMineCount(mine, x, y);
    35. show[x][y] = count + '0';
    36. DisplayBoard(show, ROW, COL);
    37. win++;
    38. }
    39. }
    40. else
    41. {
    42. printf("该位置已经被排查\n");
    43. }
    44. }
    45. else
    46. {
    47. printf("排查的坐标非法,请重新输入\n");
    48. }
    49. }
    50. if (win == row * col - EASY_COUNT)
    51. {
    52. printf("恭喜你,排雷成功\n");
    53. DisplayBoard(mine, ROW, COL);
    54. }
    55. }

    六、最后整理代码(完整代码)

    game.h

    1. #include
    2. #include
    3. #include
    4. //初始化棋盘
    5. void InitBoard(char board[ROWS][COLS],int rows, int cols, char set);
    6. //打印棋盘
    7. void DisplayBoard(char board[ROWS][COLS], int row, int col);
    8. //布置雷
    9. void SetMine(char mine[ROWS][COLS], int row, int col);
    10. //排查雷
    11. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

    game.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include"game.h"
    3. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
    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. board[i][j] = set;
    12. }
    13. }
    14. }
    15. void DisplayBoard(char board[ROWS][COLS], int row, int col)
    16. {
    17. int i = 0;
    18. int j = 0;
    19. printf("******* 扫雷 *******\n");
    20. for (j = 0; j <= col; j++)
    21. {
    22. printf("%d ", j);
    23. }
    24. printf("\n");
    25. for (i = 1; i <= row; i++)
    26. {
    27. printf("%d ", i);
    28. for (j = 1; j <= col; j++)
    29. {
    30. printf("%c ", board[i][j]);
    31. }
    32. printf("\n");
    33. }
    34. }
    35. void SetMine(char mine[ROWS][COLS], int row, int col)
    36. {
    37. int count = EASY_COUNT;
    38. while (count)
    39. {
    40. //rand()随机生成范围0-32767
    41. int x = rand() % row + 1;
    42. int y = rand() % col + 1;
    43. if (mine[x][y] == '0')
    44. {
    45. mine[x][y] = '1';
    46. count--;
    47. }
    48. }
    49. }
    50. int GetMineCount(char mine[ROWS][COLS], int x, int y)
    51. {
    52. return (mine[x - 1][y] +
    53. mine[x - 1][y - 1] +
    54. mine[x][y - 1] +
    55. mine[x + 1][y - 1] +
    56. mine[x + 1][y] +
    57. mine[x + 1][y + 1] +
    58. mine[x][y + 1] +
    59. mine[x - 1][y + 1] - 8 * '0');
    60. }
    61. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
    62. {
    63. int x = 0;
    64. int y = 0;
    65. int win = 0;
    66. while (win
    67. {
    68. printf("请输入要排查的坐标>:");
    69. scanf("%d %d", &x, &y);
    70. if (x >= 1 && x <= row && y >= 1 && y <= col)
    71. {
    72. if (show[x][y] == '*')
    73. {
    74. if (mine[x][y] == '1')
    75. {
    76. printf("很遗憾,你被炸死了\n");
    77. DisplayBoard(mine, ROW, COL);
    78. break;
    79. }
    80. else
    81. {
    82. //如果该坐标不是雷,就要统计这个坐标周围有几个雷
    83. int count = GetMineCount(mine, x, y);
    84. show[x][y] = count + '0';
    85. DisplayBoard(show, ROW, COL);
    86. win++;
    87. }
    88. }
    89. else
    90. {
    91. printf("该位置已经被排查\n");
    92. }
    93. }
    94. else
    95. {
    96. printf("排查的坐标非法,请重新输入\n");
    97. }
    98. }
    99. if (win == row * col - EASY_COUNT)
    100. {
    101. printf("恭喜你,排雷成功\n");
    102. DisplayBoard(mine, ROW, COL);
    103. }
    104. }

    test.c

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include"game.h"
    3. void menu()
    4. {
    5. printf("*********************************************\n");
    6. printf("************* 1. play *********\n");
    7. printf("************* 0. exit *********\n");
    8. printf("*********************************************\n");
    9. }
    10. void game()
    11. {
    12. //mine数组是专门存放布置好的雷的信息
    13. char mine[ROWS][COLS] = {0};
    14. //show数组是专门存放排查出的雷的信息
    15. char show[ROWS][COLS] = {0};
    16. //初始化棋盘
    17. InitBoard(mine, ROWS, COLS, '0');//'0'
    18. InitBoard(show, ROWS, COLS, '*');//'*'
    19. //打印棋盘
    20. DisplayBoard(show, ROW, COL);
    21. //布置雷
    22. SetMine(mine,ROW,COL);
    23. //DisplayBoard(mine, ROW, COL);
    24. //排查雷
    25. FindMine(mine,show,ROW,COL);
    26. }
    27. int main()
    28. {
    29. srand((unsigned int)time(NULL)); //随机数 无符号整型 时间戳
    30. //头文件:stdlib.h time.h
    31. int input = 0;
    32. do
    33. {
    34. menu(); //先打印菜单
    35. printf("请选择>:"); //选项选择
    36. scanf("%d", &input);
    37. switch (input)
    38. {
    39. case 1:
    40. game();
    41. break;
    42. case 0:
    43. printf("退出游戏\n");
    44. break;
    45. default:
    46. printf("选择错误,重新选择\n");
    47. break;
    48. }
    49. } while (input);
    50. return 0;
    51. }

    七、游戏展示

    个人建议第一个坐标填1 1(这样比较好排)

    扩展:

    1. 展开一片

    2. 标记是否是雷

    3. 计时器

    4. 记录剩余雷数量

    展开一片满足下列条件:

    1. 该坐标不是雷
    2. 该坐标周围没有雷
    3. 该坐标没有被排查过

    满足就再遍历该坐标周围的八个坐标

    本文是简单版的扫雷,之后我会出一个进阶版的扫雷

    希望会对你有所帮助

  • 相关阅读:
    猿创征文 |【数据结构】3个例题带你搞定图的遍历:深度优先搜索
    探索数字安全的卓越之选 - Digicert证书
    iNeuOS工业互联网操作系统,三维(3D)模型在线编辑应用和实时数据统计(和值、均值、众数、方差、中位数等)
    2022年下半年信息系统项目管理师下午真题及答案解析
    UDP协议之《传输队列长度sk_wmem_alloc统计》
    基于JAVA游戏资讯网站计算机毕业设计源码+系统+数据库+lw文档+部署
    异或的4种堪称神奇的运用场景
    17. Go并发编程
    基于SSH的二手货交易平台的设计与实现(lunwen+任务书+翻译及原文+项目源码+sql文件)
    3.1-OR59 字符串中找出连续最长的数字串
  • 原文地址:https://blog.csdn.net/Starry__Sky222/article/details/133490119