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
}
}
}
实现思路和整体架构布局:
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跳出循环,结束程序的执行。
小技巧
- 猜数时用二分法逼近