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
}