一、场景
随机生成
2
个数,在这2
个数中随机一
个结果数字
。然后我们键盘录入,猜测这个结果数字
是几。
二、分析
需要完成这些操作,我们需要知道的知识点:
- 1、随机数获取函数
- 2、键盘录入函数
- 3、打印(格式化打印)函数
三、代码
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
//结果数值的取值范围
guessArray := [2][2]int64{
{
10, 20}, //最小值取值范围为[10, 20)
{
30, 80}, //最大值取值范围为[30, 80)
}
guessResult := make([]int64, 0) //我们需要猜测的数字范围
var i int64
for i = 0; i < 2; i++ {
//循环取出最小、最大值
min := guessArray[i][0]
max := guessArray[i][1]
randNumber := genRangeNumber(min, max, i)
guessResult = append(guessResult, randNumber) //把随机出来的结果追加到我们需要猜测的数字中
}
//生成结果数据
guessMin := guessResult[0]
guessMax := guessResult[1]
resultNumber := genRangeNumber(guessMin, guessMax, 999) //在[guessMin, guessMax)中随机生成答案数字
//先提示一下猜测范围
fmt.Printf("数字范围在:[%d, %d) \n", guessMin, guessMax)
//编写一个for死循环:一直猜测结果,直到猜对为止
var inputNumber int64
guessNumber := 0 //记录猜测的次数
for {
//开始猜测了
fmt.Println("请输入数字:")
fmt.Scanln(&inputNumber)
if inputNumber > resultNumber {
fmt.Printf("大了,数字范围:(%d, %d)\n", guessMin, inputNumber)
guessMax = inputNumber //把猜测是最大值设置为输入的值
guessNumber++
continue //跳出循环
}
if inputNumber < resultNumber {
fmt.Printf("小了,数字范围:(%d, %d)\n", inputNumber, guessMax)
guessMin = inputNumber //把猜测是最小值设置为输入的值
guessNumber++
continue //跳出循环
}
guessNumber++
break //跳出循环
}
fmt.Printf("恭喜您:猜测了 [ %d ] 次就成功猜到了,正确答案是:%d", guessNumber, resultNumber)
}
/**
* 生成两个数字[min, max)之间的随机数
* @param min 最小值
* @param max 最大值
* @param i 为了随机,加上循环i,保证唯一
*/
func genRangeNumber(min, max, i int64) int64 {
//println(time.Now().Unix()) //打印:1609232986
//println(time.Now().UnixNano()) //打印:1609232986276977000
rand.Seed(time.Now().UnixNano() + i) //给一个时间戳的种子,否则每次生成都是一样的值
randNum := rand.Int63n(max - min)
randNum = min + randNum
return randNum
}
四、运行结果
五、延伸
我们可以完善一下我们的代码:
- 1、输入的数字
类型校验
- 2、输入的数字
范围校验
:不能小于
猜测的最小值,并且不能大于等于
猜测的最大值