Go语言实现猜谜小游戏
Java星辰 人气:0前言
本文是介绍用Go实现一个猜谜小游戏,就是程序先生成一个随机数num
,然后让用户来猜生成的数是多少,如果猜的数比num
小就提示用户猜测的数据小于num
,如果猜的数比num
大就提示用户测试的数据大于num
,如果猜测的数据刚好是num
就提示用户猜对了。
技术点
在本文中将会使用到以下技术点:随机数、随机数种子、获取当前时间戳、两种读取终端输入方式等。
随机数
Go
生成随机数需要引入math/rand
包,Intn(n int)
函数可以生成一个0~n
的非负随机整数数,包含0
不包含n
也就是[0,n)
。
import ( "fmt" "math/rand" ) func main() { fmt.Println(rand.Intn(100)) }
经过多次运行,我们发现产生的数并不是随机的,每次都一样。
随机数种子
Go
中的随机数是通过rand.Seed
(种子值seedNum
)设置种子值,在同一个种子下每次产生的随机数顺序是一样的。
为了保证种子值的随机性,一般采用系统时间的毫秒值作为种子值,因为系统时间的毫秒值是一直变动的。
time.Now().UnixMilli()
可以系统当前的毫秒时间戳。
time.Now().Unix()
可以系统当前的秒时间戳。
time.Now().UnixMicro()
可以系统当前的微秒时间戳。
time.Now().UnixNano()
可以系统当前的纳秒时间戳。
import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) fmt.Println(rand.Intn(100)) }
再次运行代码,可以发现每次运行的随机数都是不同的了。
接收用户输入
Reader
os.Stdin
指向标准输入文件/dev/stdin
,os.Stdin
是os
包的一个变量。它是os
包的NewFile
函数的返回值。
bufio
包中都是IO
操作的方法,创建Reader
对象,就可以读取数据了。
reader := bufio.NewReader(os.Stdin)
设置按行读取:
input, err := reader.ReadString('\n')
按行读取得到的结果是包含换行符的,要把换行符给截取去掉:
input = strings.Trim(input, "\r\n")
再把得到的字符串转换为数字:
guess, err := strconv.Atoi(input)
Scanf
Scanf
函数也可以从os.Stdin
中读取数据。
var guess int fmt.Scanf("%d", &guess) fmt.Println(guess)
完整代码
因为用户不一定一次就猜中数据,我们可以使用for
循环,当用户猜不中时,可以让用户再继续猜直到猜中。
下面来看下完整的代码。
使用Reader
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 } } }
使用Scanf
func main() { maxNum := 100 rand.Seed(time.Now().UnixNano()) secretNumber := rand.Intn(maxNum) fmt.Println("Please input your guess") var guess int for { fmt.Scanf("%d", &guess) 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
语言来实现类一个猜字小游戏,在文中介绍了随机数、随机数种子以及如何从终端读取数据的两种方法。
对比从终端获取用户输入的两种方法,我们可以看到使用Scanf
比使用bufio
中的Reader方便了很多,大大简化了代码。
刚刚接触Go难免有些错误与不足之处,如有发现欢迎指出。
加载全部内容