扫雷游戏(C语言)

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4 
  5 #define ROW 9  //
  6 #define COL 9  //
  7 
  8 #define EASY_COUNT 10  //雷数
  9 
 10 #define ROWS ROW+2
 11 #define COLS COL+2
 12 
 13 void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
 14 void DisplayBoard(char board[ROWS][COLS],int row,int col);
 15 void SetMine(char board[ROWS][COLS],int row,int col);
 16 void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
 17 
 18 //#include"game.h"
 19 
 20 //初始化
 21 void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
 22 {
 23     int i = 0;
 24     int j = 0;
 25     for(i=0;i<rows;i++)
 26     {
 27         for(j=0;j<cols;j++)
 28         {
 29             board[i][j]=set;
 30         }
 31     }
 32 }
 33 
 34 //打印棋盘
 35 void DisplayBoard(char board[ROWS][COLS],int row,int col)
 36 {
 37     int i = 0;
 38     int j = 0;
 39     for(i=0;i<=col;i++)
 40     {
 41         printf("%d ",i);//打印行数
 42     }
 43     printf("\n");
 44     for(i=1;i<=row;i++)
 45     {
 46         printf("%d ",i);
 47         for(j=1;j<=col;j++)//打印列数
 48         {
 49             printf("%c ",board[i][j]);//打印棋盘
 50         }
 51         printf("\n");
 52     }
 53 }
 54 
 55 //布置雷
 56 void SetMine(char board[ROWS][COLS],int row,int col)
 57 {
 58     int count = EASY_COUNT;
 59     while(count)
 60     {
 61         int x = rand() % row+1;//1~9
 62         int y = rand() % col+1;
 63         if(board[x][y] == '0' )
 64         {
 65             board[x][y] ='1';
 66             count--;
 67         }
 68     }
 69 }
 70 
 71 //判断周围雷的个数
 72 int get_mine_count(char mine[ROWS][COLS],int x,int y,int* win)
 73 {
 74     (*win)++;//计算无雷区域的个数,便于判断输赢
 75     return mine[x-1][y]+
 76         mine[x-1][y-1]+
 77         mine[x][y-1]+
 78         mine[x+1][y-1]+
 79         mine[x+1][y]+
 80         mine[x+1][y+1]+
 81         mine[x][y+1]+
 82         mine[x-1][y+1]-8*'0';
 83 }
 84 
 85 void Recursion(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y,int* win)
 86 {
 87     int res = get_mine_count(mine, x, y,win);
 88     int i;
 89     int arr[8][2] = {-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
 90     if (res == 0 )
 91     {
 92         show[x][y] = res+'0';
 93         for (i = 0; i < 8; ++i)
 94         {
 95             if (x + arr[i][0] >= 1 && x + arr[i][0] <= ROW && y + arr[i][1] >= 1 && y + arr[i][1] <= COL
 96                 && show[x + arr[i][0]][y + arr[i][1]] == '*')
 97                 Recursion(mine, show, x + arr[i][0], y + arr[i][1],win);//递归展开
 98         }
 99     }
100     else
101     {
102         show[x][y] = res + '0';
103     }
104 
105 }
106 
107 //扫雷
108 void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
109 {
110     int x = 0;
111     int y = 0;
112     int win = 0;
113     while(win<row*col-EASY_COUNT)
114     {
115         printf("请输入排除雷的坐标:");
116         scanf("%d%d",&x,&y);
117         if(show[x][y] !='*')
118         {
119             printf("此坐标已经排查过,请重新输入!\n");
120             DisplayBoard(show,row,col);
121             continue;
122         }
123         if(x>=1 && x<=row && y>=1 && y<=col)
124         {
125             
126             if(mine[x][y]=='1')
127             {
128                 printf("很遗憾,你输了\n");
129                 DisplayBoard(mine,row,col);
130                 break;
131             }
132             
133             else
134             {
135                 //int count=get_mine_count(mine,x,y);
136                 //show[x][y]=count+'0';
137                 Recursion(mine,show, x,y,&win);
138                 DisplayBoard(show,row,col);
139                 //win++;
140             }
141         }
142         else
143         {
144             printf("输入坐标非法,请重新输入!\n");
145         }
146     }
147     if(win==row*col-EASY_COUNT)
148     {
149         printf("恭喜你,排雷成功!\n");
150         DisplayBoard(mine,row,col);
151     }
152 }
153 
154 
155 //#include"game.h" 
156 
157 //菜单
158 void menu()
159 {
160     printf("************************\n");
161     printf("*******  1.play  *******\n");
162     printf("*******  0.exit  *******\n");
163     printf("************************\n");
164 }
165 
166 void game()
167 {
168     char mine[ROWS][COLS] ={ 0 };//雷的存储
169     char show[ROWS][COLS] ={ 0 };//棋盘
170     //初始化
171     InitBoard(mine,ROWS,COLS,'0'); 
172     InitBoard(show,ROWS,COLS,'*'); 
173     //打印棋盘
174     //DisplayBoard(mine,ROW,COL);
175     DisplayBoard(show,ROW,COL);
176     //布置雷
177     SetMine(mine,ROW,COL);
178     //DisplayBoard(mine,ROW,COL);
179     //扫雷 
180     FindMine(mine,show,ROW,COL);
181 }
182 
183 void test()
184 {
185     int input = 0;
186     srand((unsigned int)time(NULL));//通过时间戳设置随机数
187     do
188     {
189         menu();//菜单
190         printf("请选择:");
191         scanf("%d",&input);
192         switch(input)
193         {
194         case 1:
195             game();//扫雷游戏
196             break;
197         case 0:
198             printf("退出游戏\n");
199             break;
200         default:
201             printf("选择错误,请重新选择!\n");
202             break;
203         }
204     }while(input);
205 }
206 
207 int main()
208 {
209     test();
210     return 0;
211 }

 

posted @ 2021-08-26 20:37  1379号监听员"  阅读(78)  评论(0)    收藏  举报