Go实战案例一 | 青训营笔记

85 阅读2分钟

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

案例一 猜谜游戏

案例题目:

程序会先生成一个0~100的随机整数,用户输入整数进行猜测,程序会根据玩家的输入与所给数字进行对比,会给玩家反馈高于还是低于所给的数字,最终猜到正确数字成功退出

思路分析:

1. 生成随机数

开始的代码如下,但经过验证发现这其实是一种伪随机,不能真正实现随机数的产生

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

这样实现随机数会导致重复出现相同的数字:

image.png

这就引入了随机数种子,对上述代码进行改进,用时间戳来初始化随机数种子

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

实现随机效果如下:

image.png

2. 读取用户输入

读入读出通过直接操作是很复杂的,使用bufio.Reader方法将其转化为只读流便于操作。

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)   //用Atoi将字符串转化成数字
//错误处理
if err != nil {
        fmt.Println("Invalid input. Please enter an integer value")
        return
}
fmt.Println("You guess is", guess)

3. 生成判断逻辑

将玩家猜测数字与所给数字作对比 若猜测数字大于所给数字,则输出玩家猜大了。若猜测数字小于所给数字,则输出玩家猜小了。当猜测数字等于所给数字,则输出玩家猜对。

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

4. 实现循环过程

因为程序一次性,玩家输入一次程序即退出,为使程序循环到直到玩家猜对才退出,需要在程序运行主体加上for循环,并在玩家猜对时break跳出循环,同时在错误检测中将return改为continue,即在出错时执行下一次输入。

5. 完整代码

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

代码实现成功! image.png

总结

这次的小实践将第一节课学到的Go的基本语法如变量的使用、循环、判断都进行了运用,同时也学习了用时间戳初始随机数种子和只读流的操作方法,让我对Go语言的学习有了更深刻的认识。