简易的2048

一个命令行版本的2048。支持自定义游戏矩阵的长和宽。同时也是我中学生电脑制作大赛的参赛作品。


#include<cstdio>
#include<iostream>
#include<windows.h>
#include<ctime>
#include<cstdlib>
using namespace std;

void readInput(int* l, int* h);
void gameStart(int l, int h);

class GameTable {
private:
    int t[10][10];
    int length, height;
    int score;

    bool cleanLeft(bool status) {
        bool sta = false;
        if(status) {
            for(int i = 0 ; i < height ; i++) {
                for(int j = 0 ; j < length ; j++) {
                    if(t[i][j]) {
                        int tmp = j - 1;
                        while(!t[i][tmp] && tmp >= 0) {
                            tmp--;
                        }
                        tmp++;
                        if(tmp != j) {
                            t[i][tmp] = t[i][j];
                            t[i][j] = 0;
                            sta = true;
                        }
                    }
                }
            }
        }
        return sta;
    }

    bool cleanRight(bool status) {
        bool sta = false;
        if(status) {
            for(int i = 0 ; i < height ; i++) {
                for(int j = length - 1 ; j >= 0 ; j--) {
                    if(t[i][j]) {
                        int tmp = j + 1;
                        while(!t[i][tmp] && tmp <= length - 1) {
                            tmp++;
                        }
                        tmp--;
                        if(tmp != j) {
                            t[i][tmp] = t[i][j];
                            t[i][j] = 0;
                            sta = true;
                        }
                    }
                }
            }
        }
        return sta;
    }

    bool cleanUp(bool status) {
        bool sta = false;
        if(status) {
            for(int i = 0 ; i < length ; i++) {
                for(int j = 0 ; j < height ; j++) {
                    if(t[j][i]) {
                        int tmp = j - 1;
                        while(!t[tmp][i] && tmp >= 0) {
                            tmp--;
                        }
                        tmp++;
                        if(tmp != j) {
                            t[tmp][i] = t[j][i];
                            t[j][i] = 0;
                            sta = true;
                        }
                    }
                }
            }
        }
        return sta;
    }

    bool cleanDown(bool status) {
        bool sta = false;
        if(status) {
            for(int i = 0 ; i < length ; i++) {
                for(int j = height - 1 ; j >= 0 ; j--) {
                    if(t[j][i]) {
                        int tmp = j + 1;
                        while(!t[tmp][i] && tmp <= height - 1) {
                            tmp++;
                        }
                        tmp--;
                        if(tmp != j) {
                            t[tmp][i] = t[j][i];
                            t[j][i] = 0;
                            sta = true;
                        }
                    }
                }
            }
        }
        return sta;
    }

    int max(int x, int y) {
        return x > y ? x : y;
    }

    int min(int x, int y) {
        return x < y ? x : y;
    }
public:
    GameTable(int l, int h) {
        memset(t, 0, sizeof(t));
        length = l;
        height = h;
        score = 0;
    }

    bool moveLeft(void) {
        bool status = false;
        if(cleanLeft(true) == true) {
            status = true;
        }
        for(int i = 0 ; i < height ; i++) {
            for(int j = length - 1 ; j > 0 ; j--) {
                if(t[i][j] == t[i][j - 1] && t[i][j] != 0) {
                    status = true;
                    t[i][j] = 0;
                    t[i][j - 1] *= 2;
                    score += t[i][j - 1];
                    j--;
                }
            }
        }
        cleanLeft(status);
        return status;
    }

    bool moveRight(void) {
        bool status = false;
        if(cleanRight(true) == true) {
            status = true;
        }
        for(int i = 0 ; i < height ; i++) {
            for(int j = 0 ; j < length - 1 ; j++) {
                if(t[i][j] == t[i][j + 1] && t[i][j] != 0) {
                    status = true;
                    t[i][j] = 0;
                    t[i][j + 1] *= 2;
                    score += t[i][j + 1];
                    j++;
                }
            }
        }
        cleanRight(status);
        return status;
    }

    bool moveUp(void) {
        bool status = false;
        if(cleanUp(true) == true) {
            status = true;
        }
        for(int i = 0 ; i < length ; i++) {
            for(int j = height - 1 ; j > 0 ; j--) {
                if(t[j][i] == t[j - 1][i] && t[j][i] != 0) {
                    status = true;
                    t[j][i] = 0;
                    t[j - 1][i] *= 2;
                    score += t[j - 1][i];
                    j--;
                }
            }
        }
        cleanUp(status);
        return status;
    }

