猜谜游戏小项目来自于字节跳动后端青训营GO语言工程实践课程内容,通过该项目,复习了golang语言中的基本语法知识,在这里分享项目的实现过程和学习心得。
- 猜谜游戏预期实现效果:
系统会给出一个随机的神秘数字,然后用户通过在命令行中输入数字的方式猜测这个神秘数字,当用户输入的数字大于该神秘数字时,提示输入的数字大于神秘数字,当用户输入的数字小于该神秘数字时,提示用户输入的数字小于神秘数字,当用户输入的数字等于神秘数字时,提示猜谜成功,游戏结束。
- 实现关键
怎么在go语言中实现神秘数字的随机生成,用户输入的读取,输入数字是否正确的判断
- 实现过程:
生成随机数字->读取用户输入->根据用户的不同输入作出不同的判断和提示
首先需要定义一个最大的数值,然后使用rand包生成一个0-maxNum范围的随机数,第4行代码读取系统当前时间,用当前时间的时间戳作为随机数生成器的种子,增加随机数生成的不确定性
// 定义一个最大的数
maxNum := 100
// 用时间戳实现随机数的生成
rand.Seed(time.Now().UnixNano())
// 随机生成一个0-100的数
secretNumber := rand.Intn(maxNum)
读取用户输入,这里使用的是bufio.Reader对象读取用户输入,首先创建bufio.Reader对象,使用bufio.Reader对象的ReadString方法读取用户输入(直到遇到换行符停止),然后将读取到的字符串两端的换行符和回车符去除,使用Atoi将字符串转化为整数,如果转化不成功,说明用户输入的不是数字,打印提示信息,将转化后的用户输入数字打印出来,至此读取用户输入操作完成
// 提示用户输入数字
fmt.Println("Please input your guess")
// 创建一个新的bufio.Reader对象,用于从标准输入读取数据
reader := bufio.NewReader(os.Stdin)
// 读取用户输入的数据,直到遇到换行符
input, err := reader.ReadString('\n')
// 如果读取过程中发生错误,打印错误信息
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
}
// 去除输入字符串两端的换行符和回车符
input = strings.Trim(input, "\r\n")
// 尝试将输入的字符串转换为整数
guess, err := strconv.Atoi(input)
// 如果转换失败,说明用户输入的不是整数,打印提示信息
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
}
// 打印用户输入的数字
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!")
}
最后要实现让用户根据提示不断输入数字,直到游戏结束,使用一个for循环的形式,当用户输入不是神秘数字时,继续循环,当输入的数字是神秘数字时,跳出循环,游戏结束,完成的代码如下
func main() {
// 定义一个最大的数
maxNum := 100
// 用时间戳实现随机数的生成
rand.Seed(time.Now().UnixNano())
// 随机生成一个0-100的数
secretNumber := rand.Intn(maxNum)
// 在完整代码中,将这行注释掉,不然用户知道神秘数字,游戏就玩不了了
// fmt.Println("The secret number is ", secretNumber)
// 提示用户输入数字
fmt.Println("Please input your guess")
// 创建一个新的bufio.Reader对象,用于从标准输入读取数据
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实现
使用fmt.Scanf读取用户的输入,将输入解析为整数,当用户输入有错误时,打印错误信息,因为在实现过程中,发现用户每次输入都会打印错误信息,考虑到可能是在用户输入时,输入缓冲区还有其他数据,所以在每次输入后,清空缓冲区的内容,错误信息不再每次出现。完整的代码如下:
func main() {
// 定义一个最大的数
maxNum := 100
// 用时间戳实现随机数的生成
rand.Seed(time.Now().UnixNano())
// 随机生成一个0-100的数
secretNumber := rand.Intn(maxNum)
// 在完整代码中,将这行注释掉,不然用户知道神秘数字,游戏就玩不了了
// fmt.Println("The secret number is ", secretNumber)
// 提示用户输入数字
fmt.Println("Please input your guess")
// 创建一个新的bufio.Reader对象,用于从标准输入读取数据
var guess int
for {
// 读取用户输入的数据
_, err := fmt.Scanf("%d", &guess)
// 清空缓冲区
var temp string
fmt.Scanln(&temp)
// 如果读取过程中发生错误,打印错误信息
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
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
}
}
}