C语言写的一个2048,运行时突然无反应,不动了

下面是卡机的一种情况;

代码如下,求大佬指教😢

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 5//方阵边长 
#define WIN 2048//游戏获胜目标 

int test(int (*a)[N]);
void get(int (*a)[N]);
void output(int (*a)[N]);
void begin(int (*a)[N]);
void move(int (*a)[N]);
int get_rand();
int input();
int qqqq=0;

int main()
{
	int a[N][N]={0};
	system("color 8E");
	system("title 2048小游戏");
	system("mode con cols=35 lines=20");//设置窗口大小
	get(a);
	get(a);//起始时方阵有两个随机数
	begin(a); 
	while(test(a)) 
		move(a); //只有通过tset函数检查才能继续游戏 
}

void begin(int (*a)[N])
{ 
	system("cls");qqqq++;
	printf("	      2048\n%d\n", qqqq);
	printf("	输入上下左右控制\n");
	output(a);
}  

void get(int (*a)[N])//在表格中空位随机获得数字 
{
	int i,j;
	srand((unsigned)time(NULL));
	do
	{
		i=(rand())%4;
		j=(rand())%4;	
	} while(a[i][j]!=0); 
	
	a[i][j]=get_rand();
}  

void output(int (*a)[N])//输出表格
{
	int i,j;
	printf("\n┏━━━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━┓\n");//顶边框 
	for(i=0;i<N;i++)
	{
		printf("┃") ;
		for(j=0;j<N;j++)
		{
			if(a[i][j]==0) printf("     ┃");//如果数值为零则输出空白 
			else  printf("%5d┃",a[i][j]);
		}
		if(i!=N-1)
			printf("\n┣━━━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━┫\n");//中边框 
		else 
			printf("\n┗━━━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━┛\n");//底边框 
	}
} 

int test(int (*a)[N])//判断是否游戏完成 
{
	int i,j,k=0,m=0,n=0;
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		{
			if(a[i][j]==0) m=1;//检查方阵中是否有0 
			if(a[i][j]==WIN) k=1; //检查方阵中是否有目标数字 
		}
	}
	if (k)//如果发现目标数字判定游戏获胜
	{ 
		printf("YOU WIN!"); 
		return 0;
	}
	else
	{
		if(m==0)//如果方阵中无0,且无相邻数字相等则判定游戏失败,反之游戏继续 
		{
		 	for(i=0;i<N;i++)
			{
				for(j=0;j<N-1;j++)
					if(a[i][j]==a[i][j+1]||a[j][i]==a[j+1][i]) n=1;//方针相邻 
			}
		   	if(n) return 1;
			else
			{
				printf("GAME OVER!");
				return 0;
			}
		}
		else return 1;   
	}		 
}

int input()//输入上下左右指令控制游戏 
{
	int m;
	if(getch()==0xE0)//对键入的命令进行识别 
	{ 
		switch(getch())//十位1表示水平移动2表示竖直移动,各位1表示向小坐标移动2表示向大坐标移动 
		{
			case 72: return 21;break;//输入上 
			case 80: return 22;break;//输入下 
			case 75: return 11;break;//输入右 
			case 77: return 12;break;//输入左
			default://若命令不符合要求,运用递归重新得到命令 
			{
				printf("请输入正确的指令!\n");
				return input();	
			}
		}
	}
	else //若命令不符合要求,运用递归重新得到命令 
	{
		printf("请输入正确的指令!\n\n");
		return input();
	}
}


