根据我们前面学习的一些Go语言基础,我们可以完成一个简单的猜数小游戏。
我们将通过随机函数生成一个整数答案,用户通过键盘输入数字,控制台将打印提示用户猜测的数字比答案大了还是小了,直到用户输入的数字与我们设定的值相等。
编写过程
-
导入必要的包:
bufio:用于读取标准输入。fmt:用于格式化I/O。math/rand:用于生成随机数。os:用于与操作系统交互,这里主要用于获取标准输入。strconv:用于基本数据类型和字符串之间的转换。strings:用于处理字符串。time:用于获取当前时间,作为随机数生成的种子。
-
定义
main函数:- 设置最大数字
maxNum为100,这意味着随机生成的目标数字将在0到99之间。 - 使用
time.Now().UnixNano()作为种子初始化随机数生成器,确保每次运行程序时生成的随机数都不同。 - 通过
rand.Intn(maxNum)生成一个0到maxNum-1(即99)之间的随机整数作为秘密数字。
- 设置最大数字
-
游戏循环:
-
提示用户输入他们的猜测。
-
使用
bufio.NewReader(os.Stdin)创建一个读取器,用于从标准输入读取数据。 -
在一个无限循环中,使用
reader.ReadString('\n')读取用户的输入,直到遇到换行符。 -
检查读取过程中是否发生错误,如果发生错误,打印错误信息并继续循环。
-
使用
strings.Trim(input, "\r\n")去除输入字符串两端的空白字符(包括换行符)。 -
尝试将用户输入的字符串转换为整数
guess,如果转换失败(例如,输入的不是数字),则打印错误信息并继续循环。 -
打印用户的猜测。
-
通过一系列的
if语句比较用户的猜测与秘密数字:- 如果猜测大于秘密数字,提示用户猜测的数字太大。
- 如果猜测小于秘密数字,提示用户猜测的数字太小。
- 如果猜测等于秘密数字,打印胜利信息并退出循环。
-
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("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 语言进行基本的输入输出操作、错误处理、字符串处理和循环控制等。