GO实现猜数字 | 青训营

91 阅读2分钟

GO实现猜数字 | 青训营

本次实现了猜数字这个内容,直接可以写出非常简单的代码

package main
​
import (
    "fmt"
    "math/rand"
)
​
func main() {
    maxNum := 100                             // 生成随机数的最大范围
    secretNumber := rand.Intn(maxNum)         
    fmt.Println("The secret number is", secretNumber) 
}
​

但是视频里说这样每次生成的结果是一样的:“文档的开头的例子告诉我们使用它之前需要设置随机数种子,否则的话每一次都会生成相同的随机数序列。一般惯例用法是在程序启动的时候,用启动的时间戳来初始化随机数种子”,不过在实际运行的时候,我发现并不是这样,可能是版本不一致,也可能是编译器的问题,现在就已经是每次都生成随机数了。

不管怎样还是先加上种子吧

package main
​
import (
    "fmt"
    "math/rand"
    "time"
)
​
func main() {
    maxNum := 100 // 生成随机数的最大范围
​
    rand.Seed(time.Now().UnixNano())   // 使用当前时间作为随机数生成的种子
    secretNumber := rand.Intn(maxNum)  // 生成随机数
    fmt.Println("The secret number is", secretNumber) // 显示
}
​

但是为了程序更可用,也能有一些交互性,所以对代码进行修改

我们先加上读入用户输入

package main
​
import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "strings"
    "time"
)
​
func main() {
    maxNum := 100 // 生成随机数的最大范围
    rand.Seed(time.Now().UnixNano()) // 使用当前时间作为随机数生成的种子
    secretNumber := rand.Intn(maxNum) // 生成随机数作为秘密数字
​
    fmt.Println("The secret number is", secretNumber) // 显示秘密数字
    fmt.Println("Please input your guess") // 提示用户输入猜测的数字
​
    reader := bufio.NewReader(os.Stdin)
    input, err := reader.ReadString('\n') // 读取用户输入的字符串
    if err != nil {
        fmt.Println("An error occurred while reading input. Please try again", err)
        return
    }
​
    input = strings.TrimSuffix(input, "\n") // 移除换行符
​
    guess, err := strconv.Atoi(input) // 将输入的字符串转换为整数
    if err != nil {
        fmt.Println("Invalid input. Please enter an integer value")
        return
    }
​
    fmt.Println("Your guess is", guess) // 显示用户猜测的数字
}
​

但是这样只能猜一次,而且只有显示,下面加上判断

package main
​
import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "strings"
    "time"
)
​
func main() {
    maxNum := 100 // 生成随机数的最大范围
    rand.Seed(time.Now().UnixNano()) // 使用当前时间作为随机数生成的种子
    secretNumber := rand.Intn(maxNum) // 生成随机数作为秘密数字
​
    fmt.Println("The secret number is", secretNumber) // 显示秘密数字
    fmt.Println("Please input your guess") // 提示用户输入猜测的数字
​
    reader := bufio.NewReader(os.Stdin)
    input, err := reader.ReadString('\n') // 读取用户输入的字符串
    if err != nil {
        fmt.Println("An error occurred while reading input. Please try again", err)
        return
    }
​
    input = strings.TrimSuffix(input, "\n") // 移除换行符
​
    guess, err := strconv.Atoi(input) // 将输入的字符串转换为整数
    if err != nil {
        fmt.Println("Invalid input. Please enter an integer value")
        return
    }
​
    fmt.Println("Your guess is", guess) // 显示用户猜测的数字if guess > secretNumber {
        fmt.Println("Your guess is bigger than the secret number. Please try again")
    } else if guess < secretNumber {
        fmt.Println("Your guess is smaller than the secret number. Please try again")
    } else {
        fmt.Println("Correct, you are a Legend!")
    }
}
​

但是只能猜一次还是不行的,我们加入循环

package main
​
import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "strings"
)
​
func main() {
    maxNum := 100                    // 最大范围
    secretNumber := rand.Intn(maxNum) // 生成随机数for {
        fmt.Println("Plase input your number") 
        reader := bufio.NewReader(os.Stdin)
        input, err := reader.ReadString('\n') // 读取用户输入的字符串
        if err != nil {
            fmt.Println("an err show", err) 
            continue
        }
        input = strings.TrimSuffix(input, "\r\n") // 移除换行符
​
        guess, err := strconv.Atoi(input) // 将输入的字符串转换为整数
        if err != nil {
            fmt.Println("an err show", err) 
            continue
        }
        fmt.Println("Your number is", guess)
​
        if guess > secretNumber {
            fmt.Println("Too big") // 提示数字过大
        } else if guess < secretNumber {
            fmt.Println("Too small") // 提示数字过小
        } else {
            fmt.Println("You are right!") // 用户猜测正确,游戏结束
            break
        }
    }
}
​

这样就大功告成了