2013-03-25 13 views
5

Jestem ciekawy, jak utworzyć wycinek kolumny z tablicy 2d?Czy chcesz przejść do kolumn segmentu z tablicy 2d?

Mam tablicę na planszę do gry Tic-Tac-Toe i próbuję utworzyć wycinek kolumny, ale moje plasterki są identyczne.

/* 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 "-" 
} 

daję mu następujące dane wejściowe:

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

i uzyskać zwrot

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

Ale chcę zwrot

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

Jak to zrobić zrobić ten kawałek?

Odpowiedz

5

To, co chcesz zrobić, nie jest możliwe przy użyciu składni plasterka. Myślisz, że x[i][0:n] dostaniesz wszystkie kolumny rzędu i. To, co faktycznie robi, to zwrócenie kolumn 0 do n z wiersza i.

Musisz użyć pętli, aby uzyskać kolumnę:

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

Kod oznaczyć z „Rz” jest faktycznie kod Liczyłam dostarczyć kolumny:

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

Semantycznie wskaźniki segmentu mówią: weź element od wszystkich elementów od zera do SIZE. Ale, jak już wspomniano, plasterki Go działają inaczej. 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] 

Jak widać w drugiej linii z powyższym przykładzie x[0:2] zwraca pełną 2d kawałek. W rezultacie zrobienie pierwszego elementu powoduje zwrócenie pierwszego wiersza tego plastra 2d.

+0

Dziękuję bardzo. To pomaga. Edytowałem swój kod, ponieważ pomieszałem "wiersze" i "kolumny". –