9

興味があります。2D配列から列スライスをどのように作成しますか?

Tic-Tac-Toe用のゲームボード用の配列があり、列スライスを作成しようとしていますが、スライスは同じように出力されます。

/* Just trying to get rows and columns working first */

func() isWin() bool {
  win := make([]char, SIZE*2)
  for i:= range BOARD {
    fmt.Println("Row")
    win[i] = check(BOARD[i][0:SIZE])
    fmt.Println("Column")
    win[i+SIZE] = check(BOARD[0:SIZE][i])
  }
return false
}

func() check(slice []char) (char) {
  fmt.Println(slice)
  return "-"
}

私はそれに次の入力を与えます:

[E E E E]
[E E E E]
[X O E E]
[X O E E]

そして、私は

Row
[X O E E]
Column
[X O E E]

しかし、私はのリターンが欲しい

Row
[X O E E]
Column
[E E X X]

このスライスを作成するにはどうすればよいですか?

4

1 に答える 1

7

スライス構文では、やりたいことはできません。x[i][0:n]これで、行のすべての列が取得されると思いますi。実際に行うことは、行から列0を返すことです。ni

列を取得するには、ループを使用する必要があります。

func boardColumn(board [][]char, columnIndex int) (column []char) {
    column = make([]char, 0)
    for _, row := range board {
        column = append(column, row[columnIndex])
    }
    return
}

'Row'でラベル付けするコードは、実際には、列を配信することを期待していたコードです。

win[i] = check(BOARD[0:SIZE][i])

意味的には、スライスインデックスは次のように述べていますi。ゼロからSIZEまでのすべての要素のth要素を取ります。ただし、すでに述べたように、Goスライスの動作は異なります。自分で試してみてください

x := [][]int{{1,2,3},{4,5,6}}
fmt.Println(x[0:2]) // [[1,2,3],[4,5,6]]
fmt.Println(x[0:2][0]) // [1,2,3]

上記の例の2行目でわかるようにx[0:2]、完全な2Dスライスを返します。したがって、最初の要素を取得すると、その2dスライスの最初の行が返されます。

于 2013-03-25T15:33:31.080 に答える