Go语言实现猜谜小游戏

 更新时间:2023年01月28日 11:12:12   作者:Java星辰  
这篇文章主要为大家介绍了Go语言实现猜谜小游戏示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

本文是介绍用Go实现一个猜谜小游戏,就是程序先生成一个随机数num,然后让用户来猜生成的数是多少,如果猜的数比num小就提示用户猜测的数据小于num,如果猜的数比num大就提示用户测试的数据大于num,如果猜测的数据刚好是num就提示用户猜对了。

技术点

在本文中将会使用到以下技术点:随机数、随机数种子、获取当前时间戳、两种读取终端输入方式等。

随机数

Go生成随机数需要引入math/rand包,Intn(n int)函数可以生成一个0~n的非负随机整数数,包含0不包含n也就是[0,n)

import (
    "fmt"
    "math/rand"
)
func main() {
    fmt.Println(rand.Intn(100))
}

经过多次运行,我们发现产生的数并不是随机的,每次都一样。

随机数种子

Go中的随机数是通过rand.Seed(种子值seedNum)设置种子值,在同一个种子下每次产生的随机数顺序是一样的。

为了保证种子值的随机性,一般采用系统时间的毫秒值作为种子值,因为系统时间的毫秒值是一直变动的。

time.Now().UnixMilli()可以系统当前的毫秒时间戳。

time.Now().Unix()可以系统当前的秒时间戳。

time.Now().UnixMicro()可以系统当前的微秒时间戳。

time.Now().UnixNano()可以系统当前的纳秒时间戳。

import (
    "fmt"
    "math/rand"
    "time"
)
func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println(rand.Intn(100))
}

再次运行代码,可以发现每次运行的随机数都是不同的了。

接收用户输入

Reader

os.Stdin指向标准输入文件/dev/stdinos.Stdinos包的一个变量。它是os包的NewFile函数的返回值。

bufio包中都是IO操作的方法,创建Reader对象,就可以读取数据了。

reader := bufio.NewReader(os.Stdin)

设置按行读取:

input, err := reader.ReadString('\n')

按行读取得到的结果是包含换行符的,要把换行符给截取去掉:

input = strings.Trim(input, "\r\n")

再把得到的字符串转换为数字:

guess, err := strconv.Atoi(input)

Scanf

Scanf函数也可以从os.Stdin中读取数据。

var guess int
fmt.Scanf("%d", &guess)
fmt.Println(guess)

完整代码

因为用户不一定一次就猜中数据,我们可以使用for循环,当用户猜不中时,可以让用户再继续猜直到猜中。

下面来看下完整的代码。

使用Reader

func main() {
    maxNum := 100
    rand.Seed(time.Now().UnixNano())
    secretNumber := rand.Intn(maxNum)
    fmt.Println("Please input your guess")
    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

func main() {
    maxNum := 100
    rand.Seed(time.Now().UnixNano())
    secretNumber := rand.Intn(maxNum)
    fmt.Println("Please input your guess")
    var guess int
    for {
        fmt.Scanf("%d", &guess)
        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
        }
    }
}

来运行一下代码看下最终效果:

总结

本文介绍了使用Go语言来实现类一个猜字小游戏,在文中介绍了随机数、随机数种子以及如何从终端读取数据的两种方法。

对比从终端获取用户输入的两种方法,我们可以看到使用Scanf比使用bufio中的Reader方便了很多,大大简化了代码。

刚刚接触Go难免有些错误与不足之处,如有发现欢迎指出。

以上就是Go语言实现猜谜小游戏的详细内容,更多关于Go实现猜谜小游戏的资料请关注脚本之家其它相关文章!

相关文章

  • Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解

    Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解

    这篇文章主要为大家介绍了Go框架三件套Gorm Kitex Hertz的基本用法与常见API讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-02-02
  • golang return省略用法说明

    golang return省略用法说明

    这篇文章主要介绍了golang return省略用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang 流水线设计模式实践示例详解

    Golang 流水线设计模式实践示例详解

    这篇文章主要为大家介绍了Golang 流水线设计模式实践示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go并发编程实现数据竞争

    Go并发编程实现数据竞争

    本文主要介绍了Go并发编程实现数据竞争,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • graphql---go http请求使用详解

    graphql---go http请求使用详解

    这篇文章主要介绍了graphql---go http请求使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang中生成随机字符串并复制到粘贴板的方法

    Golang中生成随机字符串并复制到粘贴板的方法

    这篇文章主要介绍了Golang中生成随机字符串并复制到粘贴板的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • golang多次读取http request body的问题分析

    golang多次读取http request body的问题分析

    这篇文章主要给大家分析了golang多次读取http request body的问题,文中通过代码示例和图文介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • Golang日志操作库zap的使用详解

    Golang日志操作库zap的使用详解

    zap 是 uber 开源的一个高性能,结构化,分级记录的日志记录包,本文主要为大家详细介绍了zap的具体使用,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • Go io/fs.FileMode文件系统基本操作和权限管理深入理解

    Go io/fs.FileMode文件系统基本操作和权限管理深入理解

    这篇文章主要为大家介绍了Go io/fs.FileMode文件系统基本操作和权限管理深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Golang标准库unsafe源码解读

    Golang标准库unsafe源码解读

    这篇文章主要为大家介绍了Golang标准库unsafe源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论