C语言实现扫雷游戏:相邻地雷计数显示随机数问题求助
扫雷游戏相邻地雷计数显示异常的问题修复
你的相邻地雷计数逻辑是正确的,问题出在网格打印函数的输出语句上,导致显示随机值而非实际计数:
核心错误点
在printGrid函数中,当显示已揭露的非地雷单元格时,你使用了printf("%d");——这个语句没有传入要打印的grid[i][j]变量,程序会从栈中读取随机值输出,这就是你看到随机数的原因。同时,这里也缺少了空格,会导致数字挤在一起,格式混乱。
修正后的对应代码行应该是:
printf("%d ", grid[i][j]);
额外的标准规范问题
void main()不符合C语言标准,建议改为int main(),这是更规范的写法,避免编译器警告。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 10 #define COLUMNS 10 #define MINES 10 int grid[ROWS][COLUMNS]; int revealed[ROWS][COLUMNS]; void init() { int i, j; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLUMNS; j++) { grid[i][j] = 0; revealed[i][j] = 0; } } } void placeMines() { int i, x, y; for (i = 0; i < MINES; i++) { x = rand() % ROWS; y = rand() % COLUMNS; if (grid[x][y] == -1) { i--; } else { grid[x][y] = -1; } } } void countAdjacentMines() { int i, j, count; for (i = 0; i < ROWS; i++) { for (j = 0; j < COLUMNS; j++) { if (grid[i][j] == -1) { continue; } count = 0; if (i > 0 && j > 0 && grid[i - 1][j - 1] == -1) count++; if (i > 0 && grid[i - 1][j] == -1) count++; if (i > 0 && j < COLUMNS - 1 && grid[i - 1][j + 1] == -1) count++; if (j < COLUMNS - 1 && grid[i][j + 1] == -1) count++; if (i < ROWS - 1 && j < COLUMNS - 1 && grid[i + 1][j + 1] == -1) count++; if (i < ROWS - 1 && grid[i + 1][j] == -1) count++; if (i < ROWS - 1 && j > 0 && grid[i + 1][j - 1] == -1) count++; if (j > 0 && grid[i][j - 1] == -1) count++; grid[i][j] = count; } } } void printGrid() { int i, j; printf(" "); for (i = 0; i < COLUMNS; i++) { printf("%d ", i); } printf("\n"); for (i = 0; i < ROWS; i++) { printf("%d ", i); for (j = 0; j < COLUMNS; j++) { if (revealed[i][j]) { if (grid[i][j] == -1) { printf("* "); } else { // 修复:添加要打印的变量和空格 printf("%d ", grid[i][j]); } } else { printf("X "); } } printf("\n"); } } // 修复:改为符合标准的int main() int main() { int x, y; srand((unsigned int)time(NULL)); init(); placeMines(); countAdjacentMines(); while (1) { printGrid(); printf("Enter the coordinates of the cell to reveal (x y): "); scanf("%d %d", &x, &y); if (x < 0 || x >= ROWS || y < 0 || y >= COLUMNS) { printf("Invalid coordinates!\n"); } else if (revealed[x][y]) { printf("Cell already revealed!\n"); } else { revealed[x][y] = 1; if (grid[x][y] == -1) { printf("You hit a mine! Game over.\n"); break; } } } return 0; }
内容的提问来源于stack exchange,提问作者Timmy Forde
相关产品推荐
相关产品推荐

