我做了扫雷车,但是有问题。
我想使用*
显示地雷,但它显示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;
}
}
答案 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
的返回值。如果用户键入的内容不能转换为两个整数,则变量x
和y
可以未初始化。如果用户键入两个以上的数字,则附加的数字将用于下一个scanf
。
您有代码可以在3个地方打印矩阵。我建议用一个函数代替它,例如printMatrix
。
通常,我建议将输入和输出与处理功能分开。