In Go, how do stay in a for loop, but print a different output if user guesses too high or too low

huangapple go评论109阅读模式
英文:

In Go, how do stay in a for loop, but print a different output if user guesses too high or too low

问题

我正在尝试在GO中开发一个猜数字游戏,给用户三次机会来猜测正确的随机数。

它似乎大部分都工作正常,我使用for循环来计算剩余的生命次数。如果我猜对了数字,它会打印我想要的结果:

"你猜对了!"

但问题是,例如,随机数是5。如果我猜4,它会打印

"太低了"

这是正确的,但是在第二次尝试中,如果我猜6,它仍然会说

"太低了"

或者,如果随机数是5,在第一次尝试中我猜6,它会打印

"太高了"

如果我在第二次尝试中猜4,它仍然会说

"太高了"

我觉得我在某个地方陷入了for循环,但我不知道如何在不重置尝试次数的情况下退出它。

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "time"
  6. )
  7. func main() {
  8. secret := getRandomNumber()
  9. fmt.Println(secret)
  10. fmt.Println("猜数字")
  11. _guess := guessRandomNumber()
  12. for i := 3; i > 0; i-- {
  13. if _guess < secret {
  14. fmt.Println("太低了")
  15. fmt.Println("你还有", i, "次猜测机会。")
  16. } else if _guess < secret {
  17. fmt.Println("太低了")
  18. fmt.Println("你还有", i, "次猜测机会。")
  19. guessRandomNumber()
  20. } else if _guess > secret {
  21. fmt.Println("太高了")
  22. fmt.Println("你还有", i, "次猜测机会。")
  23. guessRandomNumber()
  24. }
  25. if _guess == secret {
  26. fmt.Println("你猜对了!")
  27. i = 0
  28. } else if _guess < secret {
  29. fmt.Println("太低了")
  30. fmt.Println("你还有", i, "次猜测机会。")
  31. guessRandomNumber()
  32. } else if _guess > secret {
  33. fmt.Println("太高了")
  34. fmt.Println("你还有", i, "次猜测机会。")
  35. guessRandomNumber()
  36. }
  37. }
  38. }
  39. func getRandomNumber() int {
  40. rand.Seed(time.Now().UnixNano())
  41. return rand.Int() % 11
  42. }
  43. func guessRandomNumber() int {
  44. var guess int
  45. //fmt.Println("再次猜测:")
  46. fmt.Scanf("%d", &guess)
  47. return guess
  48. }

任何帮助将不胜感激。到目前为止,我真的很喜欢GO

英文:

I'm trying to develop a guessing game in GO that gives the user three attempts to guess the random number correctly.

It mostly seems to work, I'm using a for loop to count the amount of lives left. If I guess the number correctly, it prints what I want:

> "You guessed it!"

But the issue is, say for example, the random number is 5. If I guessed 4, it would print

> "Too low"

which is correct, but in the second attempt if I was to guess 6, it would still say

> "Too low"

Alternatively, if the random number was 5, and on the first attempt I guessed 6, it would print

> "Too high"

If I was to guess 4 on the second attempt, it would still say

> "Too high"

I think I'm getting caught in the for loop somewhere, but I don't know how to exit it without resetting the attempts count back to 3.

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;math/rand&quot;
  5. &quot;time&quot;
  6. )
  7. func main() {
  8. secret := getRandomNumber()
  9. fmt.Println(secret)
  10. fmt.Println(&quot;Guess the number&quot;)
  11. _guess := guessRandomNumber()
  12. for i := 3; i &gt; 0; i-- {
  13. if _guess &lt; secret {
  14. fmt.Println(&quot;Too low&quot;)
  15. fmt.Println(&quot;You have&quot;, i, &quot;guesses left.&quot;)
  16. } else if _guess &lt; secret {
  17. fmt.Println(&quot;Too low&quot;)
  18. fmt.Println(&quot;You have&quot;, i, &quot;guesses left.&quot;)
  19. guessRandomNumber()
  20. } else if _guess &gt; secret {
  21. fmt.Println(&quot;Too high&quot;)
  22. fmt.Println(&quot;You have&quot;, i, &quot;guesses left.&quot;)
  23. guessRandomNumber()
  24. }
  25. if _guess == secret {
  26. fmt.Println(&quot;You guessed it!&quot;)
  27. i = 0
  28. } else if _guess &lt; secret {
  29. fmt.Println(&quot;Too low&quot;)
  30. fmt.Println(&quot;You have&quot;, i, &quot;guesses left.&quot;)
  31. guessRandomNumber()
  32. } else if _guess &gt; secret {
  33. fmt.Println(&quot;Too high&quot;)
  34. fmt.Println(&quot;You have&quot;, i, &quot;guesses left.&quot;)
  35. guessRandomNumber()
  36. }
  37. }
  38. }
  39. func getRandomNumber() int {
  40. rand.Seed(time.Now().UnixNano())
  41. return rand.Int() % 11
  42. }
  43. func guessRandomNumber() int {
  44. var guess int
  45. //fmt.Println(&quot;Guess again:&quot;)
  46. fmt.Scanf(&quot;%d&quot;, &amp;guess)
  47. return guess
  48. }

Any help would be greatly appreciated. I'm really liking GO so far.

答案1

得分: 3

