GO实战笔记猜数字小游戏 | 青训营笔记

27 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

猜数字游戏

  • 首先实现随机数生成服务

    package main
    
    import(
            "fmt"
            "math/rand"
    )
    
    //生成随机数
    func main() {
            maxNum := 100
            secretNum := rand.Intn(maxNum)
            fmt.Println("my secretNum is:%v",secretNum)
    }
    
  • 运行结果 image.png

    看似比较合理但是...

    image.png

    每次输出结果固定,是伪随机的

  • 优化

    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)返回值不同。所以采用系统时间的毫秒值作为种子值可以做到随机。

  • 再来看一下输出

    image.png

    相对来说好很多

  • 加入用户输入

    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
                    }
    
    
            }
    
    }
    

    编译运行就好啦