2048游戏的实现用C语言

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


#define ROW 4
#define LINE 4

//这个数组为  全局数组--全局数组可以被该文件内任意函数调用

//调用的前提--出现在任何函数之前


int array_2048[ROW][LINE] = { 0 };
//现在设定一个函数,功能是设置某个位置的随机值

void position()//随机产生4或2
{
    int i, j, value;
    srand(time(0));
    value = rand() % 2;
    if (value == 0)
        value = 2;
    else
        value = 4;
    while (1)
    {
        i = rand() % 4;
        j = rand() % 4;
        if (array_2048[i][j] != 0)//如果该位置不为空,继续随机生成,直到该位置为空
            continue;
        else
            array_2048[i][j] = value;//如果该位置为空则给该位置赋值为2或4
        break;
    }

}

//打印数组函数
void printf_array()
{
    printf("\n----------------------------------------------------------------\n");
    int i, j;
    for (i = 0; i < ROW; i++)
    {
        printf("|\t");
        for (j = 0; j < LINE; j++)
        {
            printf("%d\t|\t", array_2048[i][j]);

        }
        printf("\n");
    }
    printf("\n----------------------------------------------------------------\n");
}


//判断能否向上移动
int judge_up()
{
    int i, j;
    for (i = 1; i < 4; i++)
        for (j = 0; j < 4; j++)
        {
            if (array_2048[i][j] == array_2048[i - 1][j] && array_2048[i - 1][j] > 0)//上方的格子不为空而且和本身这个格子数字相同
                return 1;
            if (array_2048[i][j] != array_2048[i - 1][j] && array_2048[i - 1][j] ==0)//上方的格子为空
                return 1;


        }

    return 0;
}

//判断能否向下移动
int judge_down()
{
    int i, j;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 4; j++)
        {
            if (array_2048[i][j] == array_2048[i + 1][j] && array_2048[i + 1][j] > 0)//下方的格子不为空而且和本身这个格子数字相同
                return 1;
            if (array_2048[i][j] != array_2048[i + 1][j] && array_2048[i + 1][j] ==0)//下方的格子为空
                return 1;


        }

    return 0;
}

//判断能否向左移动
int judge_left()
{
    int i, j;
    for (i = 0; i < 4; i++)
        for (j = 1; j < 4; j++)
        {
            if (array_2048[i][j] == array_2048[i][j - 1] && array_2048[i][j - 1] > 0)//左方的格子不为空而且和本身这个格子数字相同
                return 1;
            if (array_2048[i][j] != array_2048[i][j - 1] && array_2048[i][j - 1] ==0)//左方的格子为空
                return 1;


        }

    return 0;
}


//判断能否向右移动
int judge_right()
{
    int i, j;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 3; j++)
        {
            if (array_2048[i][j] == array_2048[i][j + 1] && array_2048[i][j + 1] > 0)//右方的格子不为空而且和本身这个格子数字相同
                return 1;
            if (array_2048[i][j] != array_2048[i][j + 1] && array_2048[i][j + 1] ==0)//右方的格子为空
                return 1;


        }
    return 0;
}

int judge_move(char ch)//判断能否进行移动
{
    int i, j;
    for (i = 0; i < 4; i ++)
        for (j = 0; j < 4; j++)
            if (array_2048[i][j] == 2048)
                return 2;//有一个格子内的结果是2048

    int x = 0;
    switch ('w')//判断是否有方向可以移动
    {
    case 'w':x += judge_up();
    case 's':x += judge_down();
    case 'a':x += judge_left();
    case 'd':x += judge_right();
    default:printf("input error");
        break;
    }
    if (x ==0)
        return 1;//没有一个方向可以移动

    int z = 0;
    switch (ch)//每次判断一个方向
    {
    case 'w':z += judge_up(); break;
    case 's':z += judge_down(); break;
    case 'a':z += judge_left(); break;
    case 'd':z += judge_right(); break;
    default:printf("input error");
        break;
    }
    if (z)
        return 3;//在某个方向能移动
    else
        return 4;//z=0在某个方向不能移动

    //遍历数组,比较周围有2048--有就直接返回2

 //判断四个方向能不能移动

//判断单个方向能不能移动


}

void move_up()//向上移动的具体实现
{

    int i, j, k;
    for (j = 0; j < 4; j++)
    {
        for (i = 0; i < 3; i++)
        {
            if (array_2048[i][j] != 0)//格子本身不能为空
            {
                for (k = i + 1; k < 4; k++)//找本格子下方的每个格子
                {
                    if (array_2048[i][j] != array_2048[k][j] && array_2048[k][j] != 0)//若下方的格子不等于上方格子,不移动
                        break;
                    else if (array_2048[i][j] == array_2048[k][j])//若相同则可以合并
                    {
                        array_2048[i][j] = array_2048[i][j] * 2;
                        array_2048[k][j] = 0;
                        break;
                    }
                }
            }
        }
    }//以上都是合并操作

    for (j = 0; j < 4; j++)//移动操作
    {
        for (i = 0; i < 3; i++)
        {
            if (array_2048[i][j] == 0)//格子本身为空
            {
                for (k = i + 1; k < 4; k++)
                {
                    if (array_2048[k][j] != 0)
                    {
                        array_2048[i][j] = array_2048[k][j];
                        array_2048[k][j] = 0;
                        break;
                    }
                }
            }
        }
    }

}

