Go 语言工程实践课后作业 | 青训营

64 阅读3分钟

前言

根据课程给出的几个demo,现就猜谜游戏给出自己的一些编码经验,零基础小白望指教

课题引入

该程序需要实现一个用户猜谜的小游戏,系统给出100以内的随机数,用户输入猜测值,然后会给出猜测值与系统给的值大小关系,然后用户继续猜值,直至猜出最后的随机数。

关键点

  • 随机数
  • 读取用户输入
  • 循环

随机数

对于随机数我们可以引入math/rand包,使用rand.Intn(n int)生成n范围的随机数,但是运行的时候发现每次的随机数生成的都一样,这时候我们需要使用随机数种子,导入time包,使用时间戳生成随机数种子,最后生成随机数,具体代码如下:

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

读取用户输入

这里我们有两种方法:

  • Reader
  • scanf

Reader

这里我们要使用bufioos包,bufio.NewReader()读取系统的输入os.Stdin,然后读成string,再通过字符串转换成整型得到输入的整数类型,具体代码如下:

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

scanf

另一种方法是使用fmt.scanf方法获取用户输入:

import("fmt"
)
var guess int
for {
		
    fmt.Scanf("%d", &guess)
}

不过我用这个方法会出现一个BUG,就是输入值后会出现两次比较大小,如图所示:

屏幕截图 2023-07-30 163153.png 有时候没有输入值会出现代0的现象,我想应该是系统有暂存值导致后面的循环会出现两次,暂时没有解决这个问题,希望有大佬不吝赐教

循环

由于Go语言只有for循环,所以我们这里用一个for循环,中间加入大小判断条件,没有猜出来继续执行循环体,直到最后猜出答案break跳出循环:

完整代码

把以上关键点整合起来成为最后的代码:

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("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, _ := 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
        }
    }
}

尝试

因为编码途中遇到了很多BUG,我尝试用其他方法来获取用户输入,比如说用bufio.NewScanner()方法来尝试一下,结果是每次输入的都是0,进入一个死循环,跟之前的BUG一样,比之还严重了,上面使用scanf还能实现程序的功能,而这个尝试直接把程序搞得不能用了

小结

以上就是本次demo的一些编码过程,编码的思路大同小异,但由于是第一次用Go语言进行编码,脑海中首先跃过的是以前学过的编程语言的编码思路,所以一开始编码会显得很慢,各种包还需要查询资料,对于包以及包的依赖的不熟悉会极大的拖慢编码速度,但是依然在持续进步中