GO语言工程实践 | 豆包MarsCode AI 刷题

203 阅读3分钟

guessing-game

第一个例子里面,我们会使用 Golang 来构建一个猜数字游戏。在这个游戏里面,程序首先会生成一个介于 1 到 100 之间的随机整数,然后提示玩家进行猜测。玩家每次输入一个数字,程序会告诉玩家这个猜测的值是高于还是低于那个秘密的随机数,并且让玩家再次猜测。如果猜对了,就告诉玩家胜利并且退出程序。

设置随机种子

首先,我们需要生成一个随机数,在golang中,生成随机数需要用到math/rand包,我们使用它之前需要设置随机数种子,否则的话每一次都会生成相同的随机数序列。一般惯例用法是在程序启动的时候,用启动的时间戳来初始化随机数种子

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	maxNum := 100
        rand.seed(time.Now().UnixNano())
	secretNumber := rand.Intn(maxNum)
	fmt.Println("The secret number is ", secretNumber)
}

用户输入

  • bufio.NewReader(os.Stdin)

    • 适用于需要与用户进行交互,从命令行读取用户输入的程序。例如,编写一个命令行工具,要求用户输入命令或者参数,就可以使用它来读取用户输入。像一个简单的命令行计算器程序,需要用户输入数学表达式,就可以通过bufio.NewReader(os.Stdin)来获取用户输入的表达式。
package main

import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	maxNum := 100
	rand.Seed(time.Now().UnixNano())
	secretNumber := rand.Intn(maxNum)
	fmt.Println("The secret number is ", secretNumber)

	fmt.Println("Please input your guess")
	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)
		return
	}
	input = strings.Trim(input, "\r\n")

	guess, err := strconv.Atoi(input)
	if err != nil {
		fmt.Println("Invalid input. Please enter an integer value")
		return
	}
	fmt.Println("You guess is", guess)
}

为让游戏可以正常玩下去,我们需要加一个循环。我们把刚刚的代码挪到一个 for 循环里面,再把 return 改成 continue 以便于在出错的时候能够继续循环。在用户输入正确的时候 break ,这样才能够在用户胜利的时候退出游戏。

体会

随机数的运用与理解

猜数字游戏往往需要生成一个随机的谜底数字。Go 语言中的math/rand包提供了生成随机数的功能,但要注意正确地初始化随机数生成器。这让我们深入理解了伪随机数的概念以及如何在程序中运用它们。例如,需要使用当前时间作为种子来初始化rand,以确保每次游戏开始时谜底数字都是不同的,增加游戏的可重复性和可玩性。

错误处理的必要性

在玩家输入猜测的过程中,可能会出现各种意外情况,如输入格式错误、超出范围等。妥善的错误处理可以保证程序的稳定性。使用deferrecover机制或者在输入读取阶段进行严格的格式检查,可以避免程序因用户的错误操作而崩溃。这让我们明白在任何程序中,都不能忽视对可能出现的错误情况的处理,就像为程序穿上了一层坚固的 “铠甲”,使其能在各种复杂的环境下正常运行。