实战案例---猜谜游戏要点 | 豆包MarsCode AI刷题

159 阅读3分钟

猜谜游戏

随机数

go语言的随机数,不是真正的随机,而是根据一定的公式算法计算出来的,也称伪随机数;随机数操作都在math/rand包下。

在生成随机数时,未设定种子数而产生的随机数是固定数,也就是说无论执行多少次,输出结果都是一样的.

如果要在每次执行时产生不同的随机数,我们要使用时间作为种子数。

这里我们需要注意的是如果seed值固定,那么每次程序重启后重新生成随机数会重复上一次的随机数。如下:

func main() {

rand.Seed(time.Now().UnixNano()) // 使用当前时间的纳秒数作为种子

fmt.Println(rand.Intn(100)) // 生成0到100之间的随机整数

}

当然,我们可以生成指定范围内的随机数,这时候我们就需要定义一个函数来实现:

package main

import (
"fmt"
"math/rand"
"time"
)

func main() {
rand.Seed(time.Now().UnixNano())
fmt.Println(random(1, 20)) // 生成1到20之间的随机整数
}

func random(min, max int) int {
return rand.Intn(max-min) + min
}

当然不是用函数也行,最重要的是记住公式rand.Intn(max-min) + min;max是最大值,min是最小值;

读取用户输入---fmt(scan..) & bufio

在视频中使用的是bufio包来读取用户输入,但也提到可以使用scan包来读取,因此,对两种包都看看;

fmt包:
  • fmt.scan
  • fmt.scanf
  • fmt.scanln
  1. scan 的使用:func Scan(a ...interface{}) (n int, err error);参数间以空格或回车键进行分割。 如果输入的参数不够接收的,按回车后仍然会等待其他参数的输入。如果输入的参数大于接收的参数,只有给定数量的参数被接收,其他参数自动忽略。
  2. Scanf:func Scanf(format string, a ...interface{}) (n int, err error);同样,Scanf也可以接收多个参数,但是接收字符串的话,只能在最后接收; 否则按照"%s%d"的格式进行接收,无论输入多少字符(包含数字),都会被认定是第一个字符串的内容,不会被第二个参数所接收。
  3. Scanln:func Scanln(a ...interface{}) (n int, err error);Scanln与Scan类似,但在换行时停止扫描,并且在最后一项之后必须有换行或EOF。
bufio包:

在 Go 语言中,bufio包实现了有缓冲的 I/O 操作。当读取用户输入时,它可以提供更高效的读取方式。通过bufio.Reader类型,可以从标准输入(os.Stdin)读取数据,并且能够按行或者其他方式处理输入内容。 示例如下:

package main 
import ( 
    "bufio" 
    "fmt" 
    "os" 
) 
func main() { 
    reader := bufio.NewReader(os.Stdin) 
    fmt.Print("请输入内容:") 
    input, err := reader.ReadString('\n') 
    if err!= nil { 
        fmt.Println("读取输入出错:", err) 
        return 
        } 
        // 去掉换行符 
    input = input[:len(input)-1] 
    fmt.Println("你输入的内容是:", input) 
}
  • 首先导入了bufiofmtos这三个包。bufio用于缓冲 I/O 操作,fmt用于格式化输出,os用于访问操作系统功能,这里主要是访问标准输入。
  • 然后通过bufio.NewReader(os.Stdin)创建了一个bufio.Reader对象reader,它将从标准输入读取数据。
  • 接着使用reader.ReadString('\n')来读取用户输入,直到遇到换行符\n为止。读取的内容存储在input变量中,并且会返回一个可能的错误err
  • 如果读取过程中出现错误,会打印错误信息并结束程序。如果没有错误,会去掉输入字符串末尾的换行符(因为ReadString会把换行符也读取进来),最后打印出用户输入的内容。