C++實現控制台版2048

來源:互聯網
上載者:User

標籤:演算法   lock   alt   解釋   結束   mil   asc   畫布   else   

前言

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

 

 

簡介

  二維數組遍曆,C++基礎資料型別 (Elementary Data Type),string類,控制結構,函數。

  本方法不涉及指標以及物件導向思想,所以可作為剛入門C++的新人的第一個小project。

 

 

 實現思路1.背景

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

2.隨機數字及位置

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

 

    //隨機一個位置    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;}

 

  按下←時,判斷整個畫布是否可以向左移動。

 

//左移函數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://files.cnblogs.com/files/henuzyx/2048.zip

 

 

 

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

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

  希望可以交流討論。

  JavaScript版本github連結:

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

 

C++實現控制台版2048

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.