map[8][8],1 表示有雷ui[8][8] 初始全 '+',揭開後顯示數字p[8][2] 定義 8 方向相對坐標#include
int main() {
char ui[8][8] = { {'+'} }; // 初始化全 '+'
int map[8][8] = { // 地雷分佈(1=有雷)
{0,0,0,0,0,0,0,0},
{0,0,1,0,0,1,0,0},
{0,0,0,0,1,0,0,0},
{0,0,0,0,0,1,0,0},
{0,0,1,0,0,0,0,0},
{0,0,1,0,0,0,0,0},
{0,1,0,1,1,0,0,0},
{1,0,0,0,0,0,0,0}
};
int p[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int h, l, win = 0;
while (1) {
// 1. 繪製界面
printf("掃雷遊戲\n");
for (int i=0; i<8; i++) {
for (int j=0; j<8; j++) printf("%c ", ui[i][j]);
printf("\n");
}
// 2. 獲取輸入
printf("請輸入要打開的位置 行 列: ");
scanf("%d%d", &h, &l);
h--; l--; // 轉 0 基索引
// 3. 踩雷判斷
if (map[h][l] == 1) {
printf("踩到雷 遊戲結束\n");
break;
}
// 4. 計算周圍雷數
int count = 0;
for (int i=0; i<8; i++) {
int nh = h + p[i][0], nl = l + p[i][1];
if (nh>=0 && nh<8 && nl>=0 && nl<8 && map[nh][nl]==1)
count++;
}
// 5. 更新顯示
ui[h][l] = '0' + count; // 數字轉字符
// 6. 勝利判斷
if (++win == 54) {
printf("獲勝 遊戲結束\n");
break;
}
}
return 0;
}
int p[8][2] = {
{-1,-1}, {-1,0}, {-1,1}, // 上三格
{0,-1}, {0,1}, // 左右
{1,-1}, {1,0}, {1,1} // 下三格
};
統一邊界檢查:nh>=0 && nh<8 && nl>=0 && nl<8
ui[h][l] = '0' + count; // 0-8 對應 ASCII '0'-'8'
比 switch 更簡潔高效。
srand(time(NULL)) + rand() 佈雷f 切換旗幟map vs 視圖層 ui