你没有将函数guessRandomNumber()的输出赋值给_guess。除此之外,你还使用了多余的if-else语句,这些语句是不必要的。此外,你给用户提供了4次尝试的机会,而不是3次。你可以尝试以下代码:

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "time"
  6. )
  7. func main() {
  8. secret := getRandomNumber()
  9. fmt.Println(secret)
  10. fmt.Println("Guess the number")
  11. var _guess int
  12. for i := 3; i > 0; i-- {
  13. _guess = guessRandomNumber()
  14. if _guess == secret {
  15. fmt.Println("You guessed it!")
  16. break
  17. } else if _guess < secret {
  18. fmt.Println("Too low")
  19. fmt.Println("You have", i-1, "guesses left.")
  20. } else {
  21. fmt.Println("Too high")
  22. fmt.Println("You have", i-1, "guesses left.")
  23. }
  24. if i != 1 {
  25. fmt.Println("Guess Again:")
  26. }
  27. }
  28. }
  29. func getRandomNumber() int {
  30. rand.Seed(time.Now().UnixNano())
  31. return rand.Int() % 11
  32. }
  33. func guessRandomNumber() int {
  34. var guess int
  35. //fmt.Println("Guess Number:")
  36. fmt.Scanf("%d", &guess)
  37. return guess
  38. }

链接:https://onlinegdb.com/aOI-CG4S-

英文:

You're not assigning the output of your function guessRandomNumber() to your _guess. Apart from this also you're using extra if-else, which are not required. Also you're giving 4 attempts to user instead of 3. You can try:

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;math/rand&quot;
  5. &quot;time&quot;
  6. )
  7. func main() {
  8. secret := getRandomNumber()
  9. fmt.Println(secret)
  10. fmt.Println(&quot;Guess the number&quot;)
  11. var _guess int
  12. for i := 3; i &gt; 0; i-- {
  13. _guess = guessRandomNumber()
  14. if _guess == secret {
  15. fmt.Println(&quot;You guessed it!&quot;)
  16. break
  17. } else if _guess &lt; secret {
  18. fmt.Println(&quot;Too low&quot;)
  19. fmt.Println(&quot;You have&quot;, i-1, &quot;guesses left.&quot;)
  20. } else {
  21. fmt.Println(&quot;Too high&quot;)
  22. fmt.Println(&quot;You have&quot;, i-1, &quot;guesses left.&quot;)
  23. }
  24. if i != 1 {
  25. fmt.Println(&quot;Guess Again:&quot;)
  26. }
  27. }
  28. }
  29. func getRandomNumber() int {
  30. rand.Seed(time.Now().UnixNano())
  31. return rand.Int() % 11
  32. }
  33. func guessRandomNumber() int {
  34. var guess int
  35. //fmt.Println(&quot;Guess Number:&quot;)
  36. fmt.Scanf(&quot;%d&quot;, &amp;guess)
  37. return guess
  38. }

https://onlinegdb.com/aOI-CG4S-

答案2

得分: 0

我使用了一个带有switch语句的for循环来解决这个问题。

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "time"
  6. )
  7. func main() {
  8. secret := getRandomNumber()
  9. fmt.Println(secret)
  10. fmt.Println("猜数字")
  11. _guess := guessRandomNumber()
  12. guessCorrect := false
  13. guessCount := 3
  14. for guessCorrect == false && guessCount != 0 {
  15. switch {
  16. case _guess < secret:
  17. fmt.Println("太低了,还有", guessCount, "次猜测机会。")
  18. fmt.Scanf("%d", &_guess)
  19. guessCount--
  20. continue
  21. case _guess > secret:
  22. fmt.Println("太高了,还有", guessCount, "次猜测机会。")
  23. fmt.Scanf("%d", &_guess)
  24. guessCount--
  25. continue
  26. default:
  27. fmt.Println("你猜对了!")
  28. guessCorrect = true
  29. }
  30. }
  31. }
  32. func getRandomNumber() int {
  33. rand.Seed(time.Now().UnixNano())
  34. return rand.Int() % 11
  35. }
  36. func guessRandomNumber() int {
  37. var guess int
  38. fmt.Scanf("%d", &guess)
  39. return guess
  40. }
英文:

I ended up using a for loop with a switch statement to solve the issue.

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;math/rand&quot;
  5. &quot;time&quot;
  6. )
  7. func main() {
  8. secret := getRandomNumber()
  9. fmt.Println(secret)
  10. fmt.Println(&quot;Guess the number&quot;)
  11. _guess := guessRandomNumber()
  12. guessCorrect := false
  13. guessCount := 3
  14. for guessCorrect == false &amp;&amp; guessCount != 0 {
  15. switch {
  16. case _guess &lt; secret:
  17. fmt.Println(&quot;Too low,&quot;, guessCount, &quot;guesses left.&quot;)
  18. fmt.Scanf(&quot;%d&quot;, &amp;_guess)
  19. guessCount--
  20. continue
  21. case _guess &gt; secret:
  22. fmt.Println(&quot;Too high&quot;, guessCount, &quot;guesses left.&quot;)
  23. fmt.Scanf(&quot;%d&quot;, &amp;_guess)
  24. guessCount--
  25. continue
  26. default:
  27. fmt.Println(&quot;You got it!&quot;)
  28. guessCorrect = true
  29. }
  30. }
  31. }
  32. func getRandomNumber() int {
  33. rand.Seed(time.Now().UnixNano())
  34. return rand.Int() % 11
  35. }
  36. func guessRandomNumber() int {
  37. var guess int
  38. fmt.Scanf(&quot;%d&quot;, &amp;guess)
  39. return guess
  40. }

huangapple
  • 本文由 发表于 2022年5月19日 11:51:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/72298414.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定