猜数字 | 青训营笔记

137 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

猜数字游戏

当程序运行时,会生成一个1~100 之间的随机整数。随后,系统会提示玩家猜测生成的数字,如果猜测高于或低于密码数字,则会向玩家提供反馈。如果猜测等于密钥编号,则会打印一条祝贺消息,程序将退出。

一.随机数生成

在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand"。 1."math/rand" 包实现了伪随机数生成器。

   该包中根据生成伪随机数是是否有种子(可以理解为初始化伪随机数),可以分为两类:

  ①有种子。通常以时钟,输入输出等特殊节点作为参数,初始化。该类型生成的随机数相比无种子时重复概率较低。

  ②无种子。可以理解为此时种子为1, Seek(1)。

这里我们选取时间戳作为随机数种子,代码如下

        max_num := 100                   //生成数的范围
	rand.Seed(time.Now().UnixNano()) //用时间戳作为随机数种子
	secretNumber := rand.Intn(max_num)
	fmt.Println("Guess a number between 1 and 100")
	fmt.Println("Please input your guess")

二、从终端读取用户输入

go常用的读取输入的方法除了scanf,还有另外两种。

一种是使用bufio

func main() {
	reader := bufio.NewReader(os.Stdin)
	result, err := reader.ReadString('\n')
	if err != nil {
		fmt.Println("An error occured while reading input.", err)
	}
	fmt.Println("input:", result)
}

另一种则是使用os.stdin

func main() {
	var buffer [512]byte
	n, err := os.Stdin.Read(buffer[:])
	if err != nil {
		fmt.Println("An error occured while reading input.", err)
		return
	}
	fmt.Println("count:", n, ", input:", string(buffer[:]))
}

这里我们选取方法一,同时加入一个变量attempt用于记录用户猜测成功输入的次数:

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

		fmt.Println("Your guess is", guess)

我们使用了strings.TrimSuffix去除输入的后缀,这里必须注意,“当从控制台读取输入参数时,Windows平台会在这个参数末尾自动加上\r\n,而Linux平台会在这个参数末尾自动加上\n。”

三、将玩家的猜测与答案进行比较

这里代码比较简单不做过多说明

if guess > secretNumber {
			fmt.Println("Your guess is bigger than the secret number. Try again")
		} else if guess < secretNumber {
			fmt.Println("Your guess is smaller than the secret number. Try again")
		} else {
			fmt.Println("Correct, you Legend! You guessed right after", attempts, "attempts")
			break
		}

最后再在外面加一个无限循环的for循环就可以啦。

运行结果

image.png