2048控制台版本

#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 baihe (samsung) ******************" << endl << endl;  
    for (int i = 0; i < ROW; ++i)  
    {  
        cout << "---------------------------------"<< endl;  
        for (int j = 0; j < COL; ++j)  
        {  
            if (game[i][j] == 0)  
            {  
                cout <<"|   	";  
            }  
            else   
            {  
                cout <<"|   " << game[i][j] << "	";  
            }  
        }  
        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;  
}  
大多数想法要么平庸,要么更糟糕,这很大程度上因为绝妙的想法难得一见,而且他们还要在我们身边这个充斥了各种恶俗的所谓常识的环境中孕育生长。
原文地址:https://www.cnblogs.com/linux0537/p/6100616.html