引言
本文章是在记录我完成猜谜游戏代码的过程。
初始版本的代码
line1 导入main包
line3-6 导入fmt和math/rand
line8-12 限制随机数的最大数值为100,使用rand.Intn产生一个随机数。
但是我们会发现,每次出现的随机数都是同样的数字。
完整代码如下
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 occurred while reading input.Please try again", err)
return
}
input = strings.TrimSuffix(input, "\n") //去掉换行符
guess, err := strconv.Atoi(input) //转换成数字
if err != nil {
fmt.Println("Invalid input.Please enter an integer value")
return
}
fmt.Println("your guess is", guess)
}
完整思路如下:
line1
导入package包。
line3-11
导入fmt,os,strconv,math,rand等。
line13-17
line14规定了猜谜游戏的最大数字为100。 line15利用rand产生一个随机数,其中time的作用是为了利用时间戳来初始化随机数种子。如果没有时间戳,那么无论重复多少次,这个随机数始终唯一。
line19-25
line20输入你猜测的数字,os.Stdin是标准输入文件的指针。由于每个程序执行的时候都会打开几个文件,stdin,stdout,stderr等文件,只获取stdin文件就可以用os.Stdin来得到。line21ReadString结束在换行符号之前,是为了读取这一行的输入数字。如果程序在这一块报错,出现了"An error occurred while reading input.Please try again",那么程序在数据读取时出现了问题。
line26-32
line26由于你猜测的数字已经变成了字符串,那么我们在转换字符串为数字之前,需要去除末尾的换行符号。 line28将字符串转换为数字。 line30如果程序在这一块报错,出现了"Invalid input.Please enter an integer value",那么程序在数据转换时出现了问题,或者我们输入的数据是无效数据。
line33-34
如果跳出以上循环,则该程序没有问题,打印"your guess is"和猜测数字。
运行结果如下
The secret number is 12
Please input your guess
23
Invalid input.Please enter an integer value
Process finished with the exit code 0
路径记录
我的程序出现了"Invalid input.Please enter an integer value"。很明显,我的程序在数据转换时出现了问题。 同时GoLand提示我们:'Seed' is deprecated。经过查询之后,我们得知Seed has been deprecated in Go 1.20, but an alternative has existed since Go 1.0.也就是说GO已经不再支持seed用法。
为了解决转换问题,我又查询了其他版本的写法 我发现在line26 将input = strings.TrimSuffix(input, "\n")更改为input = strings.Trim(input, "\r\n")之后,这个转换问题就解决了。
原来\n是上一次输入产生缓冲的空格,是换行,即猜测数字的左空格。而\r是回车,也就是右空格。由于我们只顾左空格,忽略了右空格,才导致一直报错。