zoukankan      html  css  js  c++  java
  • 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;  
    }  
    大多数想法要么平庸,要么更糟糕,这很大程度上因为绝妙的想法难得一见,而且他们还要在我们身边这个充斥了各种恶俗的所谓常识的环境中孕育生长。
  • 相关阅读:
    前端日常开发常用功能系列之乱序
    ES6系列之箭头函数
    ES6系列之let/const及块级作用域
    前端日常开发常用功能系列之数组扁平
    前端日常开发常用功能系列之数组最值
    前端日常开发常用功能系列之拷贝
    前端日常开发常用功能系列之数组去重
    前端日常开发常用功能系列之节流
    前端日常开发常用功能系列之防抖
    数据库连接池优化配置(druid,dbcp,c3p0)
  • 原文地址:https://www.cnblogs.com/linux0537/p/6100616.html
Copyright © 2011-2022 走看看