1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 6 #define ROW 9 7 #define COL 9 8 #define MINE_COUNT 10 9 10 int Menu() 11 { 12 printf("=======================\n"); 13 printf("1.开始游戏\n"); 14 printf("0.结束游戏\n"); 15 printf("=======================\n"); 16 int choice = 0; 17 printf("请输入您的选择!\n"); 18 scanf("%d", &choice); 19 return choice; 20 } 21 22 void Init(char mine_map[ROW + 2][COL + 2], 23 char show_map[ROW + 2][COL + 2]) 24 { 25 //1.show_map都初始化成 * (表示没有翻开的位置) 26 for (int row = 0;row < ROW + 2;++row) 27 { 28 for (int col = 0;col < COL + 2;++col) 29 { 30 show_map[row][col] = ‘*‘; 31 } 32 } 33 //2.mine_map都初始化为‘0‘ 34 for (int row = 0;row < ROW + 2;++row) 35 { 36 for (int col = 0;col < COL + 2;++col) 37 { 38 mine_map[row][col] = ‘0‘; 39 } 40 } 41 //除了上面的方法还可以:利用memset对一段连续的内存空间进行赋值 42 //二维数组也是在一个连续的内存空间上 43 //memset(mine_map, ‘0‘, (ROW + 2)*(COL + 2)); 44 //memset(show_map, ‘*‘, (ROW + 2)*(COL + 2)); 45 46 //3.对mine_map进行雷阵的布置 47 int mine_count = MINE_COUNT; 48 while (mine_count > 0) 49 { 50 //这个循环尝试进行布雷,每次布置成功一个则mine_count-- 51 //magice number 52 int row = rand() % 9 + 1; 53 int col = rand() % 9 + 1; 54 if (mine_map[ROW][COL] == ‘1‘) 55 { 56 continue; 57 } 58 //当前位置可以用来设置地雷 59 mine_map[row][col] = ‘1‘; 60 --mine_count; 61 } 62 return; 63 } 64 65 void DisplayMap(char map[ROW + 2][COL + 2]) 66 { 67 //先打印四个空格 68 printf(" "); 69 //打印列的坐标 70 for (int i = 1;i <= COL;++i) 71 { 72 printf("%d ", i); 73 } 74 printf("\n"); 75 //第一行打印完成 76 //这里打印上边框 77 for (int i = 1;i <= COL;++i) 78 { 79 printf("---"); 80 } 81 printf("\n"); 82 //打印棋盘的每一行,注意,每一行最前面的要带上行号 83 for (int row = 1;row <= ROW;++row) 84 { 85 printf(" %d|", row); 86 for (int col = 1;col <= COL;++col) 87 { 88 printf("%c ", map[row][col]); 89 } 90 printf("\n"); 91 } 92 } 93 94 void UpdateShowMap(char mine_map[ROW + 2][COL + 2], 95 char show_map[ROW + 2][COL + 2], int row, int col) 96 { 97 //每次翻开一个格子的时候,如果这个格子不是雷,就需要跟新show_map 98 //把当前位置替换成一个数字(数字就表示了当前位置周围8个格子中有几个地雷) 99 int mine_count = 100 (mine_map[row - 1][col - 1] - ‘0‘) 101 + (mine_map[row - 1][col] - ‘0‘) 102 + (mine_map[row - 1][col + 1] - ‘0‘) 103 + (mine_map[row][col - 1] - ‘0‘) 104 + (mine_map[row][col + 1] - ‘0‘) 105 + (mine_map[row + 1][col - 1] - ‘0‘) 106 + (mine_map[row + 1][col] - ‘0‘) 107 + (mine_map[row + 1][col + 1] - ‘0‘); 108 //由于show_map中都是字符,需要把这个数字转换为字符 109 show_map[row][col] = mine_count + ‘0‘; 110 } 111 112 void Game() 113 { 114 printf("‘0‘表示没有地雷,‘1‘表示有地雷\n"); 115 //1.设定一个二维数组,作为表示地雷的地图,‘0‘表示没有地雷,‘1‘表示有地雷 116 // 设定一个二维数组,作为给玩家看的地图,每个位置是否被翻开,如果翻开 117 //在此处加了2表示加了一圈边框: 118 char mine_map[ROW + 2][COL + 2]; 119 char show_map[ROW + 2][COL + 2]; 120 //2.对地图进行初始化(包含布置地雷的过程) 121 Init(mine_map, show_map); 122 int blank_not_mine_count = 0;//不是雷的个数 123 //3.先打印一下初始地图 124 DisplayMap(show_map); 125 while (1) 126 { 127 //4.提示玩家输入一组坐标,并且对玩家输入进行合法性检查 128 printf("请输入一组坐标(row col):"); 129 int row = 0; 130 int col = 0; 131 scanf("%d %d", &row, &col); 132 //row,col的有效范围[1,row][1,col]地图上有边框 133 if (row<1 || row>ROW || col<1 || col>COL) 134 { 135 printf("您输入的坐标非法,请重新输入:\n"); 136 continue; 137 } 138 //5.提示玩家翻开的位置是否是地雷,如果是地图就游戏结束 139 if (mine_map[row][col] == ‘1‘) 140 { 141 printf("您踩雷了,游戏结束!\n"); 142 //玩家踩雷后,需要告诉玩家当前地图上都有哪些位置是地雷 143 DisplayMap(mine_map); 144 break; 145 } 146 //6.如果当前位置已经把最后一个不是雷的位置翻开了,游戏结束,玩家胜利 147 ++blank_not_mine_count; 148 if (blank_not_mine_count == ROW * COL - MINE_COUNT) 149 { 150 printf("扫雷成功!\n"); 151 DisplayMap(mine_map); 152 break; 153 } 154 //7.把这个位置翻开,并计算当前位置周围8个格子中包含几个雷 155 UpdateShowMap(mine_map, show_map, row, col); 156 DisplayMap(show_map); 157 //回到3循环执行 158 159 } 160 161 } 162 163 int main() 164 { 165 while (1) 166 { 167 int choice = Menu(); 168 if (choice == 1) 169 { 170 Game(); 171 } 172 else 173 { 174 printf("Goodbye!\n"); 175 break; 176 } 177 } 178 179 180 181 return 0; 182 }
原文地址:https://www.cnblogs.com/cuckoo-/p/10357769.html
时间: 2025-01-13 09:02:19