go的入门快速上手项目实战 上(4) | 青训营

64 阅读2分钟

今天我们来把青训营的两个最简单的项目给完成,在这里我会给出我的思路和细节,希望能对以后我复习有用,如果对大家学习有帮助的话那更好不过了。

猜数字游戏

我们使用go语言来实现一个猜数游戏。

项目要求

在这个游戏里面。程序会首先生成一个1~100的随机整数,让玩家进行猜测。每进行一次猜测,程序会告诉玩家这个猜测的数比答案大了还是小了,并且让玩家再次猜测。如果猜对了,就告诉玩家胜利并且退出程序。

设计思路

首先,核心部分就是生成这个随机数。而在go语言里面我们需要同时调用math/rand包,并且调用rand.Seed()函数才能实现生成随机数。但是如果我们在rand.Seed()内填入一个不变的值,就会像老师的效果,随机数是一个定值。

image.png

这个时候我们就要设置时间戳,调time包的time.Now().UnixNano()函数,这样就可以使每次输出的随机数都不一样啦。

然后再调用rand.Intn()来表示范围,[0,maxNum]

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

实现了生成随机数,接下来的就很简单了。我在这里使用fmt.Scanln()来简化代码。

首先得初始化玩家猜测的值guess,然后就调用fmt.Scanln()来输入值,这个函数会返回两个值一直是count代表一共输入了多少个数,我在这里用_下划线省略了。还有一个是err错误信息。使用Scanln是因为它比较方便,最后输入回车就可以完成输入了。最后再就是用if循环来完成整个代码结构。然后就完成了~

下面是我的代码:

package main

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

var (
   //reader int
   guess int
)

func main() {
   maxNum := 100
   rand.Seed(time.Now().UnixNano())
   secretNumber := rand.Intn(maxNum)
   //fmt.Println("The secret number is ", secretNumber)
   for {
      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)
         continue
      }*/
      //input = strings.TrimSuffix(input, "\n") //删除换行符
      //input = strings.TrimSuffix(input, "\r\n") //删除回车和换行符
      _, err := fmt.Scanln(&guess)
      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
      }
   }
}