本篇文章主要梳理Go语言的实战案例————猜数游戏
猜数游戏
本次猜谜游戏是一个简单的命令行游戏,玩家需要猜测计算机生成的秘密数字,直到猜对为止。
功能介绍:
- 游戏生成一个在 1 到 100 范围内的随机整数作为随机数字。
- 提示玩家输入猜测的数字,并将输入解析成整数。
- 比较玩家的猜测和秘密数字,根据比较结果给出相应的提示,让玩家继续猜测。
- 当玩家猜对秘密数字时,打印胜利的提示,游戏结束。
1. 随机数生成
在 Go 语言中使用 import 来导入所需的包,比如 fmt、math/rand、os 等。
// 包声明,表示这是一个可执行程序的入口文件
package main
// 导包
// fmt 包:提供了格式化输入输出功能
// math/rand 包:用于生成随机数
import (
"fmt"
"math/rand"
)
// 程序的入口函数
func main() {
// 声明了一个整数变量 maxNum,并将其初始化为 100,表示猜测的数字在 1 到 100 之间
maxNum := 100
// 声明了一个整数变量 secretNumber,创建了一个随机数字
secretNumber := rand.Intn(maxNum)
// 打印随机数字
fmt.Println("The secret number is ", secretNumber)
}
rand.Intn(n) 是 math/rand 包中的函数,用于生成一个大于等于 0 且小于 n 的随机整数。
从以上代码的运行结果得到的随机数都是一样的,不符合题目的要求
2. 随机数生成V2:
使用 time.Now().UnixNano() 作为种子来初始化随机数生成器。
这样就能确保每次运行程序时,都会生成不同的随机数序列,从而得到不同的随机数。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
}
3. 读取用户输入:
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)
}
-
reader := bufio.NewReader(os.Stdin)
bufio是Go标准库中的一个包,提供了缓冲读写功能。
os.Stdin是Go标准库中的一个变量,表示标准输入流。它是程序默认的输入来源,通常是键盘输入。 -
input, err := reader.ReadString('\n')
从一个名为reader的输入流中读取数据,直到遇到换行符('\n')为止。读取的内容被赋值给input变量,而err变量则用于捕获可能发生的错误。 -
input = strings.Trim(input, "\r\n")
将输入中的结尾换行符\r\n去掉,以便后续处理。 -
guess, err := strconv.Atoi(input)
将字符串input转换成整数类型。如果转换失败(即用户输入的不是一个有效的整数),我们会打印错误信息并退出。
**运行结果 **
$ go run guessing-game/v3/main.go
The secret number is 58
Please input your guess
5
You guess is 5
4. 实现逻辑判断:
这部分实现游戏逻辑判断,比较玩家输入的数字和秘密的数字,并且给出提示 // ...(前面部分省略)
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!")
}
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
}
}
}
至此猜数游戏便可以正常运行。