guessing-game
第一个例子里面,我们会使用 Golang 来构建一个猜数字游戏。在这个游戏里面,程序首先会生成一个介于 1 到 100 之间的随机整数,然后提示玩家进行猜测。玩家每次输入一个数字,程序会告诉玩家这个猜测的值是高于还是低于那个秘密的随机数,并且让玩家再次猜测。如果猜对了,就告诉玩家胜利并且退出程序。
设置随机种子
首先,我们需要生成一个随机数,在golang中,生成随机数需要用到math/rand包,我们使用它之前需要设置随机数种子,否则的话每一次都会生成相同的随机数序列。一般惯例用法是在程序启动的时候,用启动的时间戳来初始化随机数种子
package main
import (
"fmt"
"math/rand"
)
func main() {
maxNum := 100
rand.seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
}
用户输入
-
bufio.NewReader(os.Stdin)- 适用于需要与用户进行交互,从命令行读取用户输入的程序。例如,编写一个命令行工具,要求用户输入命令或者参数,就可以使用它来读取用户输入。像一个简单的命令行计算器程序,需要用户输入数学表达式,就可以通过
bufio.NewReader(os.Stdin)来获取用户输入的表达式。
- 适用于需要与用户进行交互,从命令行读取用户输入的程序。例如,编写一个命令行工具,要求用户输入命令或者参数,就可以使用它来读取用户输入。像一个简单的命令行计算器程序,需要用户输入数学表达式,就可以通过
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)
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)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
return
}
fmt.Println("You guess is", guess)
}
为让游戏可以正常玩下去,我们需要加一个循环。我们把刚刚的代码挪到一个 for 循环里面,再把 return 改成 continue 以便于在出错的时候能够继续循环。在用户输入正确的时候 break ,这样才能够在用户胜利的时候退出游戏。
体会
随机数的运用与理解
猜数字游戏往往需要生成一个随机的谜底数字。Go 语言中的math/rand包提供了生成随机数的功能,但要注意正确地初始化随机数生成器。这让我们深入理解了伪随机数的概念以及如何在程序中运用它们。例如,需要使用当前时间作为种子来初始化rand,以确保每次游戏开始时谜底数字都是不同的,增加游戏的可重复性和可玩性。
错误处理的必要性
在玩家输入猜测的过程中,可能会出现各种意外情况,如输入格式错误、超出范围等。妥善的错误处理可以保证程序的稳定性。使用defer和recover机制或者在输入读取阶段进行严格的格式检查,可以避免程序因用户的错误操作而崩溃。这让我们明白在任何程序中,都不能忽视对可能出现的错误情况的处理,就像为程序穿上了一层坚固的 “铠甲”,使其能在各种复杂的环境下正常运行。