2013-03-25 20 views
5

Sono curioso, come si crea una sezione colonna da una matrice 2d?Go lang slice columns from 2d array?

Ho una matrice per una scheda di gioco per Tic-Tac-Toe, e sto cercando di creare una sezione colonna, ma le mie fette stanno uscendo identiche.

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

dò il seguente testo:

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

e ottenere un ritorno di

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

Ma io voglio un ritorno di

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

Come faccio fare questa fetta?

risposta

5

Ciò che si desidera fare non è possibile con la sintassi della sezione. Pensi che x[i][0:n] ti otterrà tutte le colonne della riga i. In realtà, restituisce le colonne da 0 a n dalla riga i.

Devi usare un ciclo per ottenere una colonna:

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

Il codice di etichettare con 'Row' è in realtà il codice mi sarei aspettato di consegnare le colonne:

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

Semanticamente gli indici delle sezioni dicono: prendi l'elemento i ° di tutti gli elementi da zero a SIZE. Ma, come già detto, le slice di Go funzionano in modo diverso. 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] 

Come si può vedere, in linea due di cui sopra, x[0:2] restituisce la fetta 2d pieno. Di conseguenza prendendo il primo elemento restituisce la prima riga di quella sezione 2d.

+0

Grazie mille. Questo aiuta. Ho modificato il mio codice perché ho mescolato "righe" e "colonne". –