第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

2048 游戲的正確瓷磚移動(dòng)

2048 游戲的正確瓷磚移動(dòng)

Go
皈依舞 2021-07-29 18:23:18
我決定制作一個(gè) 2048 命令行版,但我無法獲得正確的瓷磚移動(dòng)...我目前的結(jié)構(gòu)是該板是一個(gè)二維數(shù)組(4x4)的整數(shù)。當(dāng)接收到輸入時(shí),它會嘗試在那個(gè)方向推動(dòng)每個(gè)瓦片(忽略值為 0 的瓦片),如果它注意到變化,它將重新開始(因?yàn)榈仔械耐咂仨氁恢毕蛏希恢挂徊剑?。然而,這樣做的副作用是以下問題:[2][2][4] 與命令 -> 應(yīng)該給出 [0][4][4] 但由于它重新開始,程序?qū)⒛軌蚝喜? 和 4 并得到 [0][0][8] ……另一個(gè)難題是 [4][4][8][8] 應(yīng)該給出 [0][0][8][16] ] 所以我不能在合并后停下來。下面的代碼是我的 processCommand 函數(shù)。它需要一個(gè)棋盤和一個(gè)輸入(即“d”、“u”、“l(fā)”或“r”。如果游戲注意到gameover,它會將“gameover”作為輸入)。它不是很漂亮,我試圖為移動(dòng)瓷磚制作一個(gè) for 循環(huán)(就像如果你寫“l(fā)”一個(gè)值水平將是 -1,如果你寫“r”它將是 1 然后我移動(dòng)瓷磚horiz 點(diǎn)是水平的,但我做不到)。任何關(guān)于如何做到這一點(diǎn)的想法(以及對我的編程的批評)將不勝感激!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 回答

?
揚(yáng)帆大魚

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊

首先你的合并問題

目前你總是從上到下和從左到右掃描你的瓷磚,與玩家的移動(dòng)無關(guān)。然而,對于 2048,最好在玩家移動(dòng)的相反方向上掃描,因?yàn)榇纱u只會在那個(gè)方向合并。例如,讓我們考慮以下場景:


0   0   2   0   |

0   0   2   2   | Player move

0   2   4   8   v

2   32  4   2

讓我們假設(shè)玩家的移動(dòng)方向是朝向底部,所以我們開始從底部向上掃描。在第三列中,我們需要先合并 4+4,然后再合并 2+2,即自下而上。朝那個(gè)方向前進(jìn),您可以合并 4+4,然后將列的最底部字段標(biāo)記為已合并,從而不允許進(jìn)一步合并(由數(shù)字周圍的括號表示):


0   0   0   0   |

0   0   2   2   | Player move

0   2   2   8   v

2   32  (8) 2

合并最底部的單元格(如果可能)后,我們繼續(xù)處理上面的單元格,依此類推……


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

當(dāng)不再有可能合并時(shí),移動(dòng)結(jié)束,所有“合并”標(biāo)記都被刪除,我們等待下一輪。這種方法解決了您的多重合并問題。


掃描方向的另一個(gè)示例(數(shù)字現(xiàn)在表示循環(huán)將如何通過字段):


Player move

    ---->

4   3   2   1

8   7   6   5

12  11  10  9

16  15  14  13

關(guān)于你的代碼

查看代碼,您會注意到關(guān)于您的循環(huán)有很多代碼重復(fù)。對于每個(gè)case你做一個(gè)單獨(dú)的嵌套for循環(huán),這不是真正的最佳。相反,您可以執(zhí)行以下操作:


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)


            [...]

        }

    }

}


查看完整回答
反對 回復(fù) 2021-08-02
  • 1 回答
  • 0 關(guān)注
  • 265 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號