Advertisement

C++ 2048 编程 小游戏

阅读量:

该程序实现了经典的2048单人游戏。通过方向键控制方块的移动,在相同数字方块合并后填入较大的数值(从2开始每次翻倍)。棋盘为4x4网格,目标是通过操作使某一格达到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 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;  
    
 }
    
    
    
    
    AI助手

全部评论 (0)

还没有任何评论哟~