前言
根据课程给出的几个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
这里我们要使用bufio、os包,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,就是输入值后会出现两次比较大小,如图所示:
有时候没有输入值会出现代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语言进行编码,脑海中首先跃过的是以前学过的编程语言的编码思路,所以一开始编码会显得很慢,各种包还需要查询资料,对于包以及包的依赖的不熟悉会极大的拖慢编码速度,但是依然在持续进步中