2048移动

2048是比较流行的一款数字游戏。原版2048首先在github上发布,原作者是Gabriele Cirulli。它是基于1024和小3传奇的玩法开发而成的新型数字游戏。随后2048便出现各种版本,走红各大平台。
2048游戏规则很简单,游戏开始,在4X4的棋盘上随机出现两个数字,出现的数字仅可能为2或4;玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动;玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并;合并所得的所有新生成数字相加即为该步的有效得分;玩家选择的方向行或列前方有空格则出现位移;每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4);棋盘被数字填满,无法进行有效移动,判负,游戏结束;棋盘上出现2048,判胜。

现请你写一段程序实现2048游戏中的两种移动。

输入格式:

共5行,第一行是一个整数,只可能是1或0,其中1代表向右边移动,0代表向左边移动。接下来4行每行均为4个用空格分隔的整数(每个整数都不超过2048),其中0代表空位,即无数字。

输出格式:

共4行,每行4个用空格分隔的整数,为移动后的结果(只移动数字,不用合并,不用随机生成一个新数字)。

样例解释:

第一行为1,代表向右移动,第二行所有数字均不为0,表示没有空位,无法移动,所以输出的第一行与此行相同;第三行仅最右边一个数字为0,所以前3个数字依次向右移动一格,第一个位置变为0;第4行最右侧有两个0,那么前两个数字依次向右移动两格,第1,2两个位置变为0;最后一行第2,4位置为空格,所以第3格的数字向右移动一格,第1格的数字向右移动2格,第1,2两个位置变为0。

如果第一行输入为0,向左移动,则与样例输入对应的输出为:

2 4 8 16
2 4 8 0
2 4 0 0
2 2 0 0

输入样例:

1
2 4 8 16
2 4 8 0
2 4 0 0
2 0 2 0

输出样例:

2 4 8 16
0 2 4 8
0 0 2 4
0 0 2 2

 真的不知道怎么做了,就用最蠢的办法写了。

#include <stdio.h>

int main()

{

    int n = 0;

    scanf("%d", &n);

    int arr[4][4];

    int i, j = 0;

    for (i = 0; i < 4; i++)

    {

        for (j = 0; j < 4; j++)

        {

            scanf("%d", &arr[i][j]);

        }

    }

    if (n == 1)

    {

        for (i = 0; i < 4; i++)

        {

            for (j = 3; j >= 0; j--)

            {

                for (int k = j; k < 4; k++)

                {

                    if (arr[i][j] != 0 && arr[i][k] == 0)

                    {

                        arr[i][k] = arr[i][j];

                        arr[i][j] = 0;

                    }

                }

            }

        }

        for (i = 0; i < 4; i++)

        {

            for (j = 3; j >= 0; j--)

            {

                for (int k = j; k < 4; k++)

                {

                    if (arr[i][j] != 0 && arr[i][k] == 0)

                    {

                        arr[i][k] = arr[i][j];

                        arr[i][j] = 0;

                    }

                }

            }

        }

        for (i = 0; i < 4; i++)

        {

            for (j = 3; j >= 0; j--)

            {

                for (int k = j; k < 4; k++)

                {

                    if (arr[i][j] != 0 && arr[i][k] == 0)

                    {

                        arr[i][k] = arr[i][j];

                        arr[i][j] = 0;

                    }

                }

            }

        }

    }

    if (n == 0)

    {

        for (i = 0; i < 4; i++)

        {

            for (j = 0; j < 4; j++)

            {

                for (int k = j; k >= 0; k--)

                {

                    if (arr[i][j] != 0 && arr[i][k] == 0)

                    {

                        arr[i][k] = arr[i][j];

                        arr[i][j] = 0;

                    }

                }

            }

        }

         for (i = 0; i < 4; i++)

        {

            for (j = 0; j < 4; j++)

            {

                for (int k = j; k >= 0; k--)

                {

                    if (arr[i][j] != 0 && arr[i][k] == 0)

                    {

                        arr[i][k] = arr[i][j];

                        arr[i][j] = 0;

                    }

                }

            }

        }

        for (i = 0; i < 4; i++)

        {

            for (j = 0; j < 4; j++)

            {

                for (int k = j; k >= 0; k--)

                {

                    if (arr[i][j] != 0 && arr[i][k] == 0)

                    {

                        arr[i][k] = arr[i][j];

                        arr[i][j] = 0;

                    }

                }

            }

        }

    }

    for (i = 0; i < 4; i++)

    {

        for (j = 0; j < 3; j++)

        {

            printf("%d ", arr[i][j]);

        }

        printf("%d\n", arr[i][4]);

    }

    return 0;

}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值