广告位联系
返回顶部
分享到

Go语言实现猜谜小游戏

Golang 来源:互联网 作者:佚名 发布时间:2023-01-30 09:46:40 人浏览
摘要

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

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

技术点

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

随机数

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

1

2

3

4

5

6

7

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()可以系统当前的纳秒时间戳。

1

2

3

4

5

6

7

8

9

import (

    "fmt"

    "math/rand"

    "time"

)

func main() {

    rand.Seed(time.Now().UnixNano())

    fmt.Println(rand.Intn(100))

}

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

接收用户输入

Reader

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

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

1

reader := bufio.NewReader(os.Stdin)

设置按行读取:

1

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

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

1

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

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

1

guess, err := strconv.Atoi(input)

Scanf

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

1

2

3

var guess int

fmt.Scanf("%d", &guess)

fmt.Println(guess)

完整代码

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

下面来看下完整的代码。

使用Reader

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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难免有些错误与不足之处,如有发现欢迎指出。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://juejin.cn/post/7191469064588361785
相关文章
  • Golang实现将中文转化为拼音

    Golang实现将中文转化为拼音
    导语:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英
  • Go语言实现猜谜小游戏

    Go语言实现猜谜小游戏
    本文是介绍用Go实现一个猜谜小游戏,就是程序先生成一个随机数num,然后让用户来猜生成的数是多少,如果猜的数比num小就提示用户猜测的
  • go微服务PolarisMesh源码解析服务端启动流程
    polaris-server作为PolarisMesh的控制面,该进程主要负责服务数据、配置数据、治理规则的管理以及下发至北极星SDK以及实现了xDS的客户端。 po
  • go sync.Map基本原理深入解析
    我们知道,go 里面提供了map这种类型让我们可以存储键值对数据,但是如果我们在并发的情况下使用map的话,就会发现它是不支持并发地进
  • Golang的Fork/Join实现代码

    Golang的Fork/Join实现代码
    做过Java开发的同学肯定知道,JDK7加入的Fork/Join是一个非常优秀的设计,到了JDK8,又结合并行流中进行了优化和增强,是一个非常好的工具
  • Golang嵌入资源文件实现步骤
    Go文档中展示了多种方式实现外部资源嵌入,包括文本文件、图片、ios文件等: 文本文件 1 2 3 4 5 6 7 package main import _ embed //go:embed schema.sql
  • golang敏感词过滤的实现
    用golang写了敏感词过滤的工具,主要用来检测用户昵称中是否存在敏感词,同时提供剔除转移字符的功能。 可以先将敏感词库存放在一个
  • go语言题解LeetCode228汇总区间介绍
    原题链接 : 228. 汇总区间 给定一个 无重复元素的有序整数数组nums。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,
  • Go使用Gin+mysql实现增删改查的详细实例

    Go使用Gin+mysql实现增删改查的详细实例
    0.前置知识 Go中的struct。 mysql、Gin框架。 Web基础。 1.架构 使用mysql作为数据库,Gin作为Web框架。 2.功能模块 1.自定义Person结构体 2.实现对P
  • 浅析Go语言中数组的这些细节
    Go语言基础二 lencap 书接上文,我们提到二维数组中的第二个维度的数组不能用...来表示,接下来我们要认识两个新的函数,它们分别是len和
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计