用于C51的2048核心算法
2015-11-28 21:29
351 查看
代码直接可以使用,调用Turn(DIRECTION)即可以对4X4数组进行移动。
用法:声明一个4X4数组,并赋初值为0,然后调用给定的TURN 跟 ADDNUMBER即可。
PS:IS_OVER有错误,其他正常,过几天修正。测试代码平台为VS2010,测试通过。
/*
接口名称:
Turn(direction):diection:LEFT,RIGHT,UP,DOWN(方向)
isover(int【】【】)判断当前游戏状态,WIN,LOSE,OK
addnumber(int【】【】):加入一个数
*/
#include<stdio.h>
#define WIN 3
#define LOSE 2
#define OK 1
enum DIR{LEFT,RIGHT,UP,DOWN};
unsigned int Square[4][4]={0};//自己定义个4X4矩阵,请删除,其他可以直接使用
static unsigned int srand[]={//keil static 改成 xdata 放入固定内存内,不让他占动态内存
2,2,4,2,2,2,4,
2,4,2,2,2,2,4,
2,2,2,4,2,2,2,
4,2,2,2,2,2,4,
2,4,2,2
};
static unsigned int rand(unsigned int s[])
{
static short int i=0;
i+=s[i];
while(i>=31)
{
i-=31;
}
return s[i];
}
static unsigned int Add_Number(unsigned int p[][4])
{
int i;
while(1)
{
for(i=0;i<=15;i++)
{
if((!p[i/4][i%4])&&(rand(srand)==(unsigned short)4))
{
p[i/4][i%4]=rand(srand);
return 0;
}
}
}
}
static void Swap(unsigned int *_Left,unsigned int *_Right)
{
unsigned int _Temp;
_Temp=*_Left;
*_Left=*_Right;
*_Right=_Temp;
}
static char Add_Up(unsigned int p[][4],int Direction,int *Grade)
{
int i1,i2,*p1,*p2,i3=0,i4=0,i5=0;
switch(Direction)
{
case LEFT:
{
p1=&i1;
p2=&i2;
i4=1;
break;
}
case RIGHT:
{
p1=&i1;
p2=&i2;
i4=2;
break;
}
case UP:
{
p1=&i2;
p2=&i1;
i5=1;
break;
}
case DOWN:
{
i4=3;
i5=-1;
p1=&i2;
p2=&i1;
break;
}
}
if(i4<2)
{
for(i1=0;i1<=3;i1++)
{
for(i2=0;i2<=2;i2++)
{
if((p[*p1][*p2]==p[*p1+i5][*p2+i4])&&(p[*p1][*p2]!=0))
{
p[*p1][*p2]*=2;
*Grade+=p[*p1][*p2];
p[*p1+i5][*p2+i4]=0;
i3=1;
}
}
for(i2=0;i2<=2;i2++)
{
if((p[*p1][*p2]==0)&&(p[*p1+i5][*p2+i4]!=0))
{
Swap(&p[*p1][*p2],&p[*p1+i5][*p2+i4]);
i2=0;
}
}
}
}
else
{
i4-=3;
for(i1=0;i1<=3;i1++)
{
for(i2=3;i2>=1;i2--)
{
if((p[*p1][*p2]==p[*p1+i5][*p2+i4])&&(p[*p1][*p2]!=0))
{
p[*p1][*p2]*=2;
*Grade+=p[*p1][*p2];
p[*p1+i5][*p2+i4]=0;
i3=1;
}
}
for(i2=3;i2>=1;i2--)
{
if((p[*p1][*p2]==0)&&(p[*p1+i5][*p2+i4]!=0))
{
Swap(&p[*p1][*p2],&p[*p1+i5][*p2+i4]);
i2=0;
}
}
}
}
if(i3)
{
Add_Number(p);
return 1;
}
return 0;
}
static char Left(unsigned int p[][4],int *Grade)
{
int i1,i2,i3,flag=0;
for(i1=0;i1<=3;i1++)
{
for(i2=0;(i2<=2)&&(p[i1][i2]);i2++);
if(i2!=3)//有空的
{
for(i3=i2+1;i3<=3;i3++)
{
if(p[i1][i3])
{
Swap(&p[i1][i3],&p[i1][i2]);
flag=1;
i1--;
break;
}
}
}
}
if(!Add_Up(p,LEFT,Grade))
{
return flag;
}
return flag;
}
static char Right(unsigned int p[][4],int *Grade)
{
int i1,i2,i3,flag=0;
for(i1=0;i1<=3;i1++)
{
for(i2=3;(i2>=1)&&(p[i1][i2]);i2--);
if(i2!=0)//有空的
{
for(i3=i2-1;i3>=0;i3--)
{
if(p[i1][i3])
{
Swap(&p[i1][i3],&p[i1][i2]);
flag=1;
i1--;
break;
}
}
}
}
if(!Add_Up(p,RIGHT,Grade))
{
return flag;
}
return flag;
}
static char Down(unsigned int p[][4],int *Grade)
{
int i1,i2,i3,flag=0;
for(i1=0;i1<=3;i1++)
{
for(i2=3;(i2>=1)&&(p[i2][i1]);i2--);
if(i2!=0)//有空的
{
for(i3=i2-1;i3>=0;i3--)
{
if(p[i3][i1]!=0)
{
Swap(&p[i3][i1],&p[i2][i1]);
flag=1;
i1--;
break;
}
}
}
}
if(!Add_Up(p,DOWN,Grade))
{
return flag;
}
return 0;
}
static char Up(unsigned int p[][4],int *Grade)
{
int i1,i2,i3,flag=0;
for(i1=0;i1<=3;i1++)
{
for(i2=0;(i2<=2)&&(p[i1][i2]);i2++);
if(i2!=3)//有空的
{
for(i3=i2+1;i3<=3;i3++)
{
if(p[i1][i3])
{
Swap(&p[i1][i3],&p[i1][i2]);
flag=1;
i1--;
break;
}
}
}
}
if(!Add_Up(p,UP,Grade))
{
return flag;
}
return flag;
}
char Turn(unsigned int p[][4],int Direction,int *Grade)
{
switch (Direction)
{
case LEFT:
return Left(p,Grade);
case RIGHT:
return Right(p,Grade);
case UP:
return Up(p,Grade);
case DOWN:
return Down(p,Grade);
}
}
char Is_Over(unsigned int p[][4])
{
int i;
for(i=0;(i<=15)&&(p[i/4][i%4]);i++)
{
if(p[i/4][i%4]==2048)
{
return WIN;
}
}
if(i==16)
return LOSE;
return
c960
OK;
}
int main()
{
int i,k,flag,Grade=0;
Add_Number(Square);
while(1)
{
for(i=0;i<=3;i++)
{
for(k=0;k<=3;k++)
{
printf("%d ",Square[i][k]);
}
printf("\n");
}
printf("%d\n",Grade);
switch(getchar())
{
case 'w':
flag=Turn(Square,UP,&Grade);
break;
case 'd':
flag=Turn(Square,RIGHT,&Grade);
break;
case 's':
flag=Turn(Square,DOWN,&Grade);
break;
case 'a':
flag=Turn(Square,LEFT,&Grade);
break;
}
//judge win or not
if(Is_Over(Square)==LOSE)
{
printf("OVER\n");
break;
}
else if(Is_Over(Square)==WIN)
{
printf("WIN!\n");
break;
}
//see if moved
if(flag)
{
Add_Number(Square);
}
getchar();
}
return 0;
}
用法:声明一个4X4数组,并赋初值为0,然后调用给定的TURN 跟 ADDNUMBER即可。
PS:IS_OVER有错误,其他正常,过几天修正。测试代码平台为VS2010,测试通过。
/*
接口名称:
Turn(direction):diection:LEFT,RIGHT,UP,DOWN(方向)
isover(int【】【】)判断当前游戏状态,WIN,LOSE,OK
addnumber(int【】【】):加入一个数
*/
#include<stdio.h>
#define WIN 3
#define LOSE 2
#define OK 1
enum DIR{LEFT,RIGHT,UP,DOWN};
unsigned int Square[4][4]={0};//自己定义个4X4矩阵,请删除,其他可以直接使用
static unsigned int srand[]={//keil static 改成 xdata 放入固定内存内,不让他占动态内存
2,2,4,2,2,2,4,
2,4,2,2,2,2,4,
2,2,2,4,2,2,2,
4,2,2,2,2,2,4,
2,4,2,2
};
static unsigned int rand(unsigned int s[])
{
static short int i=0;
i+=s[i];
while(i>=31)
{
i-=31;
}
return s[i];
}
static unsigned int Add_Number(unsigned int p[][4])
{
int i;
while(1)
{
for(i=0;i<=15;i++)
{
if((!p[i/4][i%4])&&(rand(srand)==(unsigned short)4))
{
p[i/4][i%4]=rand(srand);
return 0;
}
}
}
}
static void Swap(unsigned int *_Left,unsigned int *_Right)
{
unsigned int _Temp;
_Temp=*_Left;
*_Left=*_Right;
*_Right=_Temp;
}
static char Add_Up(unsigned int p[][4],int Direction,int *Grade)
{
int i1,i2,*p1,*p2,i3=0,i4=0,i5=0;
switch(Direction)
{
case LEFT:
{
p1=&i1;
p2=&i2;
i4=1;
break;
}
case RIGHT:
{
p1=&i1;
p2=&i2;
i4=2;
break;
}
case UP:
{
p1=&i2;
p2=&i1;
i5=1;
break;
}
case DOWN:
{
i4=3;
i5=-1;
p1=&i2;
p2=&i1;
break;
}
}
if(i4<2)
{
for(i1=0;i1<=3;i1++)
{
for(i2=0;i2<=2;i2++)
{
if((p[*p1][*p2]==p[*p1+i5][*p2+i4])&&(p[*p1][*p2]!=0))
{
p[*p1][*p2]*=2;
*Grade+=p[*p1][*p2];
p[*p1+i5][*p2+i4]=0;
i3=1;
}
}
for(i2=0;i2<=2;i2++)
{
if((p[*p1][*p2]==0)&&(p[*p1+i5][*p2+i4]!=0))
{
Swap(&p[*p1][*p2],&p[*p1+i5][*p2+i4]);
i2=0;
}
}
}
}
else
{
i4-=3;
for(i1=0;i1<=3;i1++)
{
for(i2=3;i2>=1;i2--)
{
if((p[*p1][*p2]==p[*p1+i5][*p2+i4])&&(p[*p1][*p2]!=0))
{
p[*p1][*p2]*=2;
*Grade+=p[*p1][*p2];
p[*p1+i5][*p2+i4]=0;
i3=1;
}
}
for(i2=3;i2>=1;i2--)
{
if((p[*p1][*p2]==0)&&(p[*p1+i5][*p2+i4]!=0))
{
Swap(&p[*p1][*p2],&p[*p1+i5][*p2+i4]);
i2=0;
}
}
}
}
if(i3)
{
Add_Number(p);
return 1;
}
return 0;
}
static char Left(unsigned int p[][4],int *Grade)
{
int i1,i2,i3,flag=0;
for(i1=0;i1<=3;i1++)
{
for(i2=0;(i2<=2)&&(p[i1][i2]);i2++);
if(i2!=3)//有空的
{
for(i3=i2+1;i3<=3;i3++)
{
if(p[i1][i3])
{
Swap(&p[i1][i3],&p[i1][i2]);
flag=1;
i1--;
break;
}
}
}
}
if(!Add_Up(p,LEFT,Grade))
{
return flag;
}
return flag;
}
static char Right(unsigned int p[][4],int *Grade)
{
int i1,i2,i3,flag=0;
for(i1=0;i1<=3;i1++)
{
for(i2=3;(i2>=1)&&(p[i1][i2]);i2--);
if(i2!=0)//有空的
{
for(i3=i2-1;i3>=0;i3--)
{
if(p[i1][i3])
{
Swap(&p[i1][i3],&p[i1][i2]);
flag=1;
i1--;
break;
}
}
}
}
if(!Add_Up(p,RIGHT,Grade))
{
return flag;
}
return flag;
}
static char Down(unsigned int p[][4],int *Grade)
{
int i1,i2,i3,flag=0;
for(i1=0;i1<=3;i1++)
{
for(i2=3;(i2>=1)&&(p[i2][i1]);i2--);
if(i2!=0)//有空的
{
for(i3=i2-1;i3>=0;i3--)
{
if(p[i3][i1]!=0)
{
Swap(&p[i3][i1],&p[i2][i1]);
flag=1;
i1--;
break;
}
}
}
}
if(!Add_Up(p,DOWN,Grade))
{
return flag;
}
return 0;
}
static char Up(unsigned int p[][4],int *Grade)
{
int i1,i2,i3,flag=0;
for(i1=0;i1<=3;i1++)
{
for(i2=0;(i2<=2)&&(p[i1][i2]);i2++);
if(i2!=3)//有空的
{
for(i3=i2+1;i3<=3;i3++)
{
if(p[i1][i3])
{
Swap(&p[i1][i3],&p[i1][i2]);
flag=1;
i1--;
break;
}
}
}
}
if(!Add_Up(p,UP,Grade))
{
return flag;
}
return flag;
}
char Turn(unsigned int p[][4],int Direction,int *Grade)
{
switch (Direction)
{
case LEFT:
return Left(p,Grade);
case RIGHT:
return Right(p,Grade);
case UP:
return Up(p,Grade);
case DOWN:
return Down(p,Grade);
}
}
char Is_Over(unsigned int p[][4])
{
int i;
for(i=0;(i<=15)&&(p[i/4][i%4]);i++)
{
if(p[i/4][i%4]==2048)
{
return WIN;
}
}
if(i==16)
return LOSE;
return
c960
OK;
}
int main()
{
int i,k,flag,Grade=0;
Add_Number(Square);
while(1)
{
for(i=0;i<=3;i++)
{
for(k=0;k<=3;k++)
{
printf("%d ",Square[i][k]);
}
printf("\n");
}
printf("%d\n",Grade);
switch(getchar())
{
case 'w':
flag=Turn(Square,UP,&Grade);
break;
case 'd':
flag=Turn(Square,RIGHT,&Grade);
break;
case 's':
flag=Turn(Square,DOWN,&Grade);
break;
case 'a':
flag=Turn(Square,LEFT,&Grade);
break;
}
//judge win or not
if(Is_Over(Square)==LOSE)
{
printf("OVER\n");
break;
}
else if(Is_Over(Square)==WIN)
{
printf("WIN!\n");
break;
}
//see if moved
if(flag)
{
Add_Number(Square);
}
getchar();
}
return 0;
}
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#获取关键字附近文字算法实例