前言
本文是三篇Go语言工程实践课后作业相关笔记的第一篇,介绍用Go实现一个猜数字游戏,主要内容即用户先输入一个整数来表示猜的数字的个数,接着程序生成随机数secretNumber,然后让用户猜生成的数是多少,如果猜的数比接着程序生成随机数secretNumber小就提示用户猜测的数据小于接着程序生成随机数secretNumber,如果猜的数比接着程序生成随机数secretNumber大就提示用户测试的数据大于接着程序生成随机数secretNumber,如果猜测的数据刚好是secretNumberm就提示用户猜对了。
正文
实现随机数
Go生成随机数需要引入math/rand包,rand包中的Intn(n int)函数可以生成一个0~n的非负随机整数数,包含0不包含n。但是实际操作会发现,生成的随机数会出现每次都一样的情况,这是因为Go中的随机数是通过rand.Seed(种子值seedNum)设置种子值,在同一个种子下每次产生的随机数顺序是一样的。因此我们需要先使用 time.Now().UnixNano(),该函数可实现系统当前的纳秒时间戳,然后再使用Intn函数,部分具体代码如下:
maxNum := 100 //限定了最大范围
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum) //保证每次随机数不同
再次运行代码,可以发现每次运行的随机数都是不同的了。
接收用户输入
要让用户从外界给出游玩的次数以及每次猜的数字,需要在代码中引入NewReader方法、ReadString方法、Trim方法和strconv中的Atoi方法,NewReader方法可以让用户从外界给出数据。使用 NewReader 读取文件时,首先,我们需要打开文件,接着, 使用打开的文件返回的文件句柄当作函数参数传入NewReader,最后,我们使用 NewReader 返回的 reader 对象调用 Read 来读取文件。ReadString方法则是用来实现按行存取的功能,并使用异常处理使代码更加严谨。然而使用ReadString方法得到的结果包含了换行符,因此需要再次使用Trim方法将换行符去除,最后利用strconv中的Atoi函数将字符串转换为数字。部分具体代码如下:
n := bufio.NewReader(os.Stdin)
input, err := n.ReadString('\n')
if err != nil {
panic("Invalid input. Please enter an integer value")
return
}
input = strings.Trim(input, "\r\n") //清除空格和换行
guess2, err := strconv.Atoi(input)
具体功能实现
解决完随机数和数据读入的问题,最后就是具体功能的实现。猜数字的过程利用if-else选择结构来实现,分为三种情况,一种是猜的数字过小,一种是猜的数字过大,最后一种是正好猜到。由于猜数字不可能每次都能一发入魂,因此使用for循环语句来控制猜数字的过程,若一直猜不中,则使用continue继续循环,当猜中了,则使用break跳出循环。而用户的游玩次数也是通过for循环来控制。控制用户游玩次数为外循环,猜数字过程为内循环。具体代码如下:
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
func main() {
n := bufio.NewReader(os.Stdin)
input, err := n.ReadString('\n')
if err != nil {
panic("Invalid input. Please enter an integer value")
return
}
input = strings.Trim(input, "\r\n") //清除空格和换行
guess2, err := strconv.Atoi(input)
fmt.Println(guess2)
for i := 1; i <= guess2; i++ {
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 {
panic("An error occured while reading input. Please try again")
continue
}
input = strings.Trim(input, "\r\n") //清除空格和换行
guess, err := strconv.Atoi(input) //转换为整数
if err != nil {
panic("Invalid input. Please enter an integer value")
continue
}
fmt.Println("Your guess is", guess)
if guess > secretNumber {
fmt.Println("Your guess is bigger, please try again")
} else if guess < secretNumber {
fmt.Println("Your guess is smaller, please try again")
} else {
fmt.Println("Correct, you win")
break
}
}
}
}
结果展示
总结
本文介绍了使用Go语言来实现类一个猜字小游戏,在文中介绍了随机数、如何从终端读取数据以及游戏具体实现思路。
引用
字节内部课-Go 语言的实战案例