Go语言工程实践课后作业|青训营

81 阅读3分钟

前言

本文是三篇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  
}  
}  
}  
}

结果展示

image.png

image.png

总结

本文介绍了使用Go语言来实现类一个猜字小游戏,在文中介绍了随机数、如何从终端读取数据以及游戏具体实现思路。

引用

字节内部课-Go 语言的实战案例