Go语言实战案例丨青训营

127 阅读3分钟

本篇文章主要梳理Go语言的实战案例————猜数游戏

猜数游戏

本次猜谜游戏是一个简单的命令行游戏,玩家需要猜测计算机生成的秘密数字,直到猜对为止。

功能介绍:

  1. 游戏生成一个在 1 到 100 范围内的随机整数作为随机数字。
  2. 提示玩家输入猜测的数字,并将输入解析成整数。
  3. 比较玩家的猜测和秘密数字,根据比较结果给出相应的提示,让玩家继续猜测。
  4. 当玩家猜对秘密数字时,打印胜利的提示,游戏结束。

1. 随机数生成

在 Go 语言中使用 import 来导入所需的包,比如 fmtmath/randos 等。

// 包声明,表示这是一个可执行程序的入口文件
package main

// 导包
// fmt 包:提供了格式化输入输出功能
// math/rand 包:用于生成随机数
import (
	"fmt"
	"math/rand"
)

// 程序的入口函数
func main() {
    // 声明了一个整数变量 maxNum,并将其初始化为 100,表示猜测的数字在 1 到 100 之间
	maxNum := 100
    
    // 声明了一个整数变量 secretNumber,创建了一个随机数字
	secretNumber := rand.Intn(maxNum)
    
    // 打印随机数字
	fmt.Println("The secret number is ", secretNumber)
}

rand.Intn(n) 是 math/rand 包中的函数,用于生成一个大于等于 0 且小于 n 的随机整数。

从以上代码的运行结果得到的随机数都是一样的,不符合题目的要求

2. 随机数生成V2

使用 time.Now().UnixNano() 作为种子来初始化随机数生成器。
这样就能确保每次运行程序时,都会生成不同的随机数序列,从而得到不同的随机数。

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

3. 读取用户输入


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 occured 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)
}
  • reader := bufio.NewReader(os.Stdin)
    bufio是Go标准库中的一个包,提供了缓冲读写功能。
    os.Stdin是Go标准库中的一个变量,表示标准输入流。它是程序默认的输入来源,通常是键盘输入。

  • input, err := reader.ReadString('\n')
    从一个名为reader的输入流中读取数据,直到遇到换行符('\n')为止。读取的内容被赋值给input变量,而err变量则用于捕获可能发生的错误。

  • input = strings.Trim(input, "\r\n")
    将输入中的结尾换行符 \r\n 去掉,以便后续处理。

  • guess, err := strconv.Atoi(input)
    将字符串 input 转换成整数类型。如果转换失败(即用户输入的不是一个有效的整数),我们会打印错误信息并退出。

**运行结果 **

$ go run guessing-game/v3/main.go
The secret number is 58
Please input your guess
5
You guess is 5

4. 实现逻辑判断

这部分实现游戏逻辑判断,比较玩家输入的数字和秘密的数字,并且给出提示 // ...(前面部分省略)

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. 实现游戏循环

这部分添加了一个循环,使得游戏可以循环进行,直到玩家猜出秘密数字为止


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)
	for {
		input, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("An error occured 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
		}
	}
}

至此猜数游戏便可以正常运行。