当前位置:   article > 正文

C语言实现扫雷_扫雷icon

扫雷icon

该程序实现了扫雷的基本功能,和上一篇三子棋一样,可以先写出扫雷实现的框架。它大致可以分为这么几部分:

            1)初始化棋盘

            2)显示棋盘

            3)布雷

            4)扫雷

其中扫雷部分可以再细化,该程序实现的功能有:

  • 第一次下子不会被炸死
  • 显示周围雷的个数
  • 坐标周围没雷,实现展开

    下面是程序部分 

(使用两个二维数组,为了方便统计雷的个数,在显示的数组周围加了一圈,如图所示,在布雷时这一圈都置0)


  • 头文件game.h

  1. #ifndef __GAME_H__
  2. #define __GAME_H__
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7. #define ROW 10
  8. #define COL 10
  9. #define ROWS ROW+2
  10. #define COLS COL+2
  11. #define MINE_COUNT 99
  12. //初始化棋盘
  13. void InitBoard(char board[ROWS][COLS],int row,int col,char set);
  14. //显示棋盘
  15. void Display(char board[ROWS][COLS],int row,int col);
  16. //布雷
  17. void SetMine(char mine[ROWS][COLS],int row,int col,int num);
  18. //统计雷的个数
  19. char CountMine(char mine[ROWS][COLS],int x,int y);
  20. //展开周围不是雷的地方
  21. void OpenMine(char mine[ROWS][COLS],char board[ROWS][COLS],int x,int y);
  22. //判断剩余多少雷
  23. int CountBoard(char board[ROWS][COLS],int row,int col);
  24. //第一次下子,不会被炸死
  25. void SafeMine(char mine[ROWS][COLS],char board[ROWS][COLS],int row,int col);
  26. #endif //__GAME_H__


  • 源文件game.c

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include "game.h"
  3. //初始化棋盘
  4. void InitBoard(char board[ROWS][COLS],int row,int col,char set)
  5. {
  6. memset(board,set,row*col*sizeof(board[0][0]));
  7. }
  8. //显示棋盘
  9. void Display(char board[ROWS][COLS],int row,int col)
  10. {
  11. int i = 0;
  12. int j = 0;
  13. printf(" 1 2 3 4 5 6 7 8 9 10\n");
  14. for(i=1;i<row-1;i++)
  15. {
  16. printf("%2d ",i);
  17. for(j=1;j<col-1;j++)
  18. {
  19. printf(" %c",board[i][j]);
  20. }
  21. printf("\n");
  22. }
  23. printf("\n");
  24. }
  25. //布雷
  26. void SetMine(char mine[ROWS][COLS],int row,int col,int count)
  27. {
  28. int x = 0;
  29. int y = 0;
  30. while(count)
  31. {
  32. x = rand()%(row-2) + 1;
  33. y = rand()%(col-2) + 1;
  34. if(mine[x][y]=='0')
  35. {
  36. mine[x][y] = '1';
  37. count--;
  38. }
  39. }
  40. }
  41. //统计雷的个数
  42. char CountMine(char mine[ROWS][COLS],int x,int y)
  43. {
  44. return (mine[x-1][y-1]+mine[x-1][y]+mine[x-1][y+1]+mine[x][y+1]+
  45. mine[x+1][y+1]+mine[x+1][y]+mine[x+1][y-1]+mine[x][y-1]-8*'0');
  46. }
  47. //展开周围不是雷的地方
  48. void OpenMine(char mine[ROWS][COLS],char board[ROWS][COLS],int x,int y)
  49. {
  50. if(mine[x-1][y-1] == '0')
  51. {
  52. board[x-1][y-1] = CountMine(mine,x-1,y-1) + '0';
  53. }
  54. if(mine[x-1][y] == '0')
  55. {
  56. board[x-1][y] = CountMine(mine,x-1,y) + '0';
  57. }
  58. if(mine[x-1][y+1] == '0')
  59. {
  60. board[x-1][y+1] = CountMine(mine,x-1,y+1) + '0';
  61. }
  62. if(mine[x][y+1] == '0')
  63. {
  64. board[x][y+1] = CountMine(mine,x,y+1) + '0';
  65. }
  66. if(mine[x+1][y+1] == '0')
  67. {
  68. board[x+1][y+1] = CountMine(mine,x+1,y+1) + '0';
  69. }
  70. if(mine[x+1][y] == '0')
  71. {
  72. board[x+1][y] = CountMine(mine,x+1,y) + '0';
  73. }
  74. if(mine[x+1][y-1] == '0')
  75. {
  76. board[x+1][y-1] = CountMine(mine,x+1,y-1) + '0';
  77. }
  78. if(mine[x][y-1] == '0')
  79. {
  80. board[x][y-1] = CountMine(mine,x,y-1) + '0';
  81. }
  82. }
  83. //判断剩余多少雷
  84. int CountBoard(char board[ROWS][COLS],int row,int col)
  85. {
  86. int i = 0;
  87. int j = 0;
  88. int count = 0;
  89. for(i=1;i<row-1;i++)
  90. {
  91. for(j=1;j<col-1;j++)
  92. {
  93. if(board[i][j] == '*')
  94. {
  95. count++;
  96. }
  97. }
  98. }
  99. return count;
  100. }
  101. //第一次下子,不会被炸死
  102. void SafeMine(char mine[ROWS][COLS],char board[ROWS][COLS],int row,int col)
  103. {
  104. while(1)
  105. {
  106. int x = 0;
  107. int y = 0;
  108. int num = 1;
  109. printf("请输入坐标:");
  110. scanf("%d%d",&x,&y);
  111. if((x>=1)&&(x<row-1)&&(y>=1)&&(y<col-1))
  112. {
  113. if(mine[x][y] == '1')//第一次踩雷,将雷移走
  114. {
  115. mine[x][y] = '0';
  116. board[x][y] = CountMine(mine,x,y) + '0';
  117. OpenMine(mine,board,x,y);
  118. Display(board,ROWS,COLS);
  119. SetMine(mine,ROWS,COLS,num);
  120. break;
  121. }
  122. else
  123. {
  124. if(mine[x][y] == '0')
  125. board[x][y] = CountMine(mine,x,y) + '0';
  126. OpenMine(mine,board,x,y);
  127. Display(board,ROWS,COLS);
  128. break;
  129. }
  130. }
  131. else
  132. {
  133. printf("坐标有误!\n");
  134. }
  135. }
  136. }


  • 源文件test.c

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include "game.h"
  3. void menu()
  4. {
  5. printf("**************************\n");
  6. printf("***** 1.play 0.exit *****\n");
  7. printf("**************************\n");
  8. }
  9. void game()
  10. {
  11. char board[ROWS][COLS] = {'0'};
  12. char mine[ROWS][COLS] = {'0'};
  13. int num = 0;
  14. //初始化棋盘和雷阵
  15. InitBoard(board,ROWS,COLS,'*');
  16. InitBoard(mine,ROWS,COLS,'0');
  17. //布雷
  18. SetMine(mine,ROWS,COLS,MINE_COUNT);
  19. Display(mine,ROWS,COLS);
  20. Display(board,ROWS,COLS);
  21. //排雷
  22. SafeMine(mine,board,ROWS,COLS);//防止第一次被炸死
  23. if(CountBoard(board,ROWS,COLS) == MINE_COUNT)//判断是不是一次就赢的情况
  24. {
  25. printf("恭喜你,排雷成功!\n");
  26. return;
  27. }
  28. Display(mine,ROWS,COLS);//如果第一次踩雷,显示转移后的雷阵
  29. Display(board,ROWS,COLS);
  30. while(1)
  31. {
  32. int x = 0;
  33. int y = 0;
  34. printf("请输入坐标:");
  35. scanf("%d%d",&x,&y);
  36. if((x>=1)&&(x<=ROW)&&(y>=1)&&(y<=COL))
  37. {
  38. if(mine[x][y] == '1')
  39. {
  40. printf("很遗憾,你被炸死!\n");
  41. return;
  42. }
  43. else
  44. {
  45. if(mine[x][y] == '0')
  46. board[x][y] = CountMine(mine,x,y) + '0';//如果是数字1,加上'0',就变成'1'
  47. OpenMine(mine,board,x,y);
  48. Display(board,ROWS,COLS);
  49. }
  50. }
  51. else
  52. {
  53. printf("坐标有误!\n");
  54. }
  55. if((num=CountBoard(board,ROWS,COLS))== MINE_COUNT)
  56. {
  57. printf("恭喜你,排雷成功!\n");
  58. Display(mine,ROWS,COLS);
  59. break;
  60. }
  61. }
  62. }
  63. void test()
  64. {
  65. int input = 0;
  66. srand((unsigned int)time(NULL));
  67. do
  68. {
  69. menu();
  70. printf("请选择:");
  71. scanf("%d",&input);
  72. switch(input)
  73. {
  74. case 0:
  75. printf("退出游戏\n");
  76. break;
  77. case 1:
  78. game();
  79. break;
  80. default:
  81. printf("输入错误\n");
  82. break;
  83. }
  84. }while(input);
  85. }
  86. int main()
  87. {
  88. test();
  89. return 0;
  90. }


声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号