底层逻辑
1.随机生成数字 \
通过时间戳来初始化随机种子,让每次随机的数值都不一样
但是vscode实现时,在go1.20版本下,
在没有初始化随机数种子的情况下也可以每次生成不同数字
2.接收用户输入\
这里使用了读输入文件的第一行的方法,将输入的数字作为字符串单独拿出来处理
虽然可以使用scanner这种更简单的方法
但也需要提前熟悉这种方法,在后面的实践中还会用到
需要注意的是在我们通过识别换行符,取得用户输入之后还需要对带有格式化字符串的结果进行处理
用户输入数字的那一行除了换行符还有一个"\r"
这种和视频内容不符的现象由操作系统不同导致
3.比较结果并返回
上一步得到了干净的用户输入,也就是字符串格式的数字
转化成数字之后通过if else判断和随机生成数进行比较
将用户输入之后的所有内容放入死循环
在猜对之后break跳出循环
代码块
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(secretNumber)
fmt.Println("Please input the number you 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!")
continue
}
input = strings.TrimSuffix(input, "\r\n")
// fmt.Println(input)
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value!")
continue
}
// fmt.Printf("%T, %v\n", err, err)
fmt.Println("you guess is :", guess)
if secretNumber < guess {
fmt.Println(">")
} else if secretNumber > guess {
fmt.Println("<")
} else {
fmt.Println("win!")
break
}
}
}