C写的2048,玩到一半莫名崩掉,请问是什么原因?

Florrie2014 2014-08-10 11:30:03
#include "apue.h"
void display(int a[][4]);
int move(int b[]);
int check(int a[][4]);
int function(int a[][4],char c);
void get_new(int a[][4]);
void initial(int a[][4]);
int move(int b[])
{
int i;
int j;
int h;
int flag=0;
i=0;
j=1;
while(j<4)
{
if(b[i]==0&&b[j]!=0)
{
b[i]=b[j];
b[j]=0;
j++;
flag=1;
}
if(b[i]!=0)
i++;
if(b[j]==0)
j++;
if(i==j)
j=i+1;
}
i=0;
j=1;
while(j<4)
{
if(b[i]==b[j]&&b[i]!=0)
{
b[i]*=2;
for(h=j;h<3;h++)
b[h]=b[h+1];
b[h]=0;
flag=1;
break;
}
i++;
j++;
}
return flag;
}
int function(int a[][4],char c)
{
int b[4];
int i;
int j;
int fun_flag=0;
if(c=='d'||c=='a')
{
for(i=0;i<4;i++)
{
if(c=='a')
for(j=0;j<4;j++)
{
b[j]=a[i][j];
}
else
for(j=0;j<4;j++)
b[3-j]=a[i][j];
if(move(b)==1)
fun_flag=1;
if(c=='a')
for(j=0;j<4;j++)
{
a[i][j]=b[j];
}
else
for(j=0;j<4;j++)
a[i][j]=b[3-j];
}

}
if(c=='w'||c=='s')
{
for(j=0;j<4;j++)
{
if(c=='w')
for(i=0;i<4;i++)
{
b[i]=a[i][j];
}
else
for(i=0;i<4;i++)
b[3-i]=a[i][j];
if(move(b)==1)
fun_flag=1;
if(c=='w')
for(i=0;i<4;i++)
{
a[i][j]=b[i];
}
else
for(i=0;i<4;i++)
a[i][j]=b[3-i];
}

}
return fun_flag;
}
void get_new(int a[][4])
{
int i;
int j;
srand((unsigned)time(NULL));
do
{
i=rand()%3;
j=rand()%3;
}
while(a[i][j]!=0);
a[i][j]=2;
}
void initial(int a[][4])
{
int i;
int j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
a[i][j]=0;
srand((unsigned)time(NULL));
i=rand()%3;
j=rand()%3;
a[i][j]=2;
}
void main()
{
int a[4][4];
char c;
int f=1;
int main_flag=0;
initial(a);
display(a);
printf("\n");
while(f=1)
{
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
scanf("%c",&c);
main_flag=function(a,c);
if(main_flag==1)
get_new(a);
display(a);
f=check(a);
fflush(stdin);
getchar();
}
}
int check(int a[][4])
{
int i;
int j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j]==0)
return 1;
return 0;
}
void display(int a[][4])
{
int i;
int j;
system("clear");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\n ___________________\n");
for(i=0;i<4;i++)
{
printf(" ");
for(j=0;j<4;j++)
{
if(a[i][j]==0)
printf("| ");
else
printf("|%4d",a[i][j]);
}
printf("|");
printf("\n |____|____|____|____|\n");
}

}
...全文
366 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Florrie2014 2014-08-12
  • 打赏
  • 举报
回复
非常感谢logociel的回答,很细致,看样子调bug还是要有耐心
logiciel 2014-08-12
  • 打赏
  • 举报
回复
稍微修改LZ程序后在windows的VS下运行,在空格越来越少时程序不能处理输入。经检查在以下代码处陷入死循环: do { i=rand()%3; j=rand()%3; } while(a[i][j]!=0); 原因是空格越来越少时很难随机地找到a[i][j]为0的i和j。 改为以下代码解决该问题:
void get_new(int a[][4])
{
  int i;
  int j;
  int k=0;
  int l;
  srand((unsigned)time(NULL));
  for(i=0;i<4;i++)
    for(j=0;j<4;j++)
      if(a[i][j]==0) k++;
  l=rand()%k;
  for(i=0;i<4;i++)
    for(j=0;j<4;j++)
      if(a[i][j]==0)
      {
        l--;
        if(l<0)
        {
          a[i][j]=2;
          return;
        }
      }
}
还有一个问题是当只剩一个空格时在以下代码处陷入死循环: while(f=1) { printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); scanf("%c",&c); main_flag=function(a,c); if(main_flag==1) get_new(a); display(a); f=check(a); fflush(stdin); getchar(); } 此时main_flag为0。该问题留给lz解决。
赵4老师 2014-08-11
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
cyd54454 2014-08-11
  • 打赏
  • 举报
回复
引用 4 楼 zxh707wk 的回复:
仅供参考 http://pan.baidu.com/s/1i3kk7bv
学习了!!
勤奋的小游侠 2014-08-11
  • 打赏
  • 举报
回复
这样问题,还是自己输出long调试吧
707wk 2014-08-11
  • 打赏
  • 举报
回复
max_min_ 2014-08-11
  • 打赏
  • 举报
回复
越界的可能性比较大,自己排查下吧!

69,382

社区成员

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

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