You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:25:33