Python2048演算法開發

2021-08-28 14:32:08 字數 3419 閱讀 6480

源**的鏈結可以在最下面找到,源**中的2048演算法包含介面的開發,但本次關於2048演算法的講解不包含介面的開發。

這個演算法是我自己思考出來的,沒有借鑑其他人的**,希望大家能從中學到一點東西。演算法的整體內容非常簡單,主要由兩個函式構成,但是在考慮這兩個函式之前是什麼之前,我們先考慮,怎樣讓一行四列的數字,完成一次2048模式的移動。比如

在2048中,如果我們要移動到右側,該怎樣移動。我們可以把這個過程分為兩個步驟來實現。

第乙個步驟,我們把該合併的塊都合併起來。即我們要得到

第二個步驟,我們把所有的數字都移動到右側,不留空格。即我們要得到

第二個步驟非常簡單,我們主要考慮的就是第乙個步驟的實現。2048,一次移動只有磚塊上的數字相等才能合併,從這個點出發,我們只要尋找相等的磚塊即可,如果找到兩個相等的磚塊,且他們的中間沒有任何磚塊相隔,就合併起來。

在四個磚塊都是未知數的情況下,我們需要知道第乙個有數字的磚塊(即數字不為0)的位置。

我們給出乙個簡單的函式用於實現它。

def _2048_findfirstnumber(start_pos:int,row:list) -> int:

'''找到第乙個不為0的數字的位置,然後返回'''

for i in range(start_pos,len(row)):

if i != 0:

return i

return -1

接下來是演算法的核心部分,乙個比較相對來說簡單的函式,涵蓋了我對2048的全部理解。

找到第乙個不為0的數字後,記錄它的位置變數為pos,開始尋找關於它的匹配磚塊,從pos開始遇到的第乙個不為0的磚塊就是它的準配對,如果兩者相等,則合併,如果兩者不相等,拋棄第乙個尋找到的數字,重新開始上述過程,(在配對成功的情況下)如果從pos開始遇到的第乙個磚塊的位置已經是第三塊或者第四塊磚,則結束本次函式,如果不是,則從當前位置+1處繼續重複上述過程。如果你覺得思想太抽象或者看不懂的話,以下是上述這段話的**實現.

def _2048_discussrow(row,start_pos=0):

'''合併所有可以合併的數字'''

copy_row = row[:] #複製乙份,以防這個row是乙個類變數

pos_t = _2048_findfirstnumber(start_pos,row) #找到第乙個數字之後

# 如果pos_t為-1,即為[0,0,0,0],退出函式

# 如果pos_t為3,即為[0,0,0,2x],也退出函式

if pos_t == -1 or pos_t == len(copy_row) - 1:

return copy_row

else:

#符合"有可能會有配對的磚塊"這個條件下

#開始尋找相匹配的磚塊

for i in range(pos_t + 1,len(copy_row)):

if copy_row[i] != 0:

if copy_row[i] == copy_row[pos_t]:

#找到了相等的磚塊,合併一下

copy_row[i] *= 2

copy_row[pos_t] = 0

if i == len(copy_row) - 1 or i == len(copy_row) - 2:

return copy_row

else:

return _2048_discussrow(copy_row,i+1)

else:

#磚塊並不相等,則放棄第乙個磚塊

return _2048_discussrow(copy_row,i)

else:

#找到的磚塊為0,直接pass

pass

#除了這塊磚,沒有其他磚塊了,說明不需要變動,直接返回原磚塊即可

return copy_row

最終,我們只要在實現乙個把所有的數字全部移動到右側的函式即可.

def _2048_rushtowall(row):

ret = [v for v in row if v != 0]

return [0] * (len(row) - len(ret)) + ret

這樣,整合三個函式,我們可以實現乙個把4*4的map往右移動的函式

def _2048_moveright(m):

for i in range(len(m)):

m[i] = _2048_rushtowall(_2048_discussrow(m[i]))

return m

那麼四個方向的怎麼實現呢?其實也很簡單,我們只要通過列轉行,以及反序兩個操作,把它們轉成可以向右移動實現的,最後再轉回去即可.

def _2048_roltorow(m,size=4):

ret = _2048_makeemptymap(size)

for i in range(size):

for j in range(size):

ret[j][size-i-1] = m[i][j]

return ret

def _2048_rowtorol(m,size=4):

ret = _2048_makeemptymap(size)

for i in range(size):

for j in range(size):

ret[i][j] = m[j][size-i-1]

return ret

def _2048_reversed(m,size=4):

ret =

for row in m:

return ret

最後,整合以上所有的函式,形成乙個可以

def _2048_move(rotation:rotation,m):

if rotation == rotation.left:

return _2048_reversed(_2048_moveright(_2048_reversed(m)))

elif rotation == rotation.right:

return _2048_moveright(m)

elif rotation == rotation.up:

return _2048_rowtorol(_2048_moveright(_2048_roltorow(m)))

elif rotation == rotation.down:

return _2048_rowtorol(_2048_reversed(_2048_moveright(_2048_reversed(_2048_roltorow(m)))))

else:

return m

python實現2048遊戲開發筆記

一 遊戲描述 這裡省略了 估計來看的人都玩過2048遊戲 二 遊戲設計 首先將遊戲分解成若干個區域性一一實現 1 輸入規則 asdw分別代表左下由上,r為reset,q為退出,其他不執行。2 輸出介面 def display for i in range 4 print for j in range...

2048遊戲開發(一)

2017 7 24 2048遊戲開發 一 完成複習時間 2017 7 25 0點 學習的知識 1 陣列 有序 資料相同的資料資料集合。儲存型別 auto,static 靜態儲存 陣列長度只能是常量!2 p 用來列印位址 3 sizeof arry sizeof arry 0 總長度 單個元素長度 陣...

Andorid遊戲2048開發(一)

最近有一款android平台下的遊戲很是火爆 2048。下面記錄一下開發過程。由於筆者是android開發的初學者,所以希望藉以此文熟悉整個android開發的流程。首先建立game2048的遊戲專案。我們選擇最低平台為android4.0 api 14 最高支援平台android4.4 api 1...