一。题目要求
对于老师上课讲的猜谜游戏在原有的基础上对其客户输入需求部分进行优化,要求使用fmt.Scanf()简化代码
二.个人思路
1.原代码对于玩家数据的处理使用的是先存在文件中后从文件中读取操作最后输出的方案,比较繁琐且运行相对缓慢,我的方案是直接用fmt.Scanf(n int)(n int,error err)函数让玩家输入数字后暂存在缓冲区以便于之后的使用
2.原代码在对于数据的处理上还有很多的细节需要完善
a.在对于最初的数据的处理上,我们要得到一个最大值,但是fmr.Scanf()对于数据的合法性判断不能满足我们的真实需求,比如要是一个正数,我在if条件判断中加上了这一点
b.对于每次输入的数我们也有对应的要求这也需要我们手动加入
三.代码实现
1.对于输入最大值的需求
maxNum := 100
get := 0
check := 0
fmt.Println("please input the largest number")
m, err1 := fmt.Scanf("%d", &maxNum)
fmt.Scanln()
if err1 != nil || m == 0 || maxNum < 0 {
fmt.Println(" input uncorrectly")
check = 1
}
其中的check是一个判断条件用来之后确定煮出的最大值是否输入正确,若错误则游戏结束
2.对于玩家的猜测输入的需求
if check == 0 {
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("game begin")
fmt.Println("please input your guess")
for {
n, err := fmt.Scanf("%d", &get)
fmt.Scanln()
fmt.Println("your guess is", get)
if err != nil || n == 0 || get > maxNum {
fmt.Println(" input uncorrectly")
break
}
最上边的时间戳是用来确保每次得到的数字都不同,而玩家的猜测数据不断输入直至猜对的需求通过for循环实现
3.对于逻辑判断的需求
if get < secretNumber {
fmt.Println("your guess is smaller zhan the secret number please input again")
}
if get > secretNumber {
fmt.Println("your guess is bigger zhan the secret number please input again")
}
if get == secretNumber {
fmt.Println("your guess is right")
break
}
主要是对于结束条件的处理,只有输入正确的数字时才会跳出循环
四.难点分析
主要的困难之处在于对scanf函数的使用,scanf按照给定的格式依次读取数据,而未能在输入数据时最后一个字符时回车,而scan不会读取,且缓冲区中的回车也不会自动回收,这就导致当我们再次调用scanf时scanf会直接读到回车然后返回不会给我们输入的机会,因此我们在使用scanf时必须先将缓存区的回车取出,这就要用到scanln()。
五.结果展示
1.非法的输入最大值
2.非法的输入猜测值
3.正确输入后的结果展示