1 回答

TA貢獻1799條經驗 獲得超9個贊
首先你的合并問題
目前你總是從上到下和從左到右掃描你的瓷磚,與玩家的移動無關。然而,對于 2048,最好在玩家移動的相反方向上掃描,因為瓷磚只會在那個方向合并。例如,讓我們考慮以下場景:
0 0 2 0 |
0 0 2 2 | Player move
0 2 4 8 v
2 32 4 2
讓我們假設玩家的移動方向是朝向底部,所以我們開始從底部向上掃描。在第三列中,我們需要先合并 4+4,然后再合并 2+2,即自下而上。朝那個方向前進,您可以合并 4+4,然后將列的最底部字段標記為已合并,從而不允許進一步合并(由數字周圍的括號表示):
0 0 0 0 |
0 0 2 2 | Player move
0 2 2 8 v
2 32 (8) 2
合并最底部的單元格(如果可能)后,我們繼續處理上面的單元格,依此類推……
0 0 0 0 |
0 0 0 2 | Player move
0 2 (4) 8 v
2 32 (8) 2
[...]
0 0 (0) 0 |
0 0 (0) 2 | Player move
0 2 (4) 8 v
2 32 (8) 2
當不再有可能合并時,移動結束,所有“合并”標記都被刪除,我們等待下一輪。這種方法解決了您的多重合并問題。
掃描方向的另一個示例(數字現在表示循環將如何通過字段):
Player move
---->
4 3 2 1
8 7 6 5
12 11 10 9
16 15 14 13
關于你的代碼
查看代碼,您會注意到關于您的循環有很多代碼重復。對于每個case你做一個單獨的嵌套for循環,這不是真正的最佳。相反,您可以執行以下操作:
for i := 1; i < height; i++ {
for j := 0; j < width; j++ {
if board[i][j] == 0 {
continue
}
switch input {
case "d":
updateBoardDown(board, i, j)
case "u":
updateBoardUp(board, i, j)
[...]
}
}
}
- 1 回答
- 0 關注
- 264 瀏覽
添加回答
舉報