2048

· · 休闲·娱乐

目前是毛坯版 2048

#include <cstdio>
#include <conio.h>
#include <windows.h>
#include <ctime>
#include <cstdlib>
#include <algorithm>

char ch;
int a[10][10], x, y, flag, score, max;

inline void print() {
    system("cls");
    puts(""), puts(""), puts(""), puts(""), puts(""), puts("");
    printf("                                             ");
    printf("score : %d     max : %d\n", score, max);
    printf("                                             ");
    printf("----------------------------\n");
    printf("                                             ");
    printf("|%5d|%5d|%5d|%5d|\n", a[0][0], a[0][1], a[0][2], a[0][3]);
    printf("                                             ");
    printf("----------------------------\n");
    printf("                                             ");
    printf("|%5d|%5d|%5d|%5d|\n", a[1][0], a[1][1], a[1][2], a[1][3]);
    printf("                                             ");
    printf("----------------------------\n");
    printf("                                             ");
    printf("|%5d|%5d|%5d|%5d|\n", a[2][0], a[2][1], a[2][2], a[2][3]);
    printf("                                             ");
    printf("----------------------------\n");
    printf("                                             ");
    printf("|%5d|%5d|%5d|%5d|\n", a[3][0], a[3][1], a[3][2], a[3][3]);
    printf("                                             ");
    printf("----------------------------\n");
}

inline int random_2or4() {
    return rand() % 10 ? 2 : 4;
}

inline void myup() {
    flag = 0; 
    for (int i = 0; i < 4; i++)
        for (int j = 1; j < 4; j++)
            for (int k = j; k; k--)
                if (!a[k - 1][i] && a[k][i])
                    a[k - 1][i] = a[k][i], a[k][i] = 0, flag = 1;
    for (int i = 0; i < 4; i++) 
        for (int j = 0; j < 3; j++)
            if (a[j][i] && a[j][i] == a[j + 1][i]) {
                flag = 1;
                a[j][i] <<= 1;
                score += a[j][i];
                max = std :: max(a[j][i], max);
                for (int k = j + 1; k < 4; k++)
                    a[k][i] = a[k + 1][i];
            }
    return;
}
inline void mydown() {
    flag = 0; 
    for (int i = 0; i < 4; i++)
        for (int j = 2; j >= 0; j--)
            for (int k = j; k < 3; k++)
                if (!a[k + 1][i] && a[k][i])
                    a[k + 1][i] = a[k][i], a[k][i] = 0, flag = 1;
    for (int i = 0; i < 4; i++) 
        for (int j = 3; j; j--)
            if (a[j][i] && a[j][i] == a[j - 1][i]) {
                flag = 1;
                a[j][i] <<= 1;
                score += a[j][i];
                max = std :: max(a[j][i], max);
                for (int k = j - 1; k; k--)
                    a[k][i] = a[k - 1][i];
                a[0][i] = 0;
            }
    return;
}
inline void myleft() {
    flag = 0; 
    for (int i = 0; i < 4; i++)
        for (int j = 1; j < 4; j++)
            for (int k = j; k; k--)
                if (!a[i][k - 1] && a[i][k])
                    a[i][k - 1] = a[i][k], a[i][k] = 0, flag = 1;
    for (int i = 0; i < 4; i++) 
        for (int j = 0; j < 3; j++)
            if (a[i][j] && a[i][j] == a[i][j + 1]) {
                flag = 1;
                a[i][j] <<= 1;
                score += a[i][j];
                max = std :: max(a[i][j], max);
                for (int k = j + 1; k < 4; k++)
                    a[i][k] = a[i][k + 1];
            }
    return;
}
inline void myright() {
    flag = 0; 
    for (int i = 0; i < 4; i++)
        for (int j = 2; j >= 0; j--)
            for (int k = j; k < 3; k++)
                if (!a[i][k + 1] && a[i][k])
                    a[i][k + 1] = a[i][k], a[i][k] = 0, flag = 1;
    for (int i = 0; i < 4; i++) 
        for (int j = 3; j; j--)
            if (a[i][j] && a[i][j] == a[i][j - 1]) {
                flag = 1;
                a[i][j] <<= 1;
                score += a[i][j];
                max = std :: max(a[i][j], max);
                for (int k = j - 1; k; k--)
                    a[i][k] = a[i][k - 1];
                a[i][0] = 0;
            }
    return;
}

int main(void) {
    srand(time(nullptr));
    max = a[rand() % 4][rand() % 4] = random_2or4();
    x = rand() % 4, y = rand() % 4;
    while (a[x][y]) x = rand() % 4, y = rand() % 4;
    max = std :: max(a[x][y] = random_2or4(), max);
    system("color 1E");
    print();
    while (1) {
        if (_kbhit()) {
            ch = _getch();
            if (ch == 72) 
                myup();
            else if (ch == 80)
                mydown();
            else if (ch == 75)
                myleft();
            else if (ch == 77)
                myright();
            else continue;
            print();
            if (!flag) continue;
            Sleep(200);
            x = rand() % 4, y = rand() % 4;
            while (a[x][y]) x = rand() % 4, y = rand() % 4;
            max = std :: max(a[x][y] = random_2or4(), max);
            print();
        }
    }

    return 0;
}