GO语言实战案例(一)
guessing-game
设计并实现一个"猜数字"游戏,用户需要猜测一个预先生成的随机数。通过五个版本的代码迭代,我们不断优化代码结构和功能,最终实现了一个完整的猜数字游戏。以下是每个版本的思路和实现路径。
版本1:基本随机数生成
在第一个版本中,主要目标是生成一个随机数。代码如下:
go
package main
import (
"fmt"
"math/rand"
)
func main() {
maxNum := 100
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
}
- 功能 :生成一个 0 到
maxNum
(100) 之间的随机整数secretNumber
,并直接打印出来。 - 要点 :
rand.Intn(maxNum)
用于生成随机数,但此版本的代码并没有让用户输入猜测,仅是显示随机数,作为测试随机数生成功能的基础。
版本2:添加种子以增强随机性
在第二个版本中,为使每次运行程序产生不同的随机数,加入了随机种子:
go
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)
}
- 改进 :通过
rand.Seed(time.Now().UnixNano())
使用当前时间戳设定随机数种子,保证每次运行程序生成不同的随机数。 - 目的:为之后的游戏功能提供更加真实的随机效果。
版本3:接受用户输入
第三个版本中,我们加入了用户输入功能,使用户能够输入自己的猜测:
go
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.Trim(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
return
}
fmt.Println("You guess is", guess)
}
- 功能更新 :程序通过
bufio.NewReader
和os.Stdin
接收用户输入,并将其转换为整数。 - 错误处理:若输入无法转换为整数,提示用户输入有效的整数。
- 局限性:目前,程序仅显示用户的输入,没有进一步与生成的随机数进行比较。
版本4:增加猜测反馈
在第四个版本中,代码增加了与随机数的比较逻辑,并根据用户的猜测输出相应的反馈信息:
go
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.Trim(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
return
}
fmt.Println("You 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 Legend!")
}
}
- 新增功能:根据用户猜测的大小提供反馈(高于、低于或等于秘密数字)。
- 提示用户:给予玩家更明确的游戏目标,帮助其逐步接近正确答案。
- 限制:该版本仅允许用户进行一次猜测,无论结果如何,游戏便结束。
版本5:增加循环以支持多次猜测
最终版本在代码结构上进一步改进,使用户可以在猜中之前反复尝试猜测:
go
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("Please input your guess")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occurred while reading input. Please try again", err)
continue
}
input = strings.Trim(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("You 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 Legend!")
break
}
}
}
- 循环逻辑 :通过
for
循环允许用户多次输入猜测,直到用户猜中正确的数字。 - 实时反馈:若输入不正确,程序立即提示用户重新尝试;若输入正确,则程序退出循环并显示祝贺信息。
- 完整性:该版本完成了游戏的全部功能,提供了良好的用户交互体验。
小结
经过五个版本的逐步改进,我们完成了一个交互式的猜数字游戏。每个版本都进行了合理的功能扩展和错误处理改进,使代码从简单的随机数生成,逐渐扩展为支持用户输入、反馈提示及循环猜测的完整应用。