關於俄羅斯方塊程式對戰程式中實現方塊轉彎的演算法描述。
為了方便描述演算法的原理,以方塊的左上角為基準,簡化問題為乙個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...