扫雷游戏(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 }