前言
牛顿曾经说过:"如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。"
斯言妙哉!我们在学习过程中,首先坚实自己的基础非常重要,在学习了基础简单的代码书写规则后,懂得借鉴他人代码来学习其中的书写方式、书写习惯也是必不可少的。这种学习模式可以让我们积累代码经验,通过眼睛看、脑子思达到比单纯自己埋头苦写代码更好的学习效果。那么,接下来我们一起看几段代码。
猜谜游戏
在猜谜游戏中,涉及了4个知识点。
生成随机数
Go
package main
import(
"fmt"
"math/rand" //导入数学随机数的功能包
"time" //导入时间的功能包
)
func main(){
maxNum := 100 //设置最大数
rand.Seed(time.Now().UnixNano()) //用时间戳来初始化随机数种子
secretNumber := rand.Intn(maxNum) //随机抽取0-100之间的数字 --->调用方法
fmt.Println("The secret number is ", secretNumber) //打印最终结果
}
- 在生成随机数中,我们了解到,如果只直接导入
math/rand
包还不足以实现随机数,此时打印出的结果始终是同一个数(不相信的小伙伴们可以试试看,我也试了好多次!!!),还需要导入time
包用时间戳来初始化随机数种子,这样才可以实现随机数的打印。
读取用户输入
在上一部分的代码基础上,我们对功能的需求进行完善。
Go
package main
import(
"bufio"
"os"
"strconv"
"strings"
)
func main(){
fmt.Println("Please input your guess") //语句提示
//每个程序执行的时候都会打开几个文件,stdin stdout stderr等,stdin文件可以用os.Stdin来得
到。接着,由于直接操作文件不方便,我们用bufio.NewReader将一个文件传换成一个reader变量
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.TrimSuffix(input, "\n") //调用方法,去掉换行符号
guss, err := strconv.Atoi(input) //转换成数字
if err != nil{
fmt.Println("Invalid input. Please enter an integer value")
return
}
fmt.Println("You guess is ", guess) //打印用户的猜测
}
由此,我们得出以下输出:
- 这部分我们学习了用户输入的读取,了解了对文件格式转换的操作。很好,到现在我们已经学会了如何从键盘获取输入以及学会了如何实现对输入信息的筛查和判断。
实现判断逻辑
继续完善代码!
Go
func main(){
//使用判断语句对秘密值进行比较
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 smalller than the secret number. Please try again")
} else {
fmt.Println("Correct, you Legend!") //猜测正确
}
}
- 该部分是一个简单的数值比较,通过条件语句
if
进行比较得出猜测的答案是否正确。所有的情况兼顾,非常合理! - 注意:当我们使用条件语句
if-else
时,需要将小范围的条件放在最前面!
实现游戏循环
前三部分的代码基本可以实现我们程序的功能,但美中不足的是这个程序只能执行一次,也就是说玩家只能输入一次猜测且无论玩家猜测的是否正确该程序都会自动退出。为了让游戏可以正常继续玩下去直到用户猜到谜底时才退出,我们需要给整段代码加上for
循环。代码如下所示:
Go
package main
import(
"fmt"
"math/rand" //导入数学随机数的功能包
"time" //导入时间的功能包
"bufio"
"os"
"strconv"
"strings"
)
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)
//return
continue //return改成continue以便出错的时候能够继续循环
}
input = strings.TrimSuffix(input, "\n")
guss, err := strconv.Atoi(input)
if err != nil{
fmt.Println("Invalid input. Please enter an integer value")
//return
continue //return改成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 smalller than the secret number. Please try again")
} else {
fmt.Println("Correct, you Legend!")
break //当猜对时跳出循环,结束程序
}
}
}
- 完整的代码如上所示。以下是执行的效果:
后语
对于猜谜游戏的代码解析到这边就结束啦!代码不长,道理不浅。生成随机数、读取用户输入、实现判断逻辑、实现游戏循环,这四个部分其实都是由基础代码结合而成。他们实现了各种各样的功能,也让我们深刻了解到一个简单游戏背后的"秘密"。我认为这是一次非常有意义的探索,我们更深刻地体悟到Go语言的使用,在玩耍中学习,在学习中玩耍!