2048小游戏

2020.5.28 推翻重做

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int mp[4][4];
char temp[100];
void color(short x) //自定义函根据参数改变颜色
{
    if (x >= 0 && x <= 15)
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
    else
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
int main()
{
    int score = 0; //计算分数
    int i, j, t, x, y, if_end = 10, level;
    srand(time(NULL));
    printf(" ——————————\n"); //打印界面
    printf("|  请选择游戏难度:   |\n");
    printf("| 1.简单模式(2048) |\n");
    printf("| 2.困难模式(4096) |\n");
    printf("|输入序号按下回车确认|\n");
    printf(" ——————————\n");
    scanf("%d", &level);
    if (level == 1) //选择难度
        level = 2048;
    else if (level == 2)
        level = 4096;
    printf("请按任意方向键↑↓ ← →开始游戏\n");
    for (t = 0; t < 10000; t++)
    {
        int if_Victory = 0;
        // getchar();
        int ch1 = 0;
        int ch2 = 0;
        // if(t!=0)
        // getchar();
        if (ch1 = getch())
            ch2 = getch();
        int sum = 0;
        if (t == 0)
            sum = 1;
        if (ch2 == 72) //上
        {
            system("cls");
            for (i = 1; i <= 3; i++)
            {
                for (j = 0; j < 4; j++)
                {
                    if (mp[i - 1][j] == 0 && mp[i][j] != 0)
                    {
                        mp[i - 1][j] = mp[i][j];
                        mp[i][j] = 0;
                    }
                }
            }
            for (i = 1; i < 4; i++)
            {
                for (j = 0; j < 4; j++)
                {
                    if (mp[i][j] == mp[i - 1][j])
                    {
                        mp[i][j] = 0;
                        mp[i - 1][j] *= 2;
                    }
                }
            }
            for (i = 1; i <= 3; i++)
            {
                for (j = 0; j < 4; j++)
                {
                    if (mp[i - 1][j] == 0 && mp[i][j] != 0)
                    {
                        mp[i - 1][j] = mp[i][j];
                        mp[i][j] = 0;
                    }
                }
            }
            int geshu = 0;
            sum = 0;
            for (i = 0; i < 4; i++)
                for (j = 0; j < 4; j++)
                    if (mp[i][j] == 0)
                        sum++;
            if (sum == 1) //如果只剩一个空的格子了,那么只需随机生成一个数
                geshu++;
            while (geshu != 2 && geshu != if_end - 1 && sum != 0)
            {

                x = rand() % 4;
                y = rand() % 4; //生成的随机数的坐标
                if (mp[x][y] == 0)
                {
                    int tempp = rand() % 2; //随机生成2或4
                    if (tempp % 2)
                        mp[x][y] = 2;
                    else
                        mp[x][y] = 4;
                    geshu++;
                }
                else
                    continue;
            }
            int if_end = 0;
            printf("———————————\n"); //打印地图
            for (i = 0; i < 4; i++)
            {
                printf("|");
                for (j = 0; j < 4; j++)
                {
                    if (mp[i][j] == 0)
                    {
                        if_end++;
                    }
                    if (level == mp[i][j])
                        if_Victory = 1;
                    printf("%4d|", mp[i][j]);
                }
                printf("\n———————————\n");
            }
            if (!if_end)
                for (i = 0; i <= 3; i++)
                    for (j = 0; j <= 3; j++)
                    {
                        if (i - 1 >= 0 && mp[i][j] == mp[i - 1][j])
                            if_end = 1;
                        if (j - 1 >= 0 && mp[i][j] == mp[i][j - 1])
                            if_end = 1;
                        if (i + 1 <= 3 && mp[i][j] == mp[i + 1][j])
                            if_end = 1;
                        if (j + 1 <= 3 && mp[i][j] == mp[i][j + 1])
                            if_end = 1;
                    }
            printf("\n\n\n");
            score = 0; //计算分数
            for (i = 0; i <= 3; i++)
                for (j = 0; j <= 3; j++)
                    score += mp[i][j];
            color(11);
            printf("     score=%-6d\n    ——————\n", score);
            color(20); //取消颜色
            if (if_Victory == 1)
            {
                printf("    恭喜你!游戏成功!\n");
                gets(temp);
                gets(temp);
                break;
            }
            else if (if_end == 0)
            {
                printf("    游戏结束!\n");
                gets(temp);
                gets(temp);
            }
        }
        if (ch2 == 80) //下
        {
            system("cls");
            for (i = 2; i >= 0; i--)
            {
                for (j = 0; j < 4; j++)
                {
                    if (mp[i + 1][j] == 0 && mp[i][j] != 0)
                    {
                        mp[i + 1][j] = mp[i][j];
                        mp[i][j] = 0;
                    }
                }
            }
            for (i = 2; i >= 0; i--)
            {
                for (j = 0; j < 4; j++)
                {
                    if (mp[i][j] == mp[i + 1][j])
                    {
                        mp[i][j] = 0;
                        mp[i + 1][j] *= 2;
                    }
                }
            }
            for (i = 2; i >= 0; i--)
            {
                for (j = 0; j < 4; j++)
                {
                    if (mp[i + 1][j] == 0 && mp[i][j] != 0)
                    {
                        mp[i + 1][j] = mp[i][j];
                        mp[i][j] = 0;
                    }
                }
            }
            int geshu = 0;
            sum = 0;
            for (i = 0; i < 4; i++)
                for (j = 0; j < 4; j++)
                    if (mp[i][j] == 0)
                        sum++;
            if (sum == 1) //如果只剩一个空的格子了,那么只需随机生成一个数
                geshu++;
            while (geshu != 2 && geshu != if_end - 1 && sum != 0)
            {
                x = rand() % 4;
                y = rand() % 4; //生成的随机数的坐标
                if (mp[x][y] == 0)
                {
                    int tempp = rand() % 2; //随机生成2或4
                    if (tempp % 2)
                        mp[x][y] = 2;
                    else
                        mp[x][y] = 4;
                    geshu++;
                }
                else
                    continue;
            }
            int if_end = 0;
            printf("———————————\n"); //打印地图
            for (i = 0; i < 4; i++)
            {
                printf("|");
                for (j = 0; j < 4; j++)
                {
                    if (mp[i][j] == 0)
                    {
                        if_end++;
                    }
                    if (level == mp[i][j])
                        if_Victory = 1;
                    printf("%4d|", mp[i][j]);
                }
                printf("\n———————————\n");
            }
            if (!if_end)
                for (i = 0; i <= 3; i++)
                    for (j = 0; j <= 3; j++)
                    {
                        if (i - 1 >= 0 && mp[i][j] == mp[i - 1][j])
                            if_end = 1;
                        if (j - 1 >= 0 && mp[i][j] == mp[i][j - 1])
                            if_end = 1;
                        if (i + 1 <= 3 && mp[i][j] == mp[i + 1][j])
                            if_end = 1;
                        if (j + 1 <= 3 && mp[i][j] == mp[i][j + 1])
                            if_end = 1;
                    }
            printf("\n\n\n");
            score = 0; //计算分数
            for (i = 0; i <= 3; i++)
                for (j = 0; j <= 3; j++)
                    score += mp[i][j];
            color(11);
            printf("     score=%-6d\n    ——————\n", score);
            color(20); //取消颜色
            if (if_Victory == 1)
            {
                printf("    恭喜你!游戏成功!\n");
                gets(temp);
                gets(temp);
                break;
            }
            else if (if_end == 0)
            {
                printf("    游戏结束!\n");
                gets(temp);
                gets(temp);
            }
        }
        if (ch2 == 75) //左
        {
            system("cls");
            for (j = 1; j <= 3; j++)
            {
                for (i = 0; i < 4; i++)
                {
                    if (mp[i][j - 1] == 0 && mp[i][j] != 0)
                    {
                        mp[i][j - 1] = mp[i][j];
                        mp[i][j] = 0;
                    }
                }
            }
            for (j = 1; j <= 3; j++)
            {
                for (i = 0; i <= 3; i++)
                {
                    if (mp[i][j] == mp[i][j - 1])
                    {
                        mp[i][j] = 0;
                        mp[i][j - 1] *= 2;
                    }
                }
            }
            for (j = 1; j < 4; j++)
            {
                for (i = 0; i < 4; i++)
                {
                    if (mp[i][j - 1] == 0 && mp[i][j] != 0)
                    {
                        mp[i][j - 1] = mp[i][j];
                        mp[i][j] = 0;
                    }
                }
            }
            int geshu = 0;
            sum = 0;
            for (i = 0; i < 4; i++)
                for (j = 0; j < 4; j++)
                    if (mp[i][j] == 0)
                        sum++;
            if (sum == 1) //如果只剩一个空的格子了,那么只需随机生成一个数
                geshu++;
            while (geshu != 2 && geshu != if_end - 1 && sum != 0)
            {
                x = rand() % 4;
                y = rand() % 4; //生成的随机数的坐标
                if (mp[x][y] == 0)
                {
                    int tempp = rand() % 2; //随机生成2或4
                    if (tempp % 2)
                        mp[x][y] = 2;
                    else
                        mp[x][y] = 4;
                    geshu++;
                }
                else
                    continue;
            }
            int if_end = 0;
            printf("———————————\n"); //打印地图
            for (i = 0; i < 4; i++)
            {
                printf("|");
                for (j = 0; j < 4; j++)
                {
                    if (mp[i][j] == 0)
                    {
                        if_end++;
                    }
                    if (level == mp[i][j])
                        if_Victory = 1;
                    printf("%4d|", mp[i][j]);
                }
                printf("\n———————————\n");
            }
            if (!if_end)
                for (i = 0; i <= 3; i++)
                    for (j = 0; j <= 3; j++)
                    {
                        if (i - 1 >= 0 && mp[i][j] == mp[i - 1][j])
                            if_end = 1;
                        if (j - 1 >= 0 && mp[i][j] == mp[i][j - 1])
                            if_end = 1;
                        if (i + 1 <= 3 && mp[i][j] == mp[i + 1][j])
                            if_end = 1;
                        if (j + 1 <= 3 && mp[i][j] == mp[i][j + 1])
                            if_end = 1;
                    }
            printf("\n\n\n");
            score = 0; //计算分数
            for (i = 0; i <= 3; i++)
                for (j = 0; j <= 3; j++)
                    score += mp[i][j];
            color(11);
            printf("     score=%-6d\n    ——————\n", score);
            color(20); //取消颜色
            if (if_Victory == 1)
            {
                printf("    恭喜你!游戏成功!\n");
                gets(temp);
                gets(temp);
                break;
            }
            else if (if_end == 0)
            {
                printf("    游戏结束!\n");
                gets(temp);
                gets(temp);
            }
        }
        if (ch2 == 77) //右
        {
            system("cls");
            for (j = 2; j >= 0; j--)
            {
                for (i = 0; i < 4; i++)
                {
                    if (mp[i][j + 1] == 0 && mp[i][j] != 0)
                    {
                        mp[i][j + 1] = mp[i][j];
                        mp[i][j] = 0;
                    }
                }
            }
            for (j = 2; j >= 0; j--)
            {
                for (i = 0; i < 4; i++)
                {
                    if (mp[i][j] == mp[i][j + 1])
                    {
                        mp[i][j] = 0;
                        mp[i][j + 1] *= 2;
                    }
                }
            }
            for (j = 2; j >= 0; j--)
            {
                for (i = 0; i < 4; i++)
                {
                    if (mp[i][j + 1] == 0 && mp[i][j] != 0)
                    {
                        mp[i][j + 1] = mp[i][j];
                        mp[i][j] = 0;
                    }
                }
            }
            int geshu = 0;
            sum = 0;
            for (i = 0; i < 4; i++)
                for (j = 0; j < 4; j++)
                    if (mp[i][j] == 0)
                        sum++;
            if (sum == 1) //如果只剩一个空的格子了,那么只需随机生成一个数
                geshu++;
            while (geshu != 2 && geshu != if_end - 1 && sum != 0)
            {
                x = rand() % 4;
                y = rand() % 4; //生成的随机数的坐标
                if (mp[x][y] == 0)
                {
                    int tempp = rand() % 2; //随机生成2或4
                    if (tempp % 2)
                        mp[x][y] = 2;
                    else
                        mp[x][y] = 4;
                    geshu++;
                }
                else
                    continue;
            }
            int if_end = 0;
            printf("———————————\n"); //打印地图
            for (i = 0; i < 4; i++)
            {
                printf("|");
                for (j = 0; j < 4; j++)
                {
                    if (mp[i][j] == 0)
                    {
                        if_end++;
                    }
                    if (level == mp[i][j])
                        if_Victory = 1;
                    printf("%4d|", mp[i][j]);
                }
                printf("\n———————————\n");
            }
            if (!if_end)
                for (i = 0; i <= 3; i++)
                    for (j = 0; j <= 3; j++)
                    {
                        if (i - 1 >= 0 && mp[i][j] == mp[i - 1][j])
                            if_end = 1;
                        if (j - 1 >= 0 && mp[i][j] == mp[i][j - 1])
                            if_end = 1;
                        if (i + 1 <= 3 && mp[i][j] == mp[i + 1][j])
                            if_end = 1;
                        if (j + 1 <= 3 && mp[i][j] == mp[i][j + 1])
                            if_end = 1;
                    }
            printf("\n\n\n");
            score = 0; //计算分数
            for (i = 0; i <= 3; i++)
                for (j = 0; j <= 3; j++)
                    score += mp[i][j];
            color(11);
            printf("     score=%-6d\n    ——————\n", score);
            color(20); //取消颜色
            if (if_Victory == 1)
            {
                printf("    恭喜你!游戏成功!\n");
                gets(temp);
                gets(temp);
                break;
            }
            else if (if_end == 0)
            {
                printf("    游戏结束!\n");
                gets(temp);
                gets(temp);
            }
        }
    }
    return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hesorchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值