我开始学习GoLang,遇到了麻烦。当我试图将数组(其大小是在从输出中输入它们后定义的)传递给函数时出现错误,如“抱歉,但您键入 [][]string 与 [][]string 不同”。我尝试了不同的方法,但无法应对。有什么建议么?
有主要功能:
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)
}
}
和离开数组的函数示例:
func printBoard(in [][]string, size int){
for k:=0;k<size+1;k++{
fmt.Printf("%d\t", k)
}
fmt.Println()
for i:=0;i<size;i++{
fmt.Printf("%d ", i+1)
for j:=0;j<size;j++ {
fmt.Printf("\t%s", in[i][j])
}
fmt.Print("\n")
}
fmt.Print("\n")
}
我要实现的输出是针对井字游戏的。例如:-
Enter number of rows: 3 Choose side of fight (X, 0): X
Your side is X 0 1 2 3 1 _ _ _ 2 _ _ _ 3 _ _ _
Your move(a b, "a" is number of row, "b" is number of column: 1 1 0 1 2 3 1 X _ _ 2 _ _ _ 3 _ _ _
Your move(a b, "a" is number of row, "b" is number of column: 2 2 0 1 2 3 1 X _ _ 2 _ X _ 3 _ _ _
Your move(a b, "a" is number of row, "b" is number of column: 3 3 0 1 2 3 1 X _ _ 2 _ X _ 3 _ _ X You're winner!!!
最佳答案
不要使用 Go 数组。数组大小是编译时常量。一个数组,整个数组,通过值作为参数传递给函数参数或接收者。
使用 slice 。声明一个基于 slice 的 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],
)
}
输出:
[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]
引用资料:
关于arrays - 井字棋盘的二维数组或二维 slice ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51100826/
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>