2048小游戏(c++)(转)
阅读原文时间:2023年07月13日阅读:1

下为源码

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

int const ROW = 4;
int const COL = 4;
int game[ROW][COL] = {0};

//上下左右
int const UP = 1;
int const DOWN = 2;
int const LEFT = 3;
int const RIGHT = 4;

//游戏所处的状态
int const GAME_OVER = 1;
int const GAME_WIN = 2;
int const GAME_CONTINUE = 3;

enum GameNum
{
    Game_2 = 2,
    Game_4 = 4,
    Game_8 = 8,
    Game_16 = 16,
    Game_32 = 32,
    Game_64 = 64,
    Game_128 = 128,
    Game_256 = 256,
    Game_512 = 512,
    Game_1024 = 1024,
    Game_2048 = 2048,
};

//打印所得的数组
void Print()
{
    system("cls");
    cout << "*****************  2048 控 制 台 版  ******************" << endl;
    cout << "*****************  By Tanzf (Intern) ******************" << endl << endl;
    for (int i = 0; i < ROW; ++i)
    {
        cout << "---------------------------------"<< endl;
        for (int j = 0; j < COL; ++j)
        {
            if (game[i][j] == 0)
            {
                cout <<"|   \t";
            }
            else
            {
                cout <<"|   " << game[i][j] << "\t";
            }
        }
        cout << "|" << endl;
    }
    cout << "---------------------------------"<< endl;
}

bool CreateNumber()
{
    int x = -1;
    int y = -1;
    int times = 0;
    int maxTimes = ROW * COL;
    //三分之二的概率生成2,三分之一的概率生成4
    int whitch = rand() % 3;
    do
    {
        x = rand() % ROW;
        y = rand() % COL;
        ++times;
    } while (game[x][y] != 0 && times <= maxTimes);

    //说明格子已经满了
    if(times >= maxTimes)
    {
        return false;
    }
    else
    {
        GameNum num;
        if(whitch == 0)
        {
            num = Game_4;
        }
        else if(whitch)
        {
            num = Game_2;
        }
        game[x][y] = num;
    }

    return true;
}

void Process(int direction)
{
    switch (direction)
    {
    case UP:
        //最上面一行不动
        for(int row = 1; row < ROW; ++row)
        {
            for(int crow = row; crow >= 1; --crow)
            {
                for(int col = 0; col < COL; ++col)
                {
                    //上一个格子为空
                    if(game[crow-1][col] == 0)
                    {
                        game[crow-1][col] = game[crow][col];
                        game[crow][col] = 0;
                    }
                    else
                    {
                        //合并
                        if(game[crow-1][col] == game[crow][col])
                        {
                            game[crow - 1][col] *= 2;
                            game[crow][col] = 0;
                        }

                    }
                }
            }
        }
        break;
    case DOWN:
        //最下面一行不动
        for(int row = ROW - 2; row >= 0; --row)
        {
            for(int crow = row; crow < ROW - 1; ++crow)
            {
                for(int col = 0; col < COL; ++col)
                {
                    //上一个格子为空
                    if(game[crow + 1][col] == 0)
                    {
                        game[crow + 1][col] = game[crow][col];
                        game[crow][col] = 0;
                    }
                    else
                    {
                        //合并
                        if(game[crow + 1][col] == game[crow][col])
                        {
                            game[crow + 1][col] *= 2;
                            game[crow][col] = 0;
                        }

                    }
                }
            }
        }
        break;
    case LEFT:
        //最左边一列不动
        for(int  col = 1; col < COL; ++col)
        {
            for(int ccol = col; ccol >= 1; --ccol)
            {
                for(int row = 0; row < ROW; ++row)
                {
                    //上一个格子为空
                    if(game[row][ccol-1] == 0)
                    {
                        game[row][ccol - 1] = game[row][ccol];
                        game[row][ccol] = 0;
                    }
                    else
                    {
                        //合并
                        if(game[row][ccol - 1] == game[row][ccol])
                        {
                            game[row][ccol - 1] *= 2;
                            game[row][ccol] = 0;
                        }

                    }
                }
            }
        }
        break;
    case RIGHT:
        //最右边一列不动
        for(int  col = COL - 2; col >= 0; --col)
        {
            for(int ccol = col; ccol <= COL - 2; ++ccol)
            {
                for(int row = 0; row < ROW; ++row)
                {
                    //上一个格子为空
                    if(game[row][ccol + 1] == 0)
                    {
                        game[row][ccol + 1] = game[row][ccol];
                        game[row][ccol] = 0;
                    }
                    else
                    {
                        //合并
                        if(game[row][ccol + 1] == game[row][ccol])
                        {
                            game[row][ccol + 1] *= 2;
                            game[row][ccol] = 0;
                        }

                    }
                }
            }
        }
        break;
    }

}

//处理输入输出,返回上下左右
int Input()
{
    //读取上下左右四个方向键
    int upArrow = 0;
    int downArrow = 0;
    int leftArrow = 0;
    int rightArrow = 0;
    int direction = 0;
    while (true)
    {
        upArrow = GetAsyncKeyState(VK_UP);
        downArrow = GetAsyncKeyState(VK_DOWN);
        leftArrow = GetAsyncKeyState(VK_LEFT);
        rightArrow = GetAsyncKeyState(VK_RIGHT);

        if(upArrow)
        {
            direction = UP;
            break;
        }
        else if(downArrow)
        {
            direction = DOWN;
            break;
        }
        else if(leftArrow)
        {
            direction = LEFT;
            break;
        }
        else if(rightArrow)
        {
            direction = RIGHT;
            break;
        }

        Sleep(100);
    }

    return direction;
}

//判断游戏状态
int Judge()
{
    //赢得游戏
    for(int i = 0; i < ROW; ++i)
    {
        for(int j = 0; j < COL; ++j)
        {
            if(game[i][j] == 2048)
            {
                return GAME_WIN;
                break;
            }
        }
    }

    //横向检查
    for(int i = 0 ; i < ROW; ++i)
    {
        for(int j = 0; j < COL - 1; ++j)
        {
            if(!game[i][j] || (game[i][j] == game[i][j+1]))
            {
                return GAME_CONTINUE;
                break;
            }
        }
    }
    //纵向检查
    for(int j = 0; j< COL; ++j)
    {
        for(int i = 0; i < ROW -1; ++i)
        {
            if(!game[i][j] || (game[i][j] == game[i+1][j]))
            {
                return GAME_CONTINUE;
                break;
            }
        }
    }

    //不符合上述两种状况,游戏结束
    return GAME_OVER;

}

int main()
{
    //设置一个随机数种子
    srand((unsigned int)time(0));
    CreateNumber();
    CreateNumber();
    Print();
    int direction = 0;
    int gameState = -1;
    while(true)
    {
        direction = Input();

        gameState = Judge();
        if(direction && gameState == GAME_CONTINUE)
        {
            Process(direction);
            CreateNumber();
            Print();
            Sleep(100);
        }
        else if(gameState == GAME_WIN)
        {
            Print();
            cout << "You Win!" << endl;
            break;
        }
        else if(gameState == GAME_OVER)
        {
            Print();
            cout <<"You lose!" << endl;
            break;
        }
    }

    return 0;
}

版权声明:本文为CSDN博主「AceTan」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/one_piece_luffy/article/details/44240295

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器