2048游戏

玩儿过这款游戏后,小编才知道什么叫“根本停不下来”。在4X4的棋盘上,每次会增加一个数字,你可以选择四个方向,然后数字会按方向移动,遇到相同的数字就会合并,游戏的目的就是合并出2048这个数字,最终看你获得了多少总分。2048也就是2的11次方,即合并11次。原本1024就已经不容易了,升级到2048,一旦停下来就还真的不好完成了!像小编这种数学是体育老师教的,看着这款好玩到爆的游戏只能一声长叹,两行清泪划过脸颊。

判断输赢:表格填满数字且无法通过移动来合并数字时,游戏退出

源代码实现c算法版:

/*
    2048游戏
*/
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <time.h>
#define MAX 4
int row=0,col=0;//元素下标
int loop=0;//排数
int i = 0, j = 0;//下标
int map[MAX][MAX] = {0};

/*初始化数组*/
void init()
{
    memset(map,0,sizeof(map));
}

/*在某一个空的位置创建随机数*/
void CreateRandNumber()
{
    int flag =0,pos=0;
    srand(time(0));
    int x =0 ,y = 0;
    int r[MAX*MAX];
    int c[MAX*MAX];
    int k = 0;
    /*判断哪些位置可空*/
    for(row=0;row<MAX;row++)
    {
        for(col=0;col<MAX;col++)
        {
            if(map[row][col]==0)
            {
                r[k]=row;
                c[k]=col;
                k++;

            }
        }
    }
    if(k==0)
    {
        printf("游戏结束\n");
        exit(0);
    }
    printf("\n");
    pos = rand()%k;
    x = r[pos];
    y = c[pos];
    map[x][y] = (rand()%2+1)*2;
    printf("产生随机数map[%d][%d]=%d\n",x,y,map[x][y]);
    /*从空的位置中产生一个随机数2或者4*/
}

/*显示游戏盘*/
void show_map()
{
    CreateRandNumber();
    for(row=0;row<4;row++)
    {
        for(loop=0;loop<4;loop++)
        {
            printf("----+");
        }
        printf("\n");
        for(col=0;col<4;col++)
        {
            if(map[row][col]==0)
            {
                printf("    |");
            }
            else
            {
                 printf("%-4d|",map[row][col]);
            }
        }
        printf("\n");
    }
    for(loop=0;loop<4;loop++)
    {
        printf("----+");
    }
    printf("\n");
}
/*向左移动*/
void toward_left()
{
    printf("正在向左移动\n");
    for(loop=0;loop<4;loop++)
    {
        //移动数字
        for(i=1;i<=3;i++)
        {
            for(j=i;j>0;j--)
            {
                if(map[loop][j-1]==0)
                {
                    map[loop][j-1]=map[loop][j];
                    map[loop][j]=0;
                }
            }
        }
        //合并相同数字
        for(i=1;i<=3;i++)
        {
            if((map[loop][i]==map[loop][i-1]) && (map[loop][i-1]!=0))
            {
                map[loop][i-1]=2*map[loop][i-1];
                map[loop][i]=0;
            }
        }
    }
}
/*向上移动*/
void toward_up()
{
    printf("正在向上移动\n");
    for(loop=0;loop<4;loop++)
    {
        //移动数字
        for(i=1;i<=3;i++)
        {
            for(j=i;j>0;j--)
            {
                if(map[j-1][loop]==0)
                {
                    map[j-1][loop]=map[j][loop];
                    map[j][loop]=0;
                }
            }
        }
        //合并相同数字
        for(i=1;i<=3;i++)
        {
            if((map[i-1][loop]==map[i][loop]) && (map[i-1][loop]!=0))
            {
                map[i-1][loop]*=2;
                map[i][loop]=0;
            }
        }
    }

}
/*向下移动*/
void toward_down()
{
    printf("正在向下移动\n");
    for(loop=0;loop<4;loop++)
    {
        //移动数字
        for(i=3;i>0;i--)
        {
            for(j=i;j<=3;j++)
            {
                if(map[j][loop]==0)
                {
                    map[j][loop]=map[j-1][loop];
                    map[j-1][loop]=0;
                }
            }
        }
        //合并相同数字
        for(i=3;i>0;i--)
        {
            if((map[i][loop]==map[i-1][loop]) && (map[i][loop]!=0))
            {
                map[i][loop]*=2;
                map[i-1][loop]=0;
            }
        }
    }

}
/*向右移动*/
void toward_right()
{
    printf("正在向右移动\n");
    for(loop=0;loop<4;loop++)//四排
    {
        //移动数字
        i = 2;
        while(i>=0)
        {
            for(j=i;j<3;j++)
            {
                if(map[loop][j+1]==0)
                {
                    map[loop][j+1]=map[loop][j];
                    map[loop][j]=0;
                }
            }
            i--;
        }
        //合并相同数字
        for(i=2;i>=0;i--)
        {
            if((map[loop][i+1]==map[loop][i]) && (map[loop][i+1]!=0))
            {
                map[loop][i+1]=2*map[loop][i+1];
                map[loop][i]=0;
            }
        }
    }

}
/*开始游戏*/
void play()
{
    show_map();
    char direction = ' ';
    while(1)
    {
        printf("h代表向左,j代表向向上,k代表向下,l代表向右:\n");
        printf("输入方向:");
        scanf("%c",&direction);
        scanf("%*[^\n]");
        scanf("%*c");
        switch(direction)
        {
            case 'h':toward_left(); show_map();break;
            case 'j':toward_up(); show_map();break;
            case 'k':toward_down(); show_map();break;
            case 'l':toward_right(); show_map();break;
            default:break;
        }
    }
}
int main()
{
    init();
    play();
    return 0;
}