下面是卡机的一种情况;
代码如下,求大佬指教😢
#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];
}
能否具体描述一下,比如做什么操作的时候不动了,还是程序启动就什么也做不了。
每次停止的都不一样,暂时发现的就是只有在块数很多的时候才会卡住
不知道你这个问题是否已经解决, 如果还没有解决的话: