GO语言小项目实践-猜谜游戏 | 豆包MarsCode AI刷题

79 阅读5分钟

猜谜游戏小项目来自于字节跳动后端青训营GO语言工程实践课程内容,通过该项目,复习了golang语言中的基本语法知识,在这里分享项目的实现过程和学习心得。

  • 猜谜游戏预期实现效果:

image.png

系统会给出一个随机的神秘数字,然后用户通过在命令行中输入数字的方式猜测这个神秘数字,当用户输入的数字大于该神秘数字时,提示输入的数字大于神秘数字,当用户输入的数字小于该神秘数字时,提示用户输入的数字小于神秘数字,当用户输入的数字等于神秘数字时,提示猜谜成功,游戏结束。

  • 实现关键

怎么在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)

运行结果

image.png

将用户输入的数字与神秘数字进行比较,给出不同的提示信息

// 根据用户输入的大小给出不同提示
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
		}
	}
}