俄羅斯方塊轉彎演算法實現

2021-08-21 20:55:12 字數 1747 閱讀 7578

關於俄羅斯方塊程式對戰程式中實現方塊轉彎的演算法描述。

為了方便描述演算法的原理,以方塊的左上角為基準,簡化問題為乙個1*1的小方塊,在row*col的矩陣中可以最終移動到哪個位置。

現在來看看位置(x y)是否可以移動到(即使是臨時的)。

如果它可以被移動到,那麼它從哪個位置移動過來。也很簡單。

首先,如果上面位置(x-1 y)可以被移動到,那麼(x y)也是可以的。

其次,如果左邊(x y-1)或右邊(x y+1)的位置可以被移動到,那麼(x y)也是可以的。

那麼評估位置是否可以移動到(即使是臨時的)的演算法,就可以這麼描述:

1.定義乙個二維陣列,表示某個格是否移動到(即使是臨時的),預設為false不可以。

2.初始化第一行的狀態,如果方塊在(0 i)可放置(和當前矩陣沒衝突)則設定state[0][i]為true。

3.從第二行開始遍歷,針對每一行i進行以下處理

3.1.對當前行的列j進行遍歷,如果當前位置可放置,且同一列上一行的位置可移動到,則state[i][j]為true

3.2.對當前行的列j進行遍歷,如果當前位置state[i][j]為true,則往左邊(右邊)一直檢查

3.3.如果左邊位置k可放置,則state[i][k]為true,直到k不可放置或k位置已經為true

最後,通過檢查state就可以直到哪個位置可以被移動到。判斷這個位置是否是最終移動的位置,則可以判斷該位置是否最後一行,或同一列的下乙個位置是否可以放置。

不過這裡還有個問題,就是即使知道某個位置是可以被移動到的,但怎麼還原出下落的路線呢?

其實,我們可以記住拐點,就可以知道路線了。

現在我們在(4,3)位置記錄上乙個拐點(3,3),然後在(3,3)記錄再上乙個拐點(3,2),以此類推就可以得到下落路線(反向的)。

我們想要的結果是

(0,0)

(+,+)

(+,+)

(+,+)

(+,+)

(0,0)

(1,0)

(1,0)

(+,+)

(+,+)

(+,+)

(+,+)

(1,2)

(+,+)

(+,+)

(+,+)

(+,+)

(1,2)

(3,2)

(+,+)

(+,+)

(+,+)

(+,+)

(3,3)

(+,+)

具體怎麼記錄這個拐點呢?可以在上面的演算法基礎上修改一下即可。

首先,考慮把(x,y)這個拐點值記錄為x*row+y,這樣修改state為整形二維陣列。

1.定義乙個二維陣列,表示某個格是否移動到(即使是臨時的),預設為max(row*col,乙個不可能的拐點),表示不可以。

2.初始化第一行的狀態,如果方塊在(0 i)可放置(和當前矩陣沒衝突)則設定state[0][i]為拐點(0,i),即j。

3.從第二行開始遍歷,針對每一行i進行以下處理

3.1.對當前行的列j進行遍歷,如果當前位置可放置,且同一列上一行的位置不為max,則state[i][j]為state[i-1][j]

3.2.對當前行的列j進行遍歷,如果當前位置state[i][j]不為max,則往左邊(右邊)一直檢查

3.3.如果左邊位置k可放置,則state[i][k]為拐點(i,j),即i*col+j,直到k不可放置或k位置不為max

俄羅斯方塊高階 AI俄羅斯方塊

前文回顧 致青春 python實現俄羅斯方塊 人工智慧大火的今天,如果還是自己玩俄羅斯方塊未免顯得太low,為什麼不對遊戲公升級,讓機器自己去玩俄羅斯方塊呢?有了這個想法之後利用週六週日兩天的時間去蒐集了大量的資料,在電腦宕機好多次之後終於將ai俄羅斯方塊實現了。所謂讓機器自己去玩俄羅斯方塊,就是讓...

俄羅斯方塊

俄羅斯方塊 tetris,俄文 是一款風靡全球的電視遊戲機 和掌上遊戲機遊戲,它由俄羅斯人阿列克謝 帕基特諾夫 發明,故得此名。俄羅斯方塊的基本規則是移動 旋轉和擺放遊戲自動輸出的各種方塊,使之排列成完整的一行或多行並且消除得分。由於上手簡單 老少皆宜,從而家喻戶曉,風靡世界。俄羅斯方塊的開發者是阿...

俄羅斯方塊

include include include include includeusing namespace std include include define mem a,b memset a,b,sizeof a const int sudu 40 const int dir 4 2 cons...