Project2_Guess_Number

108 阅读1分钟

底层逻辑

1.随机生成数字 \

通过时间戳来初始化随机种子,让每次随机的数值都不一样
但是vscode实现时,在go1.20版本下,
在没有初始化随机数种子的情况下也可以每次生成不同数字

2.接收用户输入\

这里使用了读输入文件的第一行的方法,将输入的数字作为字符串单独拿出来处理
虽然可以使用scanner这种更简单的方法
但也需要提前熟悉这种方法,在后面的实践中还会用到
需要注意的是在我们通过识别换行符,取得用户输入之后还需要对带有格式化字符串的结果进行处理
用户输入数字的那一行除了换行符还有一个"\r"
这种和视频内容不符的现象由操作系统不同导致

image.png

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

}