Arrays Tic Tac趾板的2D阵列或2D切片?

Arrays Tic Tac趾板的2D阵列或2D切片?,arrays,go,slice,Arrays,Go,Slice,我开始学咕噜,遇到了麻烦。当我试图将数组(其大小是在从输出中输入数组后定义的)传递给函数时,会出现一个get错误,如“对不起,您键入的[][]字符串与[][]字符串不同”。我尝试了不同的方法,但无法应付。有什么建议吗 主要功能有: func main(){ fmt.Println("Enter number of rows: ") fmt.Scanf("%d", &size) var board [size][size]string for i:=0;i<size;i++{

我开始学咕噜,遇到了麻烦。当我试图将数组(其大小是在从输出中输入数组后定义的)传递给函数时,会出现一个get错误,如“对不起,您键入的[][]字符串与[][]字符串不同”。我尝试了不同的方法,但无法应付。有什么建议吗

主要功能有:

func main(){
fmt.Println("Enter number of rows: ")
fmt.Scanf("%d", &size)
var board [size][size]string
for i:=0;i<size;i++{
    for j:=0;j<size;j++{
        board[i][j] = "_"
    }
}
fmt.Println("Choose side of fight (X, 0): ")
fmt.Scanf("%s", &opt)
fmt.Printf("Your side is %s\n", opt)
for !win{
    printBoard(board, size)
    fmt.Println("Your move(a b, \"a\" is number of row, \"b\" is number of column: ")
    fmt.Scanf("%d %d", &move[0], &move[1])
    if move[0]>=1 && move[1]>=1 && move[0]<=3 && move[1]<=3{
        board[move[0]-1][move[1]-1] = opt
    }
    bot(&board, size)
    win, winner = checkWin(board, opt, size)
}
}

在Go中,
[]字符串
是一个切片,
[42]字符串
是一个数组。这些类型非常不同

在这种情况下,您应该使用切片,因为电路板的大小是可变的

board := make([][]string, size)
for i:=0;i<size;i++{
    board[i] = make([]string, size)
    for j:=0;j<size;j++{
        board[i][j] = "_"
    }
}
board:=make([]字符串,大小)

对于i:=0;i由于在调用
printBoard
函数时传递数组,但在函数定义中,您传递了
Slice
作为参数,这就是
类型不匹配的错误的原因。因此,我的建议是,您可以将切片传递给
printBoard
函数

func main() {
    fmt.Println("Enter number of rows: ")
    fmt.Scanf("%d", &size)
    var board [][]string
    board = make([][]string, size, (2*size)+1)

    fmt.Println("Choose side of fight (X, 0): ")
    var opt int
    fmt.Scanf("%s", &opt)
    fmt.Printf("Your side is %s\n", opt)
    var win bool
    for !win {
        printBoard(board, size)
        fmt.Println("Your move(a b, \"a\" is number of row, \"b\" is number of column: ")
        fmt.Scanf("%d %d", &move[0], &move[1])
        if move[0] >= 1 && move[1] >= 1 && move[0] <= 3 && move[1] <= 3 {
            board[move[0]-1][move[1]-1] = opt
        }
        bot(&board, size)
        win, winner = checkWin(board, opt, size)
    }
}
func main(){
fmt.Println(“输入行数:”)
格式扫描(“%d”和大小)
var板[][]字符串
板=制造([]字符串,大小,(2*大小)+1)
fmt.Println(“选择战斗方(X,0):”)
变量opt int
格式扫描(“%s”和“opt”)
fmt.Printf(“你方是%s\n”,opt)
瓦尔温布尔
为了!赢{
印刷电路板(电路板,尺寸)
Println(“您的移动(ab,\'a\'是行数,\'b\'是列数:”)
fmt.Scanf(“%d%d”、&move[0]、&move[1])

如果move[0]>=1&&move[1]>=1&&move[0]请不要使用Go数组。数组大小是编译时常量。数组(整个数组)通过值作为参数传递给函数参数或接收器

使用切片。声明一个基于切片的
Board
类型。为该类型提供一组方法;将该类型作为方法接收器传递


比如说,

package main

import "fmt"

type Board [][]string // [rows][cols]

func NewBoard(rows, cols int) Board {
    b := make([][]string, rows)
    for r := range b {
        b[r] = make([]string, cols)
    }
    return Board(b)
}

func (b Board) Rows() int {
    return len(b)
}

func (b Board) Cols() int {
    if len(b) == 0 {
        return 0
    }
    return len(b[0])
}

func (b Board) Print() {
    maxWidth := 0
    for r := range b {
        for c := range b[r] {
            if width := len(b[r][c]); maxWidth < width {
                maxWidth = width
            }
        }
    }
    width := maxWidth + 2
    for r := range b {
        for c := range b[r] {
            fmt.Printf("%-*s", width, b[r][c])
        }
        fmt.Printf("\n")
    }
}

func main() {
    rows, cols := 3, 2 // input from user?
    board := NewBoard(rows, cols)

    for r := range board {
        for c := range board[r] {
            board[r][c] = fmt.Sprintf("[R%d, C%d]", r, c)
        }
    }
    board.Print()

    fmt.Printf("\n%v\n%v %v\n%v\n",
        board,
        board.Rows(), board.Cols(),
        board[1][1],
    )
}

参考资料:


好的,我有但是现在我需要一个数组,其中包含用户在它之前定义的行数和列数begin@daniktl不需要数组,您可以在每次棋手下棋时计算
长度
,或为每个棋手的每一步都附加到切片take@daniktl还有,为什么你需要一个数组。我认为国际象棋有固定的长度。如果你需要的话玩家采取的移动创建一个单独的具有行和列值的切片Chess是的,但Tic tac toe不是。基本版本创建为3x3。但现在我想使其变为变量(3x3、4x4、5x5等等)。请编辑您的问题并添加此注释,这将帮助用户了解您试图实现的目标。好的,我现在知道了,但是在这种状态下我应该怎么做。当我需要数组但我不知道它的大小时,是否比用户输入它之前更大?
func main() {
    fmt.Println("Enter number of rows: ")
    fmt.Scanf("%d", &size)
    var board [][]string
    board = make([][]string, size, (2*size)+1)

    fmt.Println("Choose side of fight (X, 0): ")
    var opt int
    fmt.Scanf("%s", &opt)
    fmt.Printf("Your side is %s\n", opt)
    var win bool
    for !win {
        printBoard(board, size)
        fmt.Println("Your move(a b, \"a\" is number of row, \"b\" is number of column: ")
        fmt.Scanf("%d %d", &move[0], &move[1])
        if move[0] >= 1 && move[1] >= 1 && move[0] <= 3 && move[1] <= 3 {
            board[move[0]-1][move[1]-1] = opt
        }
        bot(&board, size)
        win, winner = checkWin(board, opt, size)
    }
}
package main

import "fmt"

type Board [][]string // [rows][cols]

func NewBoard(rows, cols int) Board {
    b := make([][]string, rows)
    for r := range b {
        b[r] = make([]string, cols)
    }
    return Board(b)
}

func (b Board) Rows() int {
    return len(b)
}

func (b Board) Cols() int {
    if len(b) == 0 {
        return 0
    }
    return len(b[0])
}

func (b Board) Print() {
    maxWidth := 0
    for r := range b {
        for c := range b[r] {
            if width := len(b[r][c]); maxWidth < width {
                maxWidth = width
            }
        }
    }
    width := maxWidth + 2
    for r := range b {
        for c := range b[r] {
            fmt.Printf("%-*s", width, b[r][c])
        }
        fmt.Printf("\n")
    }
}

func main() {
    rows, cols := 3, 2 // input from user?
    board := NewBoard(rows, cols)

    for r := range board {
        for c := range board[r] {
            board[r][c] = fmt.Sprintf("[R%d, C%d]", r, c)
        }
    }
    board.Print()

    fmt.Printf("\n%v\n%v %v\n%v\n",
        board,
        board.Rows(), board.Cols(),
        board[1][1],
    )
}
[R0, C0]  [R0, C1]  
[R1, C0]  [R1, C1]  
[R2, C0]  [R2, C1]  

[[[R0, C0] [R0, C1]] [[R1, C0] [R1, C1]] [[R2, C0] [R2, C1]]]
3 2
[R1, C1]