    bool moveDown(void) {
        bool status = false;
        if(cleanDown(true) == true) {
            status = true;
        }
        for(int i = 0 ; i < length ; i++) {
            for(int j = 0 ; j < height - 1 ; j++) {
                if(t[j][i] == t[j + 1][i] && t[j][i] != 0) {
                    status = true;
                    t[j][i] = 0;
                    t[j + 1][i] *= 2;
                    score += t[j + 1][i];
                    j++;
                }
            }
        }
        cleanDown(status);
        return status;
    }

    bool gameStatus(void) {
        bool status = false;
        for(int i = 0 ; i < height ; i++) {
            for(int j = 0 ; j < length ; j++) {
                if(t[i][j] == 0) {
                    status = true;
                    break;
                }
            }
            if(status) {
                break;
            }
        }
        for(int i = 1 ; i < height - 1 ; i++) {
            for(int j = 1 ; j < length - 1 ; j++) {
                int tmp = t[i][j];
                if(t[i][j + 1] == tmp || t[i][j - 1] == tmp || t[i - 1][j] == tmp || t[i + 1][j] == tmp) {
                    status = true;
                    break;
                }
            }
            if(status) {
                break;
            }
        }
        if(t[0][0] == t[0][1] || t[0][0] == t[1][0]) {
            status = true;
        }
        if(t[0][length - 1] == t[0][length - 2] || t[0][length - 1] == t[1][length - 1]) {
            status = true;
        }
        if(t[height - 1][0] == t[height - 1][1] || t[height - 1][0] == t[height - 2][0]) {
            status = true;
        }
        if(t[height - 1][length - 1] == t[height - 2][length - 1] || t[height - 1][length - 1] == t[height - 1][length - 2]) {
            status = true;
        }
        return status;
    }

    void printTable(void) {
        for(int i = 0 ; i < height ; i++) {
            for(int j = 0 ; j < length ; j++) {
                printf("%d\t", t[i][j]);
            }
            printf("\n");
        }
        printf("Score:%d\n", score);
    }

    void addNum(void) {
        int l = rand() % length;
        int h = rand() % height;
        while(t[h][l]) {
            l = rand() % length;
            h = rand() % height;
        }
        int num = rand() % 2;
        if(num == 0) {
            t[h][l] = 2;
        } else {
            t[h][l] = 4;
        }
    }
};

int main() {
    int l, h;
    srand((unsigned)time(NULL));
    bool sta = true;
    while(sta) {
        readInput(&l, &h);
        gameStart(l, h);
        printf("Would you like to play again?(Y/N):");
        char s = getchar();
        fflush(stdin);
        while(!(s == 'n' || s == 'N' || s == 'y' || s == 'Y')) {
            printf("Input error! Please input again:");
            s = getchar();
            fflush(stdin);
        }
        if(s == 'N' || s == 'n') {
            printf("Thanks for playing! Please press enter to exit.");
            sta = false;
            getchar();
        } else {
            printf("\n\n");
        }
    }
}

void readInput(int* l, int* h) {
    printf("Please input the length and height(separated by a comma)(3 <= length <= 10 and 3 <= height <= 10):");
    scanf("%d,%d", l, h);
    printf("%d %d", *l, *h);
    while(!(*l <= 10 && *h <= 10 && *l >= 3 && *h >= 3)) {
        printf("Input error! Please input again:");
        scanf("%d,%d", l, h);
    }
}

void gameStart(int l, int h) {
    GameTable *gt = new GameTable(l, h);
    char op;
    gt -> addNum();
    while(gt -> gameStatus()) {
        system("cls");
        gt -> printTable();
        fflush(stdin);
        scanf("%c", &op);
        bool sta;
        switch(op) {
            case 'w':
                sta = gt -> moveUp();
                break;
            case 's':
                sta = gt -> moveDown();
                break;
            case 'a':
                sta = gt -> moveLeft();
                break;
            case 'd':
                sta = gt -> moveRight();
                break;
            default:
                printf("Error! Please input again:");
                scanf("%d", &op);
        }
        if(sta) {
            gt -> addNum();
        }
    }
    system("cls");
    gt -> printTable();
    printf("\n\nGame Over!!\n\n");
    delete gt;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值