Go 猜谜游戏 | 青训营笔记

74 阅读2分钟
这是我参与「第五届青训营 」笔记创作活动的第3天

生成随机数

在学习 Go 语言基础语法后,让我们来完成一个简单的小游戏

rand.Intn() 函数返回 0-N 之间的随机数。这里,N 是函数 rand.Intn() 中指定的数字

package main

import (
   "fmt"
   "math/rand"
)

func main() {
   maxNum := 100
   secretNumber := rand.Intn(maxNum)
   fmt.Println("The secret number is ", secretNumber)
}

但上述代码每次都会生成相同的随机数,因为 rand.Intn() 函数的种子值一直不变

rand.Seed() 函数用于设置种子值以生成随机数。如果种子值相同,则 rand.Intn() 函数将生成相同系列的随机数。如果我们改变种子值,那么它将生成不同系列的随机数。

因此,我们可以使用 time.Now() 作为种子值,操作如下:

package main

import (
   "fmt"
   "math/rand"
   "time"
)

func main() {
   maxNum := 100
   rand.Seed(time.Now().UnixNano())
   secretNumber := rand.Intn(maxNum)
   fmt.Println("The secret number is ", secretNumber)
}

读取输入

可直接使用 fmt.Scanln() 函数,Scanln() 遇到换行符或 EOF 的时候终止读取,所以在输入的时候只要按下回车键就会结束读取

当然也有其他的输入读取方法,读者可以自行实现一个带错误处理的读取功能

  • Scanln、Sscanln、Fscanln在遇到换行符的时候停止

  • Scan、Sscan、Fscan将换行符当作空格处理

  • Scanf、Sscanf、Fscanf根据给定的format格式读取,就像Printf一样

package main

import (
   "fmt"
   "math/rand"
   "time"
)

func main() {
   maxNum := 100
   rand.Seed(time.Now().UnixNano())
   secretNumber := rand.Intn(maxNum)
   fmt.Println("The secret number is ", secretNumber)

   fmt.Println("Please input your guess")
   var guess int
   fmt.Scanln(&guess)
   fmt.Println("You guess is", guess)
}

最终成果

该程序在读取到非法数据时会把 guess 置0,最后使用 for 循环让用户不断尝试,整体如下:

package main

import (
   "fmt"
   "math/rand"
   "time"
)

func main() {
   maxNum := 100
   rand.Seed(time.Now().UnixNano())
   secretNumber := rand.Intn(maxNum)
   // fmt.Println("The secret number is ", secretNumber)

   fmt.Println("Please input your guess")
   for {
      var guess int
      fmt.Scanln(&guess)
      fmt.Println("You guess is", guess)
      if guess > secretNumber {
         fmt.Println("Your guess is bigger than the secret number. Please try again")
      } else if guess < secretNumber {
         fmt.Println("Your guess is smaller than the secret number. Please try again")
      } else {
         fmt.Println("Correct, you Legend!")
         break
      }
   }
}

用户交互形式:

Please input your guess
68
You guess is 68
Your guess is bigger than the secret number. Please try again
60
You guess is 60
Your guess is smaller than the secret number. Please try again
63
You guess is 63
Your guess is smaller than the secret number. Please try again
66
You guess is 66

Correct, you Legend!