2048小游戏c++实现

用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;
}

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

这里写图片描述

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值