void move_down()//原理同上
{
    int i, j, k;
    for (j = 0; j < 4; j++)
    {
        for (i = 3; i > 0; i--)
        {
            if (array_2048[i][j] != 0)
            {
                for (k = i - 1; k > -1; k--)
                {
                    if (array_2048[i][j] != array_2048[k][j] && array_2048[k][j] != 0)
                        break;
                    else if (array_2048[i][j] == array_2048[k][j])
                    {
                        array_2048[i][j] = array_2048[i][j] * 2;
                        array_2048[k][j] = 0;
                        break;
                    }
                }
            }
        }
    }

    for (j = 0; j < 4; j++)
    {
        for (i = 3; i > 0; i--)
        {
            if (array_2048[i][j] == 0)
            {
                for (k = i - 1; k > -1; k--)
                {
                    if (array_2048[k][j] != 0)
                    {
                        array_2048[i][j] = array_2048[k][j];
                        array_2048[k][j] = 0;
                        break;
                    }
                }
            }
        }
    }


}

void move_left()
{
    int i, j, k;
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 3; j++)
        {
            if (array_2048[i][j] != 0)
            {
                for (k = j + 1; k < 4; k++)
                {
                    if (array_2048[i][j] != array_2048[i][k] && array_2048[i][k] != 0)
                        break;
                    else if (array_2048[i][j] == array_2048[i][k])
                    {
                        array_2048[i][j] = array_2048[i][j] * 2;
                        array_2048[i][k] = 0;
                        break;
                    }
                }
            }
        }
    }

    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 3; j++)
        {
            if (array_2048[i][j] == 0)
            {
                for (k = j + 1; k < 4; k++)
                {
                    if (array_2048[i][k] != 0)
                    {
                        array_2048[i][j] = array_2048[i][k];
                        array_2048[i][k] = 0;
                        break;
                    }
                }
            }
        }
    }
}
void move_right()
{
    int i, j, k;
    for (i = 0; i < 4; i++)
    {
        for (j = 3; j > 0; j--)
        {
            if (array_2048[i][j] != 0)
            {
                for (k = j - 1; k > -1; k--)
                {
                    if (array_2048[i][j] != array_2048[i][k] && array_2048[i][k] != 0)
                        break;
                    else if (array_2048[i][j] == array_2048[i][k])
                    {
                        array_2048[i][j] = array_2048[i][j] * 2;
                        array_2048[i][k] = 0;
                        break;
                    }
                }
            }
        }
    }

    for (i = 0; i < 4; i++)
    {
        for (j = 3; j > 0; j--)
        {
            if (array_2048[i][j] == 0)
            {
                for (k = j - 1; k > -1; k--)
                {
                    if (array_2048[i][k] != 0)
                    {
                        array_2048[i][j] = array_2048[i][k];
                        array_2048[i][k] = 0;
                        break;
                    }
                }
            }
        }
    }

}

void move(char ch)//手动输入移动的方向
{
    switch (ch)
    {
    case'w':move_up(); break;
    case'a':move_left(); break;
    case's':move_down(); break;
    case'd':move_right(); break;
    }
}
int game()//游戏的实现步骤
{
    //生成两个随机数
    position();
    position();
    //打印数据
    printf_array();
    //移动--获取移动数据
    //a--left,w--up,s--down,d--right
    //getchar
    int flag = 0;
    while (1)
    {
        char ch = getchar();
        //根据获取到的数据进行位置移动
            //判断是都结束/成功/能够移动
            //judge_move-->能够移动返回(3)
            //不能移动--2048(2)/某个方向不能移动(1),该方向无法移动(4)
        flag = judge_move(ch);
        if (flag == 3)
        {
            move(ch);
            position();
            printf_array();//移动--void_move(char ch)

            //移动之后还要判断游戏是否结束
            flag = judge_move(ch);
            if (flag == 2)
            {
                printf("success 2048\n");
                break;
            }
            else if (flag == 1)
            {
                printf("defeat 2048\n");
                break;
            }

        }
        else if (flag == 2)
        {
            printf("success 2048\n");
            break;
        }
        else if (flag == 1)
        {
            printf("defeat 2048\n");
            break;
        }
        else if (flag == 4)
        {
            printf("no through\n");
        }

    }
    return 0;
}

int main()
{

    game();
    return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值