我的扫雷项目遇到问题

时间:2020-10-08 08:32:50

标签: c

我做了扫雷车,但是有问题。
我想使用*显示地雷,但它显示0

即使我指向地雷所在的位置,此扫雷车也永远不会停止。

当我打印数组matrixMine[][]时,它显示如下。

1 0 0 1 0 0 0 0 0 
0 0 0 0 0 1 1 0 0 
0 0 0 0 0 1 1 1 0 
0 0 0 0 1 1 1 0 0 
0 0 0 0 2 1 0 0 0 
0 0 0 1 2 0 0 0 0
0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 2 2 1
0 0 0 0 0 1 1 1 0

我该怎么办?

我认为createMine()中存在问题。

请忽略评论。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void createMine();
void createMap();
void mineMap();
int point();

char matrix[10][10];
char matrixMine[10][10];

int main(void)
{
    createMap();
    printf("Please wait for installing mines.\n");
    createMine();
    mineMap();
    while (point() != 0)
    {
        point();
    }

    return 0;
}

void createMine(void)
{
    for (int i = 0; i < 10; i++) //무작위 위치에 지뢰 10개 만들기
    {
        srand((unsigned int)time(NULL));

        int x = (rand() % 9) + 1;

        int y = (rand() % 9) + 1;

        if (matrixMine[y][x] == '*') //현재 위치에 지뢰가 존재하면 다시 설치함
        {
            --i;
            continue;
        }

        matrixMine[y][x] = '*';
    }
}

void createMap(void)//지뢰찾기 맵 만들기
{

    int i, j, row = 49, col = 49;

    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
            matrix[i][j] = '?';

    }

    matrix[0][0] = (char)32;

    for (i = 1; i < 10; i++)
    {
        matrix[i][0] = (char)col;
        col++;
    }

    for (i = 1; i < 10; i++)
    {
        matrix[0][i] = (char)row;
        row++;
    }

    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
            printf("%c ", matrix[i][j]);
        printf("\n");
    }
}

void mineMap()//주변의 지뢰 갯수 확인
{
    int i, j, counter = 48;

    for (i = 1; i < 10; i++)
    {
        for (j = 1; j < 10; j++)
        {
            for (int y = i - 1; y <= i + 1; y++) //8방향을 나타내는 for문
            {
                for (int x = j - 1; x < j + 1; x++)
                {
                    if (y < 1 || x < 1 || y>9 || x>9) //만약 맵을 벗어날 경우 지나침
                        continue;
                    if (matrixMine[y][x] == '*') //만약 지뢰일 경우 지뢰일 때마다 counter에 1을 더해줌
                        counter+=1;
                }
            }
            matrixMine[i][j] = (char)counter; //주변에 있는 지뢰의 갯수를 저장
            counter = 48;
        }
    }
}

int point()
{
    int x, y, i, j;

    printf("input point x y \n");
    scanf("%d %d", &y, &x);

    if (matrixMine[y][x] == '*')
    {
        matrix[y][x] = matrixMine[y][x];
        for (i = 0; i < 10; i++)
        {
            for (j = 0; j < 10; j++)
                printf("%c ", matrix[i][j]);
            printf("\n");
        }
        printf("GAME OVER");
        return 0;
    }
    else
    {
        matrix[y][x] = matrixMine[y][x];
        for (i = 0; i < 10; i++)
        {
            for (j = 0; j < 10; j++)
                printf("%c ", matrix[i][j]);
            printf("\n");
        }
        return 1;
    }
}

2 个答案:

答案 0 :(得分:0)

main中,您将按以下顺序调用函数:

    createMine();
    mineMap();

函数createMine是将字符'*'放置在地图中的函数。但是,在调用createMine之后,您将调用mineMap,其中包含以下内容:

    for (i = 1; i < 10; i++)
    {
        for (j = 1; j < 10; j++)
        {
            (...)
            matrixMine[i][j] = (char)counter; //주변에 있는 지뢰의 갯수를 저장
            counter = 48;
        }
    }

此double for循环可有效删除映射中的所有“ *”,并将其替换为(char)counter

建议:尝试在createMine的{​​strong>之后的{strong> mineMap之后致电main

答案 1 :(得分:0)

避免覆盖函数'*'中的mineMap

更改

            matrixMine[i][j] = (char)counter; //주변에 있는 지뢰의 갯수를 저장

            if(matrixMine[i][j] != '*')
            {
                matrixMine[i][j] = (char)counter; //주변에 있는 지뢰의 갯수를 저장
            }

与您的问题无关的其他提示:

我建议不要使用代表数字/数字的字符代码。

两个

    int i, j;
    char counter = '0';

/* ... */

            if(matrixMine[i][j] != '*')
            {
                matrixMine[i][j] = counter; //주변에 있는 지뢰의 갯수를 저장
            }
            counter = '0';

    int i, j, counter = 0;

/* ... */

            if(matrixMine[i][j] != '*')
            {
                matrixMine[i][j] = (char)(counter + '0'); //주변에 있는 지뢰의 갯수를 저장
            }
            counter = 0;

在功能point中,应检查scanf的返回值。如果用户键入的内容不能转换为两个整数,则变量xy可以未初始化。如果用户键入两个以上的数字,则附加的数字将用于下一个scanf

您有代码可以在3个地方打印矩阵。我建议用一个函数代替它,例如printMatrix

通常,我建议将输入和输出与处理功能分开。