4

2048 Command Line Edition を作成することにしましたが、適切なタイルの移動に問題があります...

私の現在の構造は、ボードが int の 2D 配列 (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" を入力として配置します) を取ります。あまりきれいではないので、タイルを移動するための単一のforループを作成しようとしました(たとえば、「l」と書くと水平の値は-1になり、「r」と書くと1になり、タイルを移動しますhoriz スポットは水平ですが、私はそれを機能させることができませんでした)。

これを行う方法に関するアイデア (および私のプログラミングに対する批評) は大歓迎です!

func processCommand(board [][]int, input string) {

board_new := board

switch 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
                }
            }
        } 

    case "l":
        for i := 0; i < height; i++ {
            for j := 1; j < width; j++ {

                if board[i][j] == 0 {
                    continue
                }

                if board[i][j - 1] == 0 || board[i][j - 1] == board[i][j] {
                    board_new[i][j - 1] = board[i][j - 1] + board[i][j]
                    board_new[i][j] = 0
                    i = 0
                    j = 1
                    change = true
                }
            }
        }

    case "r":
        for i := 0; i < height; i++ {
            for j := 0; j < width - 1; j++ {

                if board[i][j] == 0 {
                    continue
                }

                if board[i][j + 1] == 0 || board[i][j + 1] == board[i][j] {
                    board_new[i][j + 1] = board[i][j + 1] + board[i][j]
                    board_new[i][j] = 0
                    i = 0
                    j = 0
                    change = true
                }
            }
        }

    case "gameover":
        gameOver = true

    default:
        processCommand(board, input)
}

board = board_new

}

4

1 に答える 1