[ Go语言实战案例 | 青训营课程笔记 ]

67 阅读2分钟

[ Go语言实战案例 | 青训营课程笔记 ]

这是我参与「第五届青训营」伴学笔记创作活动的第 2天

猜数字游戏

在猜数字游戏中,程序首先会生成一个介于1-100之间的随机整数,随后提示玩家进行猜测。玩家每次输入猜测的数字后,程序会告诉玩家猜测值是高了还是低了,如果猜中了就会告诉玩家猜对了并退出程序。

生成随机数

用math/rand包生成随机数,再打印出来。

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

用time.Now().UnixNano()来初始化随机种子

不这样做的话可能会使每次生成的随机数相同,用time.Now().UnixNano()来初始化随机种子。

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

读取用户输入

实现用户输入功能,用ReadString 方法来读取一行,失败的话会打印错误并且退出,返回结果转换成数字(去掉结尾的换行符)。转换失败的话,同样打印错误并且退出。

package main

import (
   "bufio"
   "fmt"
   "math/rand"
   "os"
   "strconv"
   "strings"
   "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")
   reader := bufio.NewReader(os.Stdin)
   input, err := reader.ReadString('\n')
   if err != nil {
      fmt.Println("An error occured while reading input. Please try again", err)
      return
   }
   input = strings.Trim(input, "\r\n")

   guess, err := strconv.Atoi(input)
   if err != nil {
      fmt.Println("Invalid input. Please enter an integer value")
      return
   }
   fmt.Println("You guess is", guess)
}

实现判断逻辑

将随机数生成的秘密值作为答案,通过比较从用户输入处获取的值和正确答案大小,给用户进行提示猜的太大了或者太小了,使用for循环,将判断移到循环里边,并将return改为continue,以便出错时候继续循环。如果两个数相等,则告诉用户游戏胜利。 在这个过程中,我复习并且练习了之前的很多概念与知识,比如变量循环、函数控制流和错误处理。

package main

import (
   "bufio"
   "fmt"
   "math/rand"
   "os"
   "strconv"
   "strings"
   "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")
   reader := bufio.NewReader(os.Stdin)
   for {
      input, err := reader.ReadString('\n')
      if err != nil {
         fmt.Println("An error occured while reading input. Please try again", err)
         continue
      }
      input = strings.Trim(input, "\r\n")

      guess, err := strconv.Atoi(input)
      if err != nil {
         fmt.Println("Invalid input. Please enter an integer value")
         continue
      }
      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
      }
   }
}