2048核心演算法,c 實現

2021-08-25 22:28:07 字數 2136 閱讀 7668

這一篇主要講如何相應操縱者給出的指令,對地圖進行相應的操作。

這裡我最開始的思路很簡單,就是將地圖的移動方式分為四種,即上(w)下(s)左(a)右(d)。

但是如果分為四個函式的話,那就太繁瑣了,復用性太差,相同的**複製四次只修改一點,十分難看,所以通過思考將四個移動方式合併成為乙個移動方式就是本篇所要思考的內容。

在最外層的movemap()函式就是用來識別wasd這四個指令。

void movemap(int(&map)[map_size][map_size], const char command, int &score) 

}

用乙個switch來識別四個方向,通過修改函式move()內的引數來識別是哪個方向的。

通過觀察可以發現:

也就是說,兩兩之間存在聯絡。下面我就詳細解釋一下怎麼將其通過轉換將相似之處合併的。

函式的**實現如下

void move(int(&map)[map_size][map_size], int direction, int position, int &score) 

//首先移動所有格仔,讓其靠在一起

deletezero(map, position);

for (int j = 0; j < map_size; j++)

else }}

//補充因合併產生的空位

deletezero(map, position);

//如果是水平方向上的話, 最後再轉置一下

if (direction == 1)

}

函式總共傳入四個引數,第乙個就是地圖,第二個是移動的方向,第三個為掃瞄的起始位置,第四個為分數。

首先我考慮的是,如何將上下移動和左右移動合併到一起。

因為地圖map是乙個二維陣列,所以我們可以這樣思考:

向上移動是令所有格仔從每一標號為map_size-1的位置移向0位置。

向左移動是令所有格仔從每一標號為map_size-1的位置移向0位置。

向下移動是令所有格仔從每一標號為0的位置移向map_size-1位置。

向右移動是令所有格仔從每一標號為0的位置移向map_size-1位置。

那麼這樣一分就應該很明白了,引數direction用來分辨是對行操作還是對列操作(分辨上下還是左右),引數posititon是區分從**移動到**(分辨上左還是下右)。

那麼如果將左右通過變換為上下操作,那麼我們就可以只考慮position了。所以我這裡用了轉置。

通過將整個地圖作為乙個矩陣進行轉置,即通過對對角線進行反轉,那麼就可以將左右變換為上下。

所以通過direction分辨是上下還是左右,上下為0,左右為1。如果為左右,就對地圖進行轉置,即函式transpose()。通過轉置以後,我們就可以只考慮移動的問題了。

因為地圖中可能所有的格點沒有全部都靠在一起,這樣會對我們識別相同格仔造成困擾,所以我們需要首先移動格仔,讓所有格仔靠在一起,移動的方向就是通過操縱者決定。這裡通過deletezero()函式決定。

void deletezero(int(&map)[map_size][map_size], int position) }}

}}

}

原理就是通過position引數將上下移動合併。從0到map_size-1不變,從map_size-1到0則轉化為-map_size到0,這樣就可以統一了兩者的移動方向,移動的話只需要+1即可。然後在尋找座標的時候取絕對值。

之後的合併也是同理,通過將其在座標系上化為從-map_size-1到map_size-1再去絕對值即可。然後對每乙個格點判斷移動方向上是否有相同的格仔,如果有的話就合併。

合併結束後再合併一下因為合併產生的空位,讓所有格點靠在一起。

最後再將水平方向上的移動轉置以下,回歸成原來的水平方向。

合併操作完以後,就需要判斷遊戲是否結束了。

bool isover(int(&map)[map_size][map_size]) }}

return true;

}

邏輯也很簡單,如果map中沒有0了,那就返回已經空了,否則跳出返回還沒空

2048 遊戲核心演算法

2048 遊戲核心演算法 架構顯示 介面 與控制 演算法 分離 控制台pyqt pygame 演算法1.高內聚 上下移動 矩陣轉置 左右移動 向左移動 合併資料 零元素後移 向右移動 翻轉 合併資料 零元素後移 2.降維思想 將二維列表的操作,改為對一維列表的操作.list merge none z...

用於C51的2048核心演算法

直接可以使用,呼叫turn direction 即可以對4x4陣列進行移動。用法 宣告乙個4x4陣列,並賦初值為0,然後呼叫給定的turn 跟 addnumber即可。ps is over有錯誤,其他正常,過幾天修正。測試 平台為vs2010,測試通過。介面名稱 turn direction die...

C 鬥牛核心演算法

撲克牌 0 52 取隨機數 using system using system.collections using system.collections.generic public class bullfighttools 要牌 public static int getnumber while ...