大一菜鸟恳请大佬指导·····

Man1999 2017-12-10 11:51:58
C语言问题,在扫雷程序中,当运行到数为0时会出现

.exe已停止工作?为什么呢?该如何解决呢,诚心求教,感谢大家

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
int A[9][9]={0};
int flags[9][9]={0};
int opened;
void bl()
{
srand(time(NULL));
int p,q;
for(int m=0;m<=10;)
{
p=rand()%10;
q=rand()%10;
if(A[p][q]!='*')
{
A[p][q]='*' ;
m++;
}
}
}
void sl()
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(A[i][j]!='*')
{
for(int p=(i-1);p<(i+2);p++)
{
for(int q=(j-1);q<(j+2);q++)
{
if(p>=0&&p<9&&q>=0&&q<9)
{
if(A[p][q]=='*')
A[i][j]++;
}
else
{
continue;
}
}
}
}
else
{
continue;
}
}
}
}
void xs()
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(flags[i][j]==0)
{
printf(" #");
}
else
{
if(A[i][j]=='*')
printf("%4c",A[i][j]);
else
printf("%4d",A[i][j]);
}

}
printf("\n\n");
}

}
void lp(int i,int j)
{
if(A[i][j]==0)
{
for(int p=(i-1);p<(i+2);p++)
{
for(int q=(j-1);q<(j+2);q++)
{
if(p>=0&&p<9&&q>=0&&q<9)
{
if(flags[p][q]==0)
{
if(A[p][q]!=0)
{
flags[p][q]=1;
opened++;
}
else
{
lp(p,q);
}
}
}
}
}
xs();
}
else
{
opened++;
xs();
}
}


void play()
{
while(opened<=71)
{
int x,y;
printf("请输入行号",x);
printf("列号",y);
scanf("%d%d",&x,&y);
flags[x][y]=1;
if(A[x][y]=='*')
{
xs();
printf("Game Over");
break;
}
else
{
lp(x,y);
}
}
}
int main()
{
bl();
sl();
xs();
play();
return 0;
}
...全文
189 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-11
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
FoolCarpe 2017-12-11
  • 打赏
  • 举报
回复
出现崩溃的原因为输入0 0 时,会偶尔出现无限递归调用(lp)
赵4老师 2017-12-11
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
自信男孩 2017-12-11
  • 打赏
  • 举报
回复
void bl()
{
    srand(time(NULL));
    int p,q;
    for(int m=0;m<=10;)
    {
        p=rand()%9;   /* 有可能越界*/
        q=rand()%9;   /* 有可能越界*/
        if(A[p][q]!='*')
        {
            A[p][q]='*' ;
            m++;
        }
    }
}
rand() % 10;得到的值范围为:[0, 9];若p, q得到的值是9,则越界;
void play()
{
    while(opened<=71)
    {
        int x,y;
        scanf("%d%d",&x,&y);

        printf("请输入行号: %d", x);
        printf("列号: %d", y);
        flags[x][y]=1;
        if(A[x][y]=='*')
        {
            xs();
            printf("Game Over");
            break;
        }
        else
        {
            lp(x,y);
        }
    }
}
printf缺少%d, 并且printf的位置应该在scanf后,在前面无意义;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