亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號