亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

2048 游戲的正確瓷磚移動

2048 游戲的正確瓷磚移動

Go
皈依舞 2021-07-29 18:23:18
我決定制作一個 2048 命令行版,但我無法獲得正確的瓷磚移動...我目前的結構是該板是一個二維數組(4x4)的整數。當接收到輸入時,它會嘗試在那個方向推動每個瓦片(忽略值為 0 的瓦片),如果它注意到變化,它將重新開始(因為底行的瓦片必須一直向上,不止一步)。然而,這樣做的副作用是以下問題:[2][2][4] 與命令 -> 應該給出 [0][4][4] 但由于它重新開始,程序將能夠合并4 和 4 并得到 [0][0][8] ……另一個難題是 [4][4][8][8] 應該給出 [0][0][8][16] ] 所以我不能在合并后停下來。下面的代碼是我的 processCommand 函數。它需要一個棋盤和一個輸入(即“d”、“u”、“l”或“r”。如果游戲注意到gameover,它會將“gameover”作為輸入)。它不是很漂亮,我試圖為移動瓷磚制作一個 for 循環(就像如果你寫“l”一個值水平將是 -1,如果你寫“r”它將是 1 然后我移動瓷磚horiz 點是水平的,但我做不到)。任何關于如何做到這一點的想法(以及對我的編程的批評)將不勝感激!func processCommand(board [][]int, input string) {board_new := boardswitch input {    case "d":        for i := 0; i < height - 1; i++ {            for j := 0; j < width; j++ {                if board[i][j] == 0 {                    continue                }                if board[i + 1][j] == 0 || board[i + 1][j] == board[i][j] {                    board_new[i + 1][j] = board[i + 1][j] + board[i][j]                    board_new[i][j] = 0                    i = 0                    j = 0                    change = true                }            }        }    case "u":        for i := 1; i < height; i++ {            for j := 0; j < width; j++ {                if board[i][j] == 0 {                    continue                }                if board[i - 1][j] == 0 || board[i - 1][j] == board[i][j] {                    board_new[i - 1][j] = board[i - 1][j] + board[i][j]                    board_new[i][j] = 0                    i = 1                    j = 0                    change = true                }            }        } 
查看完整描述

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)


            [...]

        }

    }

}


查看完整回答
反對 回復 2021-08-02
  • 1 回答
  • 0 關注
  • 264 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號