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
}
}
}
这样就大功告成了