猜谜游戏| 青训营笔记

89 阅读2分钟

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

游戏简介

在这个游戏中,首先会生成一个1到100之间的随机数,然后提示玩家进行猜测,玩家每输入一个数字,程序会告诉玩家这个猜测的值是高于随机值还是低于随机值,并让玩家再次猜测,直到玩家猜对,玩家胜利并退出程序。

实现思路

生成随机数

调用go官方提供的随机函数生成包,生成一个0-100的随机数,函数返回值secretNumber就是生成的随机数

# 定义随机数最大值
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)

用户输入

bufio包

使用bufio包中的NewReader方法读取系统标准输入流中的数据,在使用strings包中Trim方法去除换行符制表符(\n\t),若此过程发生错误,则提示用户输入错误,并让其重试。

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)
   continue
}
input = strings.Trim(input, "\r\n")

fmt包

使用fmt包中的Scanf方法,此方法使用与C语言中的scanf方法十分相似,可以按规定的格式获取系统输入流,我们调用Scanf方法读取一个字符串,在使用strings包中Trim方法去除换行符制表符(\n\t),若此过程发生错误,则提示用户输入错误,并让其重试。

fmt.Println("Please input your guess:")
_, err := fmt.Scanf("%s", &userInput)
if err != nil {
   fmt.Println("Invalid input. Please enter an integer value")
   continue
}
userInput = strings.Trim(userInput, "\r\n")

用户输入的逻辑判断

具体判断逻辑:如用户输入的值相比生成的随机数小,则提示用户猜的小了;若输入的值相比生成的随机数大,则提示用户猜的大了;若用户输入的值恰好等于生成的随机数,则提示用户猜对了并退出程序。

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!")
   return
}

代码

使用bufio包的版本

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
      }
   }
}

使用fmt包的版本

package main

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

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

   //用户的输入
   var userInput string
   for {
      fmt.Println("Please input your guess:")
      _, err := fmt.Scanf("%s", &userInput)
      if err != nil {
         fmt.Println("Invalid input. Please enter an integer value")
         continue
      }
      userInput = strings.Trim(userInput, "\r\n")
      guess, err := strconv.Atoi(userInput)
      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!")
         return
      }
   }
}

总结

通过猜谜游戏的练习,让自己更加熟练的了解并掌握go的各种语法使用!