这是我参与「第三届青训营 -后端场」笔记创作活动的的第一篇笔记
《golang基础篇:猜数字小游戏》
最终展示效果:
一、搭建大致框架
在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
}
}
}
未完待续……