为了账号安全,请及时绑定邮箱和手机立即绑定

Go-lang 石头剪刀布游戏

Go-lang 石头剪刀布游戏

Go
Qyouu 2023-07-31 15:00:07
我们的项目是使用 Go 制作一款实用的剪刀石头布游戏。我认为这是一个很好的地方,可以就我可能犯的一些明显错误寻求一些指导。我有几个问题。无论用户输入什么,程序都会说我总是输入“rock”。无论我输入什么,程序总是告诉我这是一个“平局”所以对我来说很明显我的 if/else 语句有问题,但我不确定它在哪里以及到底是什么。我也知道我的PlayerPlay功能很丑陋,但由于某种原因,当我最初在那里显示我的显示菜单时,它会继续循环回到我的菜单,而不继续执行程序的其余部分。package mainimport (        "fmt"        "math/rand"        "time")func ComputerPlay() int {    return rand.Intn(2) + 1}func PlayerPlay(play int) int {    fmt.Scanln(&play)    return play}func PrintPlay(playerName string, play int) {    fmt.Printf("%s picked ", playerName)    if play == 0 {        fmt.Printf("rock\n")    } else if play == 1 {        fmt.Printf("paper\n")    } else if play == 2 {        fmt.Printf("scissors\n")    }    fmt.Printf("Computer has chose ")            switch ComputerPlay() {            case 0:                    fmt.Println("rock\n")            case 1:                    fmt.Println("paper\n")            case 2:                    fmt.Println("scissors\n")}}func ShowResult(computerPlay int, humanPlay int){    var play int    computerPlay = ComputerPlay()    humanPlay = PlayerPlay(play)        if humanPlay == 0 && humanPlay == 0 {        fmt.Printf("It's a tie\n")    } else if humanPlay == 0 && computerPlay == 1 {        fmt.Printf(" Rock loses to paper\n")    }   else if humanPlay == 0 && computerPlay == 2 {        fmt.Printf("Rock beats scissors\n")    }   else if humanPlay == 1 && computerPlay == 0 {        fmt.Printf(" Paper beats rock\n")    }   else if humanPlay == 1 && computerPlay == 1 {        fmt.Printf("It's a tie!\n")    }   else if humanPlay == 1 && computerPlay == 2 {        fmt.Printf("Paper loses to scissors\n")    } else if humanPlay == 2 && computerPlay == 0 {        fmt.Printf("Scissors loses to rock\n")    } else if humanPlay == 2 && computerPlay == 1 {        fmt.Printf(" Scissors beats paper\n")    } else if humanPlay == 2 && computerPlay == 2 {        fmt.Printf(" It's a tie!\n")    }}
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

问题是您在 PlayerPlay 函数中使用按值参数传递而不是按引用参数传递。

  • golang 中的函数始终按值传递(“原始”或指针)。按值传递的参数是不可变的。它将在内存中分配新的空间,与var play.

  • 在您的PlayerPlay()函数中,fmt.Scanln(&play)尝试读取和复制新分配的空间的值并成功完成,但引用错误(不在您的var play)。

  • 因此,该var play变量将保持默认值不变(对于 int 为 0)。而你最终总是会做出选择。

您需要做的是将PlayerPlay()函数更改为接受引用类型,并用 的引用填充它,var play以便fmt.Scanln()可以改变var play.

例如。

func PlayerPlay(play *int) {
    fmt.Scanln(play)
}

像这样使用它们,

  var play int
  PlayerPlay(&play)

请注意,该&符号用于获取值的引用(指针)。


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信