这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
猜数字游戏
-
首先实现随机数生成服务
package main import( "fmt" "math/rand" ) //生成随机数 func main() { maxNum := 100 secretNum := rand.Intn(maxNum) fmt.Println("my secretNum is:%v",secretNum) }
-
运行结果
看似比较合理但是...
每次输出结果固定,是伪随机的
-
优化
package main import( "fmt" "math/rand" "time" ) //生成随机数 func main() { rand.Seed(time.Now().UnixNano()) maxNum := 100 secretNum := rand.Intn(maxNum) fmt.Println("my secretNum is:%v",secretNum) }
go中通过
rand.Seed(种子值seedNum)
设置种子值,rand.Intn(n int64)
获取小于n的随机数。同一种子值下,对于相同的n,rand.Intn(n)
返回值相同。不同种子值,对于不同的n,rand.Intn(n)
返回值不同。所以采用系统时间的毫秒值作为种子值可以做到随机。 -
再来看一下输出
相对来说好很多
-
加入用户输入
package main import ( "bufio" "fmt" "math/rand" "os" "strconv" "strings" "time" ) //生成随机数 func randinit() int { rand.Seed(time.Now().UnixNano()) maxNum := 100 secretNum := rand.Intn(maxNum) // fmt.Println("my secretNum is:%v",secretNum) return secretNum } //用户输入 func main() { fmt.Println("请输入你的猜测:") reader := bufio.NewReader(os.Stdin) input, err := reader.ReadString('\n') if err !=nil{ fmt.Println("读取文件发生错误,请重试",err) return } input = strings.TrimSuffix(input,"\r\n") guess,err :=strconv.Atoi(input) if err != nil{ fmt.Println("非法输入,请输入数字",err) return } fmt.Println("你的猜测是:",guess) }
-
os.stdin
:指向用户输入的指针 -
bufio.NewReader
:带缓冲的快读,Go语言中如果标准输入的数据规模很大,使用fmt.Scan()
和fmt.Println()
函数读取数据和输出数据会非常慢,这个时候就需要借助于bufio包中的相关方法优化读取数据和输出数据的速度,可以使用bufio.NewReader()
,bufio.NewWriter()
,bufio.NewReader
读取一个io.reader
对象,返回一个io.reader
对象 -
readstring('\n')
;以'\n' 为一行,读取文件内容 -
strings.TrimSuffix(s,suffix string)
:返回没有提供的尾随后缀字符串的 s。如果 s 不以suffix 结尾,则s原样返回。 -
strconv.Atoi
:将字符串转换为数字 -
加入判断和循环
package main import ( "bufio" "fmt" "math/rand" "os" "strconv" "strings" "time" ) //生成随机数 func randinit() int { rand.Seed(time.Now().UnixNano()) maxNum := 100 secretNum := rand.Intn(maxNum) // fmt.Println("my secretNum is:",secretNum) return secretNum } //判断逻辑 func main(){ secretNum := randinit() fmt.Println("Dear Lee, this is a simple guessing game,you just need input a integer number between 0 and 100! have fun!\n") fmt.Println(":)\n") for{ fmt.Println("Please input your guess:") reader := bufio.NewReader(os.Stdin) input, err := reader.ReadString('\n') if err !=nil{ fmt.Println("some wrong happened in reading input,try again please!",err) continue } input = strings.TrimSuffix(input,"\r\n") guess,err :=strconv.Atoi(input) if err != nil{ fmt.Println("input is illegal,please input integer",err) continue } fmt.Println("your guess is:",guess) if guess > secretNum{ fmt.Println("your guess is BIGGER! try again!") }else if guess < secretNum{ fmt.Println("your guess is SMALLER! try again!") }else{ fmt.Println("correct!you performance is perfect!Dear Lee!!") continue } } }
编译运行就好啦