go语言实践之猜数游戏|青训营

112 阅读4分钟

guessing game

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("Please input your guess")

	// 创建一个读取用户输入的 Reader
	reader := bufio.NewReader(os.Stdin)

	for {
		// 读取用户输入的文本字符串,直到遇到换行符
		input, err := reader.ReadString('\n')
		if err != nil {
			// 如果在读取输入时发生错误,则打印错误信息并继续下一次循环
			fmt.Println("An error occurred 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("Your 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
		}
	  }
 }       

image.png

实现思路和整体架构布局:

1. 导入所需的包:
  • "bufio":用于读取用户输入的包,其中的 ReadString 函数可以读取到用户输入的完整文本字符串。
  • "fmt":用于打印输出的包,其中的 Println 函数可以打印指定的字符串。
  • "math/rand":用于生成随机数的包,其中的 Seed 函数可以设置随机数生成的种子,Intn 函数可以生成一个指定范围内的随机整数。
  • "os":用于操作系统相关功能的包,其中的 Stdin 变量表示标准输入流,可以从用户输入中读取数据。
  • "strconv":用于字符串和整数之间的转换的包,其中的 Atoi 函数可以将字符串转换为整数。
  • "strings":用于字符串操作的包,其中的 Trim 函数可以去除字符串两端指定的字符。
  • "time":用于获取当前时间的包,其中的 Now 函数可以获取当前的时间,UnixNano 方法可以获取当前时间的纳秒值。
2. 在 main 函数中定义秘密数字的最大值 maxNum,这里设置为100。
4. 设置随机数生成的种子为当前时间的纳秒值,time.Now().UnixNano() 可以获取当前时间的纳秒表示。
6. 使用 rand.Intn(maxNum) 生成一个介于0到 maxNum 之间(不包括 maxNum)的随机秘密数字,保存在 secretNumber 变量中。
8. 打印提示信息,要求用户输入猜测的数字。
10. 创建一个 bufio.Reader 对象 reader,用于读取用户输入的文本。
12. 进入一个无限循环。
14. 在循环中,使用 reader.ReadString('\n') 读取用户输入的文本字符串,直到遇到换行符为止。如果在读取过程中出现错误,则打印错误信息并继续下一次循环。
16. 使用 strings.Trim(input, "\r\n") 去除输入文本中的换行符,包括 "\r" 和 "\n",得到去除换行符后的字符串。
18. 使用 strconv.Atoi(input) 将去除换行符后的字符串转换为整数。Atoi 函数会返回转换后的整数值和可能出现的错误。如果输入无法转换为整数,则打印错误信息并继续下一次循环。
20. 打印用户猜测的数字。
22. 判断用户猜测的数字和秘密数字之间的关系:
  • 如果用户猜测的数字大于秘密数字,打印提示信息告诉用户猜测的数字比秘密数字大,并要求用户再次尝试。
  • 如果用户猜测的数字小于秘密数字,打印提示信息告诉用户猜测的数字比秘密数字小,并要求用户再次尝试。
  • 如果用户猜测的数字等于秘密数字,打印提示信息告诉用户猜测正确,并使用 break 跳出循环,结束程序的执行。

整体架构布局:

  • 主函数 main 是程序的入口,负责整个程序的控制流程。
  • 在 main 函数中,首先定义了最大的秘密数字 maxNum
  • 然后设置随机数生成的种子,确保每次运行程序时生成的随机数都不同。
  • 接着生成一个随机的秘密数字,并将其保存在 secretNumber 变量中。
  • 打印提示信息,要求用户输入猜测的数字。
  • 创建一个 Reader 对象 reader,用于读取用户输入的文本。
  • 进入一个无限循环。
  • 在循环中,读取用户输入的猜测,并进行各种判断和操作。
  • 在循环内部,通过合适的打印输出,向用户提供提示信息,指导其下一步的操作。
  • 当用户猜测正确时,打印正确信息,并通过 break 跳出循环,结束程序的执行。
  • 当用户猜测正确时,打印正确信息,并通过 break 跳出循环,结束程序的执行。

小技巧

  • 猜数时用二分法逼近