这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记
猜谜游戏
1. 开发思路
- 首先生成一个随机数,将此随机数存储起来,并作为
target交给内存存储 - 编写用户与用户交互的代码
- 要求能够实现用户输入一个数,用输入的数来比较
target - 通过条件分支语句来返回用户猜数的结果
2.开发知识准备
rand.Seed()的使用- 这个api的用法与C++中的rand()的使用方法基本是一致的,需要注意一下几点:
- 如果不使用rand.Seed(seed int64),每次运行,得到的
随机数会一样,程序不停止,一直获取的随机数是不一样的; - 每次运行时rand.Seed(seed int64),seed的值要不一样,这样生成的随机数才会和上次运行时生成的随机数不一样;
- rand.Intn(n int)得到的随机数int i,0 <= i < n。
time.Now().UnixNano()的使用- 由于时间是在不断变化的,因此其,因此拿来做随机数种子再合适不过了
- time族类提供了大量获取时间的方法,可以很方便地获取时间
bufio.NewReader()的使用- 该api提供了接口从操作系统上读取文件,如果我们想要其获取用户在终端上的输入,只需要传入
OS.stdin参数即可,可以理解为OS.stdin本身就是一个文件,它本质上是一个缓冲区,该接口作为消费者从这个缓冲区里面取出数据来用。
- 该api提供了接口从操作系统上读取文件,如果我们想要其获取用户在终端上的输入,只需要传入
reader.ReadString()的使用- 该api是Reader的一个类,表示以什么样的字符结尾来解析获取的数据字符串
- 比如说我们终端通常标志一行的结束是一个回车,那么我们就传入'\n'来进行解析
- 但是需要注意的是在linux下和windows下的回车是不一样的,比如说我在乌班图下用'\n'没有任何问题,但是在windows下用'\n'就会有问题,需要用'\r',这一点需要注意
strings.TrimSuffix(input, "\r")的使用- 这个api提供了方便的方法将字符串中的某个字符,或者子串给删除,在我们的开发中需要把回车给删除,因此采用此api可以解决问题
strconv.Atoi(input)的使用- 该api可以将字符串转化为数字,与c语言中的atoi类似
fmt.Scanf("%d", &guess)的使用- 该api与C语言中的输入是类似的
- 要注意的是其输入结束后,由于回车还留在缓冲区中,因此需要多一个scanf来吸收回车,否则会吞数
3.提交代码
package main
import (
"fmt"
"math/rand"
"time"
)
/*Description:
生成随机数+猜数demo.go
*/
func main() {
maxNum := 100 //随机数的最大值
rand.Seed(time.Now().UnixNano()) //利用时间戳来生成随机数种子
secretNumber := rand.Intn(maxNum) //1.生成随机数,在100以内,注意,在生成随机数之前需要设置随机数种子,否则产生的随机数一直都是同一个
for {
var guess int
var c string
fmt.Println("请输入你要猜的数字:")
_, err := fmt.Scanf("%d", &guess)
fmt.Scanf("%s", &c)
if err != nil {
fmt.Println("产生了某种错误!", err)
continue
}
if guess > secretNumber {
fmt.Println("你猜的数字太大了")
} else if guess < secretNumber {
fmt.Println("你猜的数字太小了")
} else if guess == secretNumber {
fmt.Println("你猜中了!数字是", secretNumber)
break
}
}
}