NetWas7s 2021-06-13 20:15 采纳率: 25%
浏览 33

(10r有偿提问)写了个扫雷但是运行总是有问题,代码没有报错

【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);
    }
}
  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-03-17 08:44
    关注

    参考GPT和自己的思路:

    经过查阅你的代码,可能的问题如下:

    1. 在函数Security中,有一处逻辑错误:
    a[X][Y]=='0'; // 应该是赋值的“=”而不是判断的“==”
    

    应该修改为:

    a[X][Y]='0';
    
    1. 在函数PlayerMove中,当玩家选择的区块周围没有雷时,展开的时候出现了类型不匹配的问题:
    a[X][Y]=Deduction(b,X,Y)+'0';
    

    这里需要将计算出的雷数转换为字符,应该改为:

    a[X][Y]=Deduction(b,X,Y)+'0';
    
    1. 在函数Open中,有一处数组下标越界的问题:
    if (X+1<=10&&Y>0&&a[X+1][Y]=='*') // 应该将Y>0修改为Y>=1
    

    应该修改为:

    if (X+1<=10&&Y>=1&&a[X+1][Y]=='*')
    
    1. 在函数Open中,有一处条件判断错误的问题:
    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]=='*')
    

    希望以上修改能够解决你的问题,祝玩的愉快!

    评论

报告相同问题?

悬赏问题

  • ¥15 identifier of an instance of 类 was altered from xx to xx错误
  • ¥100 反编译微信小游戏求指导
  • ¥15 docker模式webrtc-streamer 无法播放公网rtsp
  • ¥15 学不会递归,理解不了汉诺塔参数变化
  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路