我找不到代码的错误。扫雷C

I can't find an error of the code. minesweeper C

当我在扫描中输入一些数字时,我正在尝试制作,如果有我的 (*),打印 boom,如果没有我的,打印它附近的地雷数量。我找不到代码的问题,但是有错误。发现问题请验证

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10

int main (void)
{
    char minefield [N][N];
    int i, j;
    int k;
    int x, y;
    int count;
    int mine_number;

    count = 0;
    mine_number = N*N/10;

    srand((long)time(NULL));


    for (k=1; 0< k < mine_number; k=k+1) {
        i = rand() % N;
        j = rand() % N;
        minefield [i][j] = '*';
    }

    for (i=0; i < N; i=i+1) {
        for (j=0; j < N; j=j+1) {
            count = 0;
            if (minefield[i][j] != '*') {
                if (i == 0) {
                    if (j == 0) {
                        if (minefield [i][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j] == '*') {
                            count = count + 1;
                        }
                    }
                    else if (j == N-1) {
                        if (minefield [i+1][j] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i][j-1] == '*') {
                            count = count + 1;
                        }
                    }

                    else {
                        if (minefield [i][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i][j-1] == '*') {
                            count = count + 1;
                        }
                    }
                }

                else if (i == N-1) {
                    if (j == 0) {
                        if (minefield [i-1][j] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i-1][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i][j+1] == '*') {
                            count = count + 1;
                        }
                    }

                    else if (j == N-1) {
                        if (minefield [i-1][j] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i-1][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i][j-1] == '*') {
                            count = count + 1;
                        }
                    }

                    else {
                        if (minefield [i][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i-1][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i-1][j] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i-1][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i][j-1] == '*') {
                            count = count + 1;
                        }
                    }
                }

                else {
                    if (j == 0) {
                        if (minefield [i-1][j] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i-1][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j] == '*') {
                            count = count + 1;
                        }
                    }

                    else if (j == N-1) {
                        if (minefield [i-1][j] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i-1][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j] == '*') {
                            count = count + 1;

                        }
                    }

                    else {
                        if (minefield [i-1][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i-1][j] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i-1][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i][j+1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j-1] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j] == '*') {
                            count = count + 1;
                        }
                        if (minefield [i+1][j+1] == '*') {
                            count = count + 1;
                        }
                    }
                }
            }
        }
    }

    scanf("%d %d", &x, &y);

    if (minefield[x][y] = '*') {
        printf("boom");
    }

    else {
        printf("%d", count);
    }

    return 0;
}

你的基本问题是你在阅读输入之前计数,即在你知道xy是什么之前。换句话说,目前你正在计算 "something" 整个雷区,这不是你想要的。

所以首先要做的是在数数之前阅读xy

此外,在我看来,您的大 if 声明很难读懂。您可以像这样重新组织它:

if (scanf("%d %d", &x, &y) != 2 || x < 0 || x >= N || y < 0 || y >= N)
{
    // Illegal input
    exit(1);
}

if (minefield[x][y] == '*') {
    printf("boom");
}
else {
    count = 0;

    if (x-1 >= 0 && y-1 >= 0) count += (minefield[x-1][y-1] == '*');
    if (x-1 >= 0) count += (minefield[x-1][y] == '*');
    ....
    .... Add code to cover all 8 combinations (i.e. add the 5 missing combinations)
    ....
    if (x+1 < N && y+1 < N) count += (minefield[x+1][y+1] == '*');

    printf("%d", count);
}