C++實現控制檯版2048(內附彩蛋)

前言

  以前作過一個JavaScript版本的2048遊戲,最近在學習C++,昨天晚上忽然心血來潮,想用C++來實現,由於核心算法已十分理解,因此兩個小時擼出來一個C++的簡易版本。git

 


 

簡介

  二維數組遍歷,C++基本數據類型,string類,控制結構,函數。github

  本方法不涉及指針以及面向對象思想,因此可做爲剛入門C++的新人的第一個小project。算法

 


 

效果圖


 

實現思路

1.背景

  遊戲的背景即一個4*4的二維數組,經過每次運動中二維數組中值的變化以及數字的位置的變化,完成該遊戲。數組

2.隨機數字及位置

  遊戲的開始階段須要隨機出兩個數字,以後每次移動都須要在空白處隨機出一個新的數字(2 / 4)。dom


 

//隨機一個位置
    int randX = rand()%4;
    int randY = rand()%4;
    int times = 0;
    while (times < 50)
    {
        if (0 == board[randX][randY])
            break;
        randX = rand()%4;
        randY = rand()%4;
        times++;
    }
    if (50 == times)
    {
        for (int i=0; i<4; i++)
            for (int j=0; j<4; j++)
                if (0 == board[i][j])
                {
                    randX = i;
                    randY = j;
                }
    }

  首先隨機獲得一個空白處(即二維數組等於0),在算法方面作了優化,先由系統隨意選擇50次,若沒能找到空白處,則手動找到一個位置,可必定程度地加快位置隨機的速度。函數


 

//隨機一個數字
    int randomNumber = rand()%100*0.01 < 0.5 ? 2 : 4;

 

  在0~1之間任意取值,若是小於0.5即隨機獲得2,反之隨機獲得4,保證出現2和4的可能性相同。學習

 

3.運動算法

  四個方向上的運動大體相同,只不過在臨界處有細微區別,下面以向左移動進行解釋。優化

 


 

//判斷水平路徑上是否有障礙物
bool noBlock1(int row, int col1, int col2, int board[][4])
{
    for (int i=col1+1; i<col2; i++)
        if (0 != board[row][i])
            return false;

    return true;
}

  對每一個物體進行判斷,在第row排,從col1到col2的範圍內是否有障礙物。動畫


 

 

//判斷可否向左移動
bool canMoveLeft(int board[][4])
{
    for (int i=0; i<4; i++)
        for (int j=1; j<4; j++)
            if (0 != board[i][j])
                if (0 == board[i][j-1] || board[i][j-1] == board[i][j])
                   return true;

    return false;
}

 

  按下←時,判斷整個畫布是否能夠向左移動。spa


 

//左移函數
bool moveLeft()
{
    if (!canMoveLeft(board))
        return false;
    //moveLeft
    //落腳位置是否爲空
    //落腳位置數字是否相等
    //移動路徑中是否有障礙物
    for (int i=0; i<4; i++)
        for (int j=0; j<4; j++)
            if (0 != board[i][j])
                for (int k=0; k<j; k++)
                    if (0 == board[i][k] && noBlock1(i, k, j, board))
                    {
                        //move
                        board[i][k] = board[i][j];
                        board[i][j] = 0;
                        continue;
                    }
                    else if (board[i][k] == board[i][j] && noBlock1(i, k, j, board))
                    {
                        //move and add
                        board[i][k] *= 2;
                        board[i][j] = 0;
                        continue;
                    }

    initial();
}

 

  由以上兩種判斷爲基礎,構建左移核心算法。


 

 

 

完整代碼

  https://github.com/henuzyx/Cplusplus2048

 


 

 

  C++版本意在複習基本遊戲算法,熟悉C++語法,並無在細節方面考慮,好比沒有添加遊戲結束的斷定等。

  不過,個人JavaScript版本功能完善,包括遊戲結束顯示,動畫效果,記錄當前步數,記錄當前分數,保存最高分,撤銷回上一步。

  但願能夠交流討論。

  JavaScript版本github連接:

  https://github.com/henuzyx/2048-by-JavaScript

相關文章
相關標籤/搜索