当前位置: 首页 > 工具软件 > 2048.cpp > 使用案例 >

C++ 2048 编程 小游戏

庞乐池
2023-12-01
#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;
    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
        	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] == 8192)  
            {  
                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;  
}

 类似资料: