2048小游戏c++实现

来源:互联网 发布:耽美网络剧100部百度云 编辑:程序博客网 时间:2024/04/28 02:40

用c++实现了一下2048小游戏,没有界面,用控制台显示。

#include <stdlib.h>#include <time.h>#include <string.h>#include <stdio.h>class Game2048 {public:    Game2048(int _max_score = 2048): max_score(_max_score) {        N = 4;        memset((void*)(matrix[0]), 0, sizeof(matrix));    }    ~Game2048() {}    void LeftOperator();    void RightOperator();    void UpOperator();    void DownOperator();    void PrintMatrix(int);    void AddRand();    int Check();private:    int max_score;    int N;    int matrix[4][4];    int arr[4];    void Move();    void Merge();    void MoveAndMerge();};void Game2048::Move(){    int pos0;    for(pos0 = 0; pos0 < N; ++pos0) {        if(!arr[pos0]) break;    }    for(int i = pos0 + 1; i < N; ++i) {        if(arr[i]) arr[pos0++] = arr[i];    }    while(pos0 < N) {        arr[pos0++] = 0;    }}void Game2048::Merge(){    int pos;    for(pos = 0; pos < N && !arr[pos]; ++pos) {}    for(int i = pos + 1; i < N; ++i) {        if(arr[i]) {            if(arr[i] == arr[pos]) {                arr[pos] <<= 1;                arr[i] = 0;            }            else {                pos = i;            }        }    }}void Game2048::MoveAndMerge(){    for(int i = 0; i < 3; ++i) Merge();    Move();#ifdef DEBUG    for(int i = 0; i < N; ++i) printf("%-6d", arr[i]);#endif}void Game2048::LeftOperator(){    for(int ver = 0; ver < N; ++ver) {        memcpy((void*)arr, (void*)matrix[ver], sizeof(arr));        MoveAndMerge();        memcpy((void*)matrix[ver], (void*)arr, sizeof(arr));    }}void Game2048::RightOperator(){    for(int ver = 0; ver != N; ++ver) {        for(int hor = 0; hor < N; ++hor) arr[hor] = matrix[ver][N-1-hor];        MoveAndMerge();        for(int hor = 0; hor < N; ++hor) matrix[ver][hor] = arr[N-1-hor];    }}void Game2048::UpOperator(){    for(int hor = 0; hor < N; ++hor) {        for(int i = 0; i < N; ++i) arr[i] = matrix[i][hor];        MoveAndMerge();        for(int i = 0; i < N; ++i) matrix[i][hor] = arr[i];    }}void Game2048::DownOperator(){    for(int hor = 0; hor < N; ++hor) {        for(int i = 0; i < N; ++i) arr[i] = matrix[N-1-i][hor];        MoveAndMerge();        for(int i = 0; i < N; ++i) matrix[i][hor] = arr[N-1-i];    }}void Game2048::AddRand(){    int num = 2;    srand(unsigned(time(NULL)));    if((rand() % 4) == 3) num = 4;    int zero = 0;    for(int i = 0; i < N; ++i) {        for(int j = 0; j < N; ++j) {            if(!matrix[i][j]) zero++;        }    }    int pos = rand() % zero + 1;    int count = 0;    for(int i = 0; i < N; ++i) {        for(int j = 0; j < N; ++j) {            if(!matrix[i][j]) {                count++;                if(count == pos) {                    matrix[i][j] = num;                    break;                }            }        }    }}void Game2048::PrintMatrix(int step){    printf("\nstep: %d\n", step);    printf("---------------------------\n");    for(int i = 0; i < N; ++i) {        printf("| ");        for(int j = 0; j < N; ++j) {            if(matrix[i][j]) printf("%-6d", matrix[i][j]);            else printf("      ");        }        printf("|\n");    }    printf("---------------------------\n");}int Game2048::Check(){    int count = 0;    for(int i = 0; i < N; ++i) {        for(int j = 0; j < N; ++j) {            if(matrix[i][j] == max_score) return 1;            if(matrix[i][j]) count++;        }    }    if(N * N == count) return -1;    return 0;}int main(){    while(1) {        Game2048 game(2048);        game.AddRand();        game.AddRand();        printf("输入方向, w代表上, s代表下, a代表左, d代表右, 然后按回车键\n");        int step = 0;        game.PrintMatrix(step++);        while(1) {            printf("输入方向: ");            char temp, c = 'e';            while( (temp = getchar()) != 10) {                if(('e' == c) && ('w' == temp || 'a' == temp || 's' == temp || 'd' == temp) ) {                        c = temp;                }            }            switch (c) {                case 'a': game.LeftOperator(); break;                case 'd': game.RightOperator(); break;                case 'w': game.UpOperator(); break;                case 's': game.DownOperator(); break;                default: break;            }            if('e' == c) {                printf("\n输入错误!\n");                continue;            }            game.AddRand();            game.PrintMatrix(step++);            int res = game.Check();            if(1 == res) {                 printf("\nWin!\n\n\n");                break;            }            if(-1 == res) {                printf("\n失败!\n\n\n");                break;            }        }    }    return 0;}

实现出来的效果是这样子的…

这里写图片描述

0 0
原创粉丝点击