这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
猜数字游戏
当程序运行时,会生成一个1~100 之间的随机整数。随后,系统会提示玩家猜测生成的数字,如果猜测高于或低于密码数字,则会向玩家提供反馈。如果猜测等于密钥编号,则会打印一条祝贺消息,程序将退出。
一.随机数生成
在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand"。 1."math/rand" 包实现了伪随机数生成器。
该包中根据生成伪随机数是是否有种子(可以理解为初始化伪随机数),可以分为两类:
①有种子。通常以时钟,输入输出等特殊节点作为参数,初始化。该类型生成的随机数相比无种子时重复概率较低。
②无种子。可以理解为此时种子为1, Seek(1)。
这里我们选取时间戳作为随机数种子,代码如下
max_num := 100 //生成数的范围
rand.Seed(time.Now().UnixNano()) //用时间戳作为随机数种子
secretNumber := rand.Intn(max_num)
fmt.Println("Guess a number between 1 and 100")
fmt.Println("Please input your guess")
二、从终端读取用户输入
go常用的读取输入的方法除了scanf,还有另外两种。
一种是使用bufio
func main() {
reader := bufio.NewReader(os.Stdin)
result, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input.", err)
}
fmt.Println("input:", result)
}
另一种则是使用os.stdin
func main() {
var buffer [512]byte
n, err := os.Stdin.Read(buffer[:])
if err != nil {
fmt.Println("An error occured while reading input.", err)
return
}
fmt.Println("count:", n, ", input:", string(buffer[:]))
}
这里我们选取方法一,同时加入一个变量attempt用于记录用户猜测成功输入的次数:
attempts++
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)
continue
}
input = strings.TrimSuffix(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("Your guess is", guess)
我们使用了strings.TrimSuffix去除输入的后缀,这里必须注意,“当从控制台读取输入参数时,Windows平台会在这个参数末尾自动加上\r\n,而Linux平台会在这个参数末尾自动加上\n。”
三、将玩家的猜测与答案进行比较
这里代码比较简单不做过多说明
if guess > secretNumber {
fmt.Println("Your guess is bigger than the secret number. Try again")
} else if guess < secretNumber {
fmt.Println("Your guess is smaller than the secret number. Try again")
} else {
fmt.Println("Correct, you Legend! You guessed right after", attempts, "attempts")
break
}
最后再在外面加一个无限循环的for循环就可以啦。