这是我参与「第五届青训营」笔记创作活动的第3天!
案例一 猜谜游戏
案例题目:
程序会先生成一个0~100的随机整数,用户输入整数进行猜测,程序会根据玩家的输入与所给数字进行对比,会给玩家反馈高于还是低于所给的数字,最终猜到正确数字成功退出
思路分析:
1. 生成随机数
开始的代码如下,但经过验证发现这其实是一种伪随机,不能真正实现随机数的产生
func main() {
maxNum := 100
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is", secretNumber)
}
这样实现随机数会导致重复出现相同的数字:
这就引入了随机数种子,对上述代码进行改进,用时间戳来初始化随机数种子
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is", secretNumber)
}
实现随机效果如下:
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
}
}
}
代码实现成功!
总结
这次的小实践将第一节课学到的Go的基本语法如变量的使用、循环、判断都进行了运用,同时也学习了用时间戳初始随机数种子和只读流的操作方法,让我对Go语言的学习有了更深刻的认识。