您的位置:首页 > 其它

用于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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C51 单片机 2048 算法