void move(int (*a)[N])//通过调用input函数得到正确的命令,根据命令移动数据 
{ 
	int x,i,j,k,s[N][N],t=0;
 	x=input();
 	for(i=0;i<N;i++)//拷贝移动前方阵方便以后检查 
	{
		for(j=0;j<N;j++) 
			s[i][j]=a[i][j];
	}
 	if(x/10==1)//水平移动
	{ 
 		if(x%10==1)//向左坐标移动
		{ 
		 	for(i=0;i<N;i++)// 核心算法介绍 : 
			{
				for(k=0;k<N-1;k++)//第一步,先将一排数据从后往前一个个向前推(除去前面和中间的0)         
			 		for(j=N-1;j>0;j--)//为确保移动完全经推理最多N-1次完成所有移动所有执行N-1次该算法
	 					if(a[i][j-1]==0)  
						{        
							a[i][j-1]=a[i][j];        
		 					a[i][j]=0;                
	 					}                         //PS:所有方向算法原理相同 
	 	     	
		 		for(j=0;j<N-1;j++)//第二步,将相邻两两相同的数相加赋值前者后者赋0 
 					if(a[i][j]==a[i][j+1])
					{
						a[i][j]=a[i][j]+a[i][j+1];
						a[i][j+1]=0;
					}
		 
		 		for(k=0;k<N-1;k++)// 第三步,重复第一步操作去除新产生的0,总操作完成 
			 		for(j=N-1;j>0;j--)
	 					if(a[i][j-1]==0) 
						{
						a[i][j-1]=a[i][j];
	 					a[i][j]=0;
	 					}
		 	}	 
		} 
		else//向大坐标移动 
		{
		 	for(i=0;i<N;i++)
			{
				for(k=0;k<3;k++)
		 			for(j=0;j<N-1;j++)
 						if(a[i][j+1]==0) 
						{
							a[i][j+1]=a[i][j];
 							a[i][j]=0;
 						}
 						
				for(j=N-1;j>0;j--)
				 
 					if(a[i][j]==a[i][j-1]) 
					{
						a[i][j]=a[i][j]+a[i][j-1];
						a[i][j-1]=0;
					}
				
		 		for(k=0;k<3;k++)
			 		for(j=0;j<N-1;j++) 
	 					if(a[i][j+1]==0) 
						{
							a[i][j+1]=a[i][j];
		 					a[i][j]=0;
	 					}
		 	}	 
		 }
	 }
 	else//竖直移动 
	{
 		if(x%10==1)//向小坐标移动 
			for(i=0;i<N;i++)
			{
			 	for(k=0;k<3;k++)
					for(j=N-1;j>0;j--)
	 					if(a[j-1][i]==0) 
						{
							a[j-1][i]=a[j][i];
		 					a[j][i]=0;
	 					}
				for(j=0;j<N-1;j++)
					if(a[j][i]==a[j+1][i]) 
					{
						a[j][i]=a[j][i]+a[j+1][i];
						a[j+1][i]=0;
					}
		 		for(k=0;k<3;k++)
					for(j=N-1;j>0;j--)
	 					if(a[j-1][i]==0) 
						{
							a[j-1][i]=a[j][i];
		 					a[j][i]=0;
	 					}	
			}
		else//向大坐标移动 
		 	for(i=0;i<N;i++)
			{
				for(k=0;k<3;k++)
			 		for(j=0;j<N-1;j++)
	 					if(a[j+1][i]==0) 
						{
						a[j+1][i]=a[j][i];
	 					a[j][i]=0;
	 					}
				for(j=N-1;j>0;j--)
 					if(a[j][i]==a[j-1][i]) 
					{
						a[j][i]=a[j][i]+a[j-1][i];
						a[j-1][i]=0;
					}
		 		for(k=0;k<3;k++)
			 		for(j=0;j<N-1;j++)
	 					if(a[j+1][i]==0) 
						{
							a[j+1][i]=a[j][i];
	 						a[j][i]=0;
	 					}
		 	}
	}
	for(i=0;i<N;i++)//检查是否为有效移动 
		for(j=0;j<N;j++) 
			if (s[i][j]!=a[i][j]) t=1;
	
	if(t)
	{
//		begin(a);	
//		Sleep(60);//为增强视觉感受,让其延迟出现 
		get(a);	
		begin(a);
	}  
	else printf("选择其他方向试试\n"); 
}

int get_rand()//获取随机数
{
	int s[12]={2,2,2,2,2,4,4,4,4,8,8,16},i,j;
	srand(time(NULL));
	i=(rand())%10;
	return s[i];
}

能否具体描述一下,比如做什么操作的时候不动了,还是程序启动就什么也做不了。

每次停止的都不一样,暂时发现的就是只有在块数很多的时候才会卡住

 

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^