2013-03-25 3 views
5

Мне любопытно, как вы создаете срез столбца из массива 2d?Перейти lang slice столбцы из массива 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] 

Как я сделать этот кусочек?

ответ

5

То, что вы хотите сделать, невозможно с синтаксисом среза. Вы думаете, что x[i][0:n] доставит вам все столбцы строки i. Фактически это возвращает столбцы 0 в n из строки i.

Вы должны использовать цикл, чтобы получить столбец:

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. Но, как уже упоминалось, Go ломтики работают по-разному. Try for yourself:

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] 

Как вы можете видеть в строке два примера выше, x[0:2] возвращает полный 2d срез. Следовательно, , берущий первый элемент, возвращает первую строку этого 2d-фрагмента.

+0

спасибо. Это помогает. Я отредактировал мой код, потому что я перепутал «строки» и «столбцы». –

Смежные вопросы