• C语言实现扫雷小游戏


    1.首先扫雷游戏要存储布置好的雷信息,需要一个二维数组

    不是雷放*  雷:#                       不是雷:0   雷:1 

    2. 给2个二维数组   9*9    一个存放雷的信息,一个存放布置好雷的信息

    3.为了防止在统计坐标周围的雷点个数的时候越界,我们让数组设计为11*11

    test.c.  - 测试游戏的代码

    game.c -游戏的实现

    game.h.   -游戏函数的声明

    初始化棋盘

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

    打印棋盘

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

    布置雷

    1. //布置雷
    2. void SetMine(char board[ROWS][COLS],int row,int col)
    3. {
    4. //布置10个雷
    5. //1.生成随机的坐标,布置雷
    6. int count = EASY_COUNT;
    7. while(count)
    8. {
    9. int x = rand() % row + 1;
    10. int y = rand() % col + 1;
    11. //判断布置的雷是否重复
    12. if(board[x][y] == '0')
    13. {
    14. board[x][y] = '1';
    15. count--;
    16. }
    17. }
    18. }

    排查雷和计算周围有几个雷

    1. //计算周围有几个雷
    2. int GetMineCount(char mine[ROWS][COLS],int x,int y)
    3. {
    4. return (mine[x-1][y]+mine[x-1][y-1]+mine[x][y-1]+
    5. mine[x+1][y-1]+mine[x+1][y]+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1] - 8 * '0');
    6. }
    7. //排查雷
    8. void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row ,int col)
    9. {
    10. int x = 0;
    11. int y = 0;
    12. int win = 0;
    13. while (win < row*col - EASY_COUNT)
    14. {
    15. printf("请输入要排查的坐标:>");
    16. scanf("%d %d", &x ,&y);
    17. if (x >= 1 && x <= row && y >=1 && y<=col)
    18. {
    19. if (mine[x][y] == '1')
    20. {
    21. printf("很遗憾,你被炸死了\n");
    22. DisplayBoard(mine,ROW,COL);
    23. break;
    24. } else
    25. {
    26. //该位置不是雷,就统计这个坐标周围有几个雷
    27. int count = GetMineCount(mine,x,y);
    28. show[x][y] = count + '0';//数字转化为字符 ,+'0'表示转化成ASCII
    29. DisplayBoard(show,ROW,COL);
    30. win++;
    31. }
    32. } else
    33. {
    34. printf("坐标非法,重新输入\n");
    35. }
    36. }
    37. if (win == row * col -EASY_COUNT)
    38. {
    39. printf("恭喜你,排雷成功\n");
    40. DisplayBoard(mine,ROW,COL);
    41. }
    42. }

    以下完整版代码:

    game.h文件

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

    game.c文件

    1. #include "game.h"
    2. //初始化棋盘
    3. void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
    4. {
    5. int i = 0;
    6. for(i = 0;i
    7. {
    8. int j = 0;
    9. for(j = 0;j < cols; j++)
    10. {
    11. board[i][j] = set;
    12. }
    13. }
    14. }
    15. //打印棋盘
    16. void DisplayBoard(char board[ROWS][COLS],int row,int col)
    17. {
    18. int i =0;
    19. printf("-----扫雷游戏-----\n");
    20. for(i = 0; i <= col ; i++)
    21. {
    22. printf("%d ",i);
    23. }
    24. printf("\n");
    25. for(i = 1;i <= row ;i++)
    26. {
    27. //行号
    28. printf("%d ",i);
    29. int j = 0;
    30. for(j = 1; j <= col;j++)
    31. {
    32. printf("%c ",board[i][j]);
    33. }
    34. printf("\n");
    35. }
    36. }
    37. //布置雷
    38. void SetMine(char board[ROWS][COLS],int row,int col)
    39. {
    40. //布置10个雷
    41. //1.生成随机的坐标,布置雷
    42. int count = EASY_COUNT;
    43. while(count)
    44. {
    45. int x = rand() % row + 1;
    46. int y = rand() % col + 1;
    47. //判断布置的雷是否重复
    48. if(board[x][y] == '0')
    49. {
    50. board[x][y] = '1';
    51. count--;
    52. }
    53. }
    54. }
    55. //计算周围有几个雷
    56. int GetMineCount(char mine[ROWS][COLS],int x,int y)
    57. {
    58. return (mine[x-1][y]+mine[x-1][y-1]+mine[x][y-1]+
    59. mine[x+1][y-1]+mine[x+1][y]+mine[x+1][y+1]+mine[x][y+1]+mine[x-1][y+1] - 8 * '0');
    60. }
    61. //排查雷
    62. void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row ,int col)
    63. {
    64. int x = 0;
    65. int y = 0;
    66. int win = 0;
    67. while (win < row*col - EASY_COUNT)
    68. {
    69. printf("请输入要排查的坐标:>");
    70. scanf("%d %d", &x ,&y);
    71. if (x >= 1 && x <= row && y >=1 && y<=col)
    72. {
    73. if (mine[x][y] == '1')
    74. {
    75. printf("很遗憾,你被炸死了\n");
    76. DisplayBoard(mine,ROW,COL);
    77. break;
    78. } else
    79. {
    80. //该位置不是雷,就统计这个坐标周围有几个雷
    81. int count = GetMineCount(mine,x,y);
    82. show[x][y] = count + '0';//数字转化为字符 ,+'0'表示转化成ASCII
    83. DisplayBoard(show,ROW,COL);
    84. win++;
    85. }
    86. } else
    87. {
    88. printf("坐标非法,重新输入\n");
    89. }
    90. }
    91. if (win == row * col -EASY_COUNT)
    92. {
    93. printf("恭喜你,排雷成功\n");
    94. DisplayBoard(mine,ROW,COL);
    95. }
    96. }

    test.c文件

    1. #include "game.h"
    2. void menu()
    3. {
    4. printf("****************************\n");
    5. printf("******** 1.play *****\n");
    6. printf("******** 0.play *****\n");
    7. printf("****************************\n");
    8. }
    9. void game()
    10. {
    11. char mine[ROWS][COLS];//存放布置好的雷
    12. char show[ROWS][COLS];//存放排查出的雷的信息
    13. //初始化棋盘
    14. //1.mine数组最开始全是'0'
    15. //2.show数组最开始全是'*'
    16. InitBoard(mine,ROWS,COLS,'0');
    17. InitBoard(show,ROWS,COLS,'*');
    18. //打印棋盘
    19. //DisplayBoard(mine,ROW,COL);
    20. DisplayBoard(show,ROW,COL);
    21. //1.布置雷
    22. SetMine(mine,ROW,COL);
    23. DisplayBoard(mine,ROW,COL);
    24. //2.排查雷
    25. FindMine(mine,show,ROW,COL);
    26. }
    27. int main()
    28. {
    29. int input = 0;
    30. srand((unsigned int)time(NULL));
    31. do
    32. {
    33. menu();
    34. printf("请选择:>");
    35. scanf("%d",&input);
    36. switch (input)
    37. {
    38. case 1:
    39. game();
    40. printf("扫雷\n");
    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. }

  • 相关阅读:
    一种ESDF地图实现方法:FIESTA
    韩国严厉监管元宇宙相关企业
    【原创】鲲鹏ARM构架openEuler操作系统安装Oracle 19c
    这一篇让你彻底搞懂 JAVA 内部类
    Mybatis plus 分页查询total为0 及日期类格式化配置
    php单独使用laravel数据库
    Kotlin面向对象
    【Rust】快速教程——冻结&表达式
    1775. 通过最少操作次数使数组的和相等
    acwing语法类最长公共后缀
  • 原文地址:https://blog.csdn.net/qq_61658398/article/details/132816225