Go语言上手-实战案例(1)

2023-11-02

猜谜游戏

在这个游戏里面,程序首先会生成一个介于1~100之间的随机整数,然后提示玩家进行猜测。玩家每次输入一个数字,程序就会告诉玩家这个猜测的值是高于还是低于那个秘密的随机数,并且让玩家再次猜测,如果猜对了就告诉玩家胜利并且退出程序。

生成随机数

package main

import (
   "fmt"
   "math/rand"
)

func main() {
   maxNum := 100
   secretNumber := rand.Intn(maxNum)
   fmt.Println("The secret number is ", secretNumber)
}

为了生成随机数,我们需要用到math/rand包,然后用rand.Intn生成一个随机数,再打印出这个随机数。

在这里插入图片描述

这时候会发现我们每次都会打印相同的数字到屏幕上,不符合要求。

在这里插入图片描述

打开文档我们会发现需要使用前设置随机数种子,我们可以在程序启动时用启动的时间戳来初始化随机数种子。

package main

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

func main() {
	maxNum := 100
	rand.Seed(time.Now().UnixNano())
	secretNumber := rand.Intn(maxNum)
	fmt.Println("The secret number is ", secretNumber)
}

我们可以用time.now.unix来初始化随机数种子

读取用户输入

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("The secret number is ", secretNumber)

   fmt.Println("Please input your guess")
   reader := bufio.NewReader(os.Stdin)
   input, err := reader.ReadString('\n')
   if err != nil {
      fmt.Println("An error occured while reading input. Please try again", err)
      return
   }
   input = strings.Trim(input, "\r\n")

   guess, err := strconv.Atoi(input)
   if err != nil {
      fmt.Println("Invalid input. Please enter an integer value")
      return
   }
   fmt.Println("You guess is", guess)
}

接下来我们需要实现用户的输入输出,并解析成数字。

每个程序执行的时候都会打开几个文件,如stdin,stdout,stderr等。我们可以用bufio.NewReader把一个文件转换成一个reader变量,然后用ReadString方法来读取一行,如果失败的话则打印错误并退出。ReadString返回的结果包含结尾的换行符,我们把它去掉,再转换成数字。如果转换失败,我们同样打印错误退出。

实现判断逻辑

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("The secret number is ", secretNumber)

   fmt.Println("Please input your guess")
   reader := bufio.NewReader(os.Stdin)
   input, err := reader.ReadString('\n')
   if err != nil {
      fmt.Println("An error occured while reading input. Please try again", err)
      return
   }
   input = strings.Trim(input, "\r\n")

   guess, err := strconv.Atoi(input)
   if err != nil {
      fmt.Println("Invalid input. Please enter an integer value")
      return
   }
   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!")
   }
}

然后我们加入比较操作。

实现游戏循环

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("The secret number is ", secretNumber)

   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
      }
   }
}

此时我们的程序大致可以正常工作,但是玩家只能输入一次猜测,无论猜测是否正确,程序都会退出。为了改变这种行为,让游戏可以正常玩下去,我们需要加一个循环。我们把刚刚的代码挪到一个for循环里,然后再把return改成continue,以便于在出错的时候能够继续循环,在用户输入正确的时候break,这样才能在用户胜利的时候退出游戏。

在这里插入图片描述
成功运行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言上手-实战案例(1) 的相关文章

随机推荐

  • (AJAX/JSON)技术实现校验用户名是否存在

    案例 校验用户名是否存在 1 服务器响应的数据 在客户端使用时 要想当做json数据格式使用 有两种解决方案 1 get type 将最后一个参数type指定为 json 2 在服务器端设置MIME类型 response setConten
  • tensorflow教程_TensorFlow教程

    tensorflow教程 TensorFlow教程 TensorFlow Tutorial PDF Version Quick Guide Resources Job Search Discussion PDF版本 快速指南 资源资源 求职
  • nginx配置中root和alias的区别

    例 访问http 127 0 0 1 download 这个目录时候让他去 opt app code这个目录找 方法一 使用root关键字 location root usr share nginx location download gz
  • 水平集分割

    基于距离正则的水平集分割MATLAB代码 无需初始化 This Matlab code demonstrates an edge based active contour model as an application of the Dis
  • 深入理解Objective-C的Block

    最近时间少 也变得懒了 好久没在这里写文章了 眼看就到8月末了 还是整理一篇酝酿已久的吧 之前的文章中整理过用ObjectiveC开发中常用到的Block代码块 其中也提到了一个和block使用不当的crash例子 接着这个问题 本篇文章将
  • Ubuntu 11.10编译Android 4.0.1源码错误

    Android 4 0 1下载到自己的Ubuntu 11 10 64位 系统里 把整个编译环境都配置好了 参考 http www linuxidc net thread 2736 1 1 html 编译时还是出现了如下的错误提示
  • HTML5 页面布局【结合案例】

    新布局的意义 语义化 HTML5 可以让很多更语义化的结构化代码标签代替大量无意义的 div 标签 1 这种语义化的特性提升了网页的质量和语义 2 减少了以前用于CSS 调用的class 和 id 属性 对搜索引擎的友好 新的结构标签带来的
  • su root 与 su - root的区别

    su root 与 su root的区别 su 默认切到 root su 与su 的区别 su 是不改变当前变量 su 是切换到用户的变量 su只能获得root的执行权限 不能获得环境变量 而su 是切换到root并获得root的环境变量及
  • (Java课设)学生成绩管理系统(IDEA+SSM+Layuimini)

    一 系统介绍 1 开发环境 2 技术概要 3 设计概要 4 功能模块设计 二 系统展示 三 部分代码 Student java studentDao接口文件 StudentService java StudentController jav
  • 如何使用VisualVM进行性能分析本地java项目和远程java项目

    这里是weihubeats 觉得文章不错可以关注公众号小奏技术 文章首发 拒绝营销号 拒绝标题党 背景 在有时候我们需要分析java应用的一些内存 gc等情况进行性能分析 我们往往需要一些性能分析利器 而VisualVM算是其中一个 今天我
  • RTL8189ES/ETV/FTV系列模块定频软件操作手册

    使用说明 1 安装串口驱动 SecureCRT串口工具 2 右键打开我的电脑 选择属性 打开设备管理器 如下图示找到COM口 3 打开串口工具 按下图设置 4 打开机器电源 串口工具中会出现字符运行 停止后按ENTER出现下图 5 输入 号
  • Docker Compose的介绍及安装

    一 compose介绍 Compose是一个用来定义和运行复杂应用的Docker工具 一个使用Docker容器的应用 通常由多个容器组成 使用Docker Compose不再需要使用shell脚本来启动容器 Compose 通过一个配置文件
  • DIY简单的RTOS(二)任务切换

    从系统的角度看 任务是竞争系统资源的最小运行单元 任务可以使用或等待CPU 使用内存空间等系统资源 并独立于其它任务运行 项目地址 任务控制块 在其他RTOS中 任务一般是由 任务堆栈 任务控制块和任务函数三部分组成 任务堆栈 上下文切换的
  • 计算机技术为我们带来的影响,计算机技术对社会发展的影响探析

    摘 要 随着社会科学技术和经济的迅速发展 计算机技术也越来越完善 对人类生活的影响也越来越显著 计算机的应用领域很大 几乎可以被用在人们生活的方方面面 无论是学习 工作 还是生活 娱乐 都能看到计算机技术为我们提供的方便之处 正是因为计算机
  • 【论文笔记】BLIP: Bootstrapping Language-Image Pre-training forUnified Vision-Language Understanding and

    1 背景 1 1 之前存在的两个问题 1 模型视角 大多数方法要么采用基于编码器的模型 要么采用编码器 解码器模型 基于编码器的模型不太容易直接转移到文本生成任务 例如 图像字幕 而编码器 解码器模型尚未成功用于图像文本检索任务 2 数据集
  • GoShoppingActivityLearnBinding.java:918: 错误: 参数过多 protected GoShoppingActivityLearnBinding

    前些天发现了一个蛮有意思的人工智能学习网站 8个字形容一下 通俗易懂 风趣幽默 感觉非常有意思 忍不住分享一下给大家 点击跳转到教程 工作中遇到的问题 使用DataBinding 报参数过多 编译失败 异常截图如下 问题解决方法 探索 当时
  • Camera SPI协议讲解

    Camera SPI协议讲解 该文章写于2016年 一直未发表 近期工作中又涉及到了Camera相关的内容 重新温习了下相关知识 决定把这篇文章发表出来 大家共同学习 SPI Serial Peripheral Interface 串行外围
  • ‘cmake' 不是内部或外部命令 也不是可运行的程序 或批处理文

    在 Win7下的命令行模式下 输入cmake相关命令 出现如下错误 cmake 不是内部或外部命令 也不是可运行的程序 或批处理文件 解决方法 在环境变量中添加cmake的文件路径 计算机 右键 属性 高级系统设置 高级 环境变量 系统变量
  • pytorch 多GPU训练总结(DataParallel的使用)

    参考 主页 PyTorch中文文档 前言 博主最近搭建网络的时候 需要调用不同的GPU 实现训练的加速 有时间会出现显卡现存分布不均的情况 有时间有的显卡温度特别高 博客持续更新 一更 2022 09 01 DP模式见本文 使用最少的代码实
  • Go语言上手-实战案例(1)

    猜谜游戏 在这个游戏里面 程序首先会生成一个介于1 100之间的随机整数 然后提示玩家进行猜测 玩家每次输入一个数字 程序就会告诉玩家这个猜测的值是高于还是低于那个秘密的随机数 并且让玩家再次猜测 如果猜对了就告诉玩家胜利并且退出程序 生成