gpt4 book ai didi

Go-lang 石头剪刀布游戏

转载 作者:行者123 更新时间:2023-12-03 03:14:27 25 4
gpt4 key购买 nike

我们的项目是使用 Go 制作一款实用的剪刀石头布游戏。我认为这是一个很好的地方,可以就我可能犯的一些明显错误寻求一些指导。

我遇到了几个问题。

  1. 无论用户输入什么,程序都会说我总是输入“rock”。
  2. 无论我输入什么,程序总是告诉我这是一个“平局”

所以对我来说很明显我的 if/else 语句有问题,但我不确定它在哪里以及到底是什么。我也知道我的 PlayerPlay 函数很丑陋,但由于某种原因,当我最初在那里放置显示菜单时,它会继续循环回到我的菜单,而不继续执行程序的其余部分。

package main

import (
"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")
}


}

func main() {
rand.Seed(time.Now().UnixNano())

fmt.Printf("Welcome to Rock, Paper, Scissors\n\n")
fmt.Printf("What is your name?\n")
var playerName string
fmt.Scanln(&playerName)

fmt.Printf("Choose\n")
fmt.Printf("0. Rock\n")
fmt.Printf("1. paper\n")
fmt.Printf("2. scissors\n")
fmt.Printf("Your choice -> ")
var play int
PlayerPlay(play)
PrintPlay(playerName, play)

var computerPlay int
ComputerPlay()
ShowResult(computerPlay, play)

}

最佳答案

问题在于您在 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)

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

关于Go-lang 石头剪刀布游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58405662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com