Go语言入门:一个简单的猜谜游戏|青训营笔记

110 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第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本身就是一个文件,它本质上是一个缓冲区,该接口作为消费者从这个缓冲区里面取出数据来用。
  • 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
		}
	}
}