【CSDN最低充值100,不想冲,找到问题的大佬私我二维码】
我想象中是要做一个能实现“展开”的扫雷(一个区块周围没雷,直接点亮)
但是实际上测试出来的效果是:周围就算有雷也不会显示个数,没有雷也不会展开,有的时候输入坐标甚至没有反应。
找了好久没找到问题,蹲个大佬看看哪里有问题。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InitializationPlayer(char a[12][12]);/*初始化玩家可见面板*/
void InitializationComputer(char a[12][12]);/*初始化雷区*/
void PrintingBoard(char a[12][12]);/*打印*/
void LindMines(char a[12][12]);/*随机布雷*/
void Security(char a[12][12],int X,int Y);/*确保第一次查看的区块绝对安全*/
void Open(char a[12][12],char b[12][12],int X,int Y);/*展开9*9区域,其中a为PlayerBoard,b为ComputerBoard*/
void PlayerMove(char a[12][12],char b[12][12]);/*玩家行动,其中a为PlayerBoard,b为ComputerBoard*/
void FirstMove(char a[12][12],char b[12][12]);/*玩家初次行动,其中a为PlayerBoard,b为ComputerBoard*/
int Deduction(char a[12][12],int X,int Y);/*推演周围8个格子有多少雷*/
int Calculate(char a[12][12]);/*计算场上所剩未查看区域数量*/
int main()
{
char PlayerBoard[12][12],ComputerBoard[12][12];
InitializationPlayer(PlayerBoard);
InitializationComputer(ComputerBoard);
printf("欢迎游玩简易版扫雷游戏!!!\n");
printf("场上一共有10个雷,小心了!!\n");
LindMines(ComputerBoard);
PrintingBoard(PlayerBoard);
FirstMove(PlayerBoard,ComputerBoard);
PlayerMove(PlayerBoard,ComputerBoard);
}
void InitializationPlayer(char a[12][12])
{
int i,j;
for(i=1;i<11;i++)
{
for(j=1;j<11;j++)
a[i][j]='*';
}
for(i=0,j=0;i<12;i++)
a[i][j]='X';
for(i=0,j=0;j<12;j++)
a[i][j]='X';
for(i=11,j=0;j<12;j++)
a[i][j]='X';
for(i=0,j=11;i<12;i++)
a[i][j]='X';
}
void InitializationComputer(char a[12][12])
{
int i,j;
for(i=1;i<11;i++)
{
for(j=1;j<11;j++)
a[i][j]='0';
}
for(i=0,j=0;i<12;i++)
a[i][j]='X';
for(i=0,j=0;j<12;j++)
a[i][j]='X';
for(i=11,j=0;j<12;j++)
a[i][j]='X';
for(i=0,j=11;i<12;i++)
a[i][j]='X';
}
void PrintingBoard(char a[12][12])
{
int i=0,j=0;
for(i=0;i<=10;i++)
{
printf("%d ",i);
}
printf("\n");
for(i=1;i<=10;i++)
{
printf("%d ",i);
for(j=1;j<=10;j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}
}
void LindMines(char a[12][12])
{
int x=0,y=0,COUNT=10;
srand((int)time(NULL));
while(COUNT)
{
int x=rand()%10+1;
int y=rand()%10+1;
if(a[x][y]=='0')
{
a[x][y]='1';
COUNT--;
}
}
}
int Deduction(char a[12][12],int X,int Y)
{
int COUNT=0;
if(a[X-1][Y]=='1')
COUNT++;
if(a[X-1][Y-1]=='1')
COUNT++;
if(a[X-1][Y+1]=='1')
COUNT++;
if(a[X][Y+1]=='1')
COUNT++;
if(a[X][Y-1]=='1')
COUNT++;
if(a[X+1][Y]=='1')
COUNT++;
if(a[X+1][Y-1]=='1')
COUNT++;
if(a[X+1][Y+1]=='1')
COUNT++;
return COUNT;
}
void Security(char a[12][12],int X,int Y)
{
if(a[X][Y]=='1')
{
int x=0,y=0,COUNT=1;
srand((int)time(NULL));
while(COUNT)
{
int x=rand()%10+1;
int y=rand()%10+1;
if(a[x][y]=='0')
{
a[x][y]='1';
COUNT--;
}
}
a[X][Y]=='0';
}
}
void Open(char a[12][12],char b[12][12],int X,int Y)
{
int Mine=0;
Mine=Deduction(b,X,Y);
if(Mine==0)
{
a[X][Y]=' ';
if (X-1>0&&Y>0&&a[X-1][Y]=='*')
Open(b,a,X-1,Y);
if (X-1>0&&Y+1<=10&&a[X-1][Y+1]=='*')
Open(b,a,X-1,Y+1);
if (X>0&&Y+1<=10&&a[X][Y+1]=='*')
Open(b,a,X,Y+1);
if (X+1<10&&Y+1<=10&&a[X+1][Y+1]=='*')
Open(b,a,X+1,Y+1);
if (X+1<=10&&Y>0&&a[X+1][Y]=='*')
Open(b,a,X+1,Y);
if (X+1<=10&&Y-1>0&&a[X+1][Y-1]=='*')
Open(b,a,X+1,Y-1);
if (X>0&&Y-1>0&&a[X][Y-1]=='*')
Open(b,a,X,Y-1);
if (X-1>0&&Y-1>0&&a[X-1][Y-1]=='*')
Open(b,a,X-1,Y-1);
}
else
{
a[X][Y]=Deduction(b,X,Y)+'0';
}
}
int Calculate(char a[12][12])
{
int i,j,COUNT=0;
for(i=1;i<11;i++)
{
for(j=0;j<11;j++)
{
if(a[i][j]=='*')
COUNT++;
}
}
return COUNT;
}
void PlayerMove(char a[12][12],char b[12][12])
{
int X,Y,COUNT=0;
for(;;)
{
printf("请输入请输入你想查看的坐标(X Y):");
scanf("%d %d",&X,&Y);
getchar();
if(X>=1&&X<=10&&Y>=1&&Y<=10)
{
if(b[X][Y]=='1')
{
printf("BOOM!!!游戏结束!\n");
PrintingBoard(b);
break;
}
else if(b[X][Y]=='0')
{
Open(a,b,X,Y);
PrintingBoard(a);
if(Calculate(a)==10)
{
printf("扫雷成功!!");
PrintingBoard(b);
break;
}
}
}
else
{
printf("请按照格式输入正确的坐标!!");
}
}
}
void FirstMove(char a[12][12],char b[12][12])
{
int X,Y,COUNT;
for(;;)
{
printf("请输入你想查看的坐标(X Y):");
scanf("%d %d",&X,&Y);
getchar();
if(X>=1&&X<=10&&Y>=1&&Y<=10)
break;
else
{
printf("请按照格式输入正确的坐标!!");
}
}
Security(b,X,Y);
Open(a,b,X,Y);
PrintingBoard(a);
if(Calculate(a)==10)
{
printf("扫雷成功!!");
PrintingBoard(b);
exit(0);
}
}
参考GPT和自己的思路:
经过查阅你的代码,可能的问题如下:
a[X][Y]=='0'; // 应该是赋值的“=”而不是判断的“==”
应该修改为:
a[X][Y]='0';
a[X][Y]=Deduction(b,X,Y)+'0';
这里需要将计算出的雷数转换为字符,应该改为:
a[X][Y]=Deduction(b,X,Y)+'0';
if (X+1<=10&&Y>0&&a[X+1][Y]=='*') // 应该将Y>0修改为Y>=1
应该修改为:
if (X+1<=10&&Y>=1&&a[X+1][Y]=='*')
if (X+1<10&&Y+1<=10&&a[X+1][Y+1]=='*') // 应该将X+1<10修改为X+1<=10
应该修改为:
if (X+1<=10&&Y+1<=10&&a[X+1][Y+1]=='*')
希望以上修改能够解决你的问题,祝玩的愉快!