简易的2048

来源:互联网 发布:社交网络mp4 编辑:程序博客网 时间:2024/05/21 03:56

一个命令行版本的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;}
0 0
原创粉丝点击