golang基础:一个简单的猜数字游戏 | 青训营笔记

126 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记

《golang基础篇:猜数字小游戏》

最终展示效果:

QQ图片20220510182545.png

一、搭建大致框架

在idea中创建一个go工程

package main

import "fmt"

func main()  {
   fmt.Println("一个基本框架")
}

二、使用rand生成一个随机数

maxNum := 100 //设置随机数的最大值
rand.Seed(time.Now().UnixNano()) //设置随机数种子,生成不同的数
resNum :=rand.Intn(maxNum) //接收随机数

为了使每次生成的数都不同,使用rand.Seed()来生成随机数种子,其中time.Now().UnixNano()为一个时间戳,目的便是让每个随机数种子都不相同,从而生成不同的随机数。

三、获取客户输入的数据

read := bufio.NewReader(os.Stdin)
input , err := read.ReadString('\n')  //读入一个数据
if err != nil {
   fmt.Println("数据错误,请重新输入")
   continue
}
input = strings.TrimSuffix(input, "\n") //去掉换行符

guess, err := strconv.Atoi(input)  //将读入的数据转化成十进制数

if err != nil {
   fmt.Println("数据无效,请输入一个数字")
   continue
}

使用bufio.NewReader(os.Stdin)来获取键盘输入的内容,当读入的数据不存在或者不合法,便会使err对于nil,从而提示客户重新输入。使用strconv.Atoi()来将其转换成十进制int型数据,若出现错误,提示用户重新输入。

四、对随机数与猜测数进行比较

if guess < resNum {
   fmt.Println("你输入的数字比答案小,请再猜")
}else if guess >resNum {
   fmt.Println("你输入的数字比答案大,请再猜")
}else {
   fmt.Println("恭喜猜对了!!")
   break
}

当随机数大于客户猜测的数时,便提示用户猜测数比答案小,小于时同理,才对答案后提示用户并结束进程。

五、当数据合法且用户未猜对时进行循环处理

func main()  {
   maxNum := 100 //设置随机数的最大值
   rand.Seed(time.Now().UnixNano()) //设置随机数种子,生成不同的数
   resNum :=rand.Intn(maxNum) //接收随机数

   fmt.Println("请输入猜测的数字:")
   read := bufio.NewReader(os.Stdin)  //读入内容

   for{
      input , err := read.ReadString('\n')  //读入一个数据
      if err != nil {
         fmt.Println("数据错误,请重新输入")
         continue
      }
      input = strings.TrimSuffix(input, "\n") //去掉换行符

      guess, err := strconv.Atoi(input)  //将读入的数据转化成十进制数
      if err != nil {
         fmt.Println("数据无效,请输入一个数字")
         continue
      }


      fmt.Println("你猜测的数字是:", guess)
      if guess < resNum {
         fmt.Println("你输入的数字比答案小,请再猜")
      }else if guess >resNum {
         fmt.Println("你输入的数字比答案大,请再猜")
      }else {
         fmt.Println("恭喜猜对了!!")
         break
      }
   }
}

将读入数据和判断数据部分装入for循环当中,使其能够循环操作

六、优化

使用fmt.Scanf()来对代码进行优化,减少代码量与可读性。可以用它来代替数据读入操作,结果如下:

func main()  {
   maxNum := 100 //设置随机数的最大值
   rand.Seed(time.Now().UnixNano()) //设置随机数种子,生成不同的数
   resNum :=rand.Intn(maxNum) //接收随机数

   fmt.Println("请输入猜测的数字:")
   //read := bufio.NewReader(os.Stdin)  //读入内容

   for{
      /*此处未初始版本代码
      input , err := read.ReadString('\n')  //读入一个数据
      if err != nil {
         fmt.Println("数据错误,请重新输入")
         continue
      }
      input = strings.TrimSuffix(input, "\n") //去掉换行符
      guess, err := strconv.Atoi(input)  //将读入的数据转化成十进制数*/

      var guess int  //改进后,减少了代码量
      _ , err := fmt.Scanf("%d",&guess)


      if err != nil {
         fmt.Println("数据无效,请输入一个数字")
         continue
      }

      fmt.Println("你猜测的数字是:", guess)
      if guess < resNum {
         fmt.Println("你输入的数字比答案小,请再猜")
      }else if guess >resNum {
         fmt.Println("你输入的数字比答案大,请再猜")
      }else {
         fmt.Println("恭喜猜对了!!")
         break
      }
   }
}

未完待续……