用go语言实现猜数游戏 | 豆包MarsCode AI刷题

177 阅读5分钟

在学习go语言中,接触到了第一个小项目,猜数游戏。这个项目可以让我们更好的运用go语言,思路和其他语言差不多,具体要注意的是语法问题。go语言和其他语言的语法都不相同,它比其他语言简单且容易上手。

以下是猜数字游戏的具体思路:

  1. 初始化游戏

    • 设定一个数字范围(在这个例子中,范围是0到99,因为rand.Intn(100)生成的是0到99之间的随机整数)。
    • 使用当前时间的纳秒数作为种子来初始化随机数生成器,以确保每次运行游戏时生成的秘密数字都不同。
    • 生成一个秘密数字作为玩家需要猜测的目标。
  2. 用户交互

    • 提示玩家输入他们的猜测。
    • 使用标准输入读取玩家的输入。
    • 检查输入是否为有效的整数。如果不是,提示玩家重新输入。
  3. 处理猜测

    • 将玩家的猜测与秘密数字进行比较。
    • 如果猜测大于秘密数字,提示玩家他们的猜测太大了。
    • 如果猜测小于秘密数字,提示玩家他们的猜测太小了。
    • 如果猜测等于秘密数字,打印出胜利信息,并结束游戏循环。
  4. 循环直到胜利

    • 使用一个无限循环来重复上述步骤,直到玩家猜中秘密数字。
  5. 结束游戏

    • 当玩家猜中秘密数字时,打印出胜利信息,并退出循环,从而结束游戏。

当然上述内容页可以总结为一个简单的流程:

  1. 初始化游戏(设置范围,生成秘密数字)

  2. 提示玩家输入猜测

  3. 读取玩家输入

  4. 验证输入是否为整数

    • 是:继续下一步
    • 否:提示重新输入,并回到步骤3
  5. 比较猜测与秘密数字

    • 等于:打印胜利信息,结束游戏
    • 不等于:继续下一步
  6. 提示玩家猜测太大或太小

  7. 回到步骤2,继续游戏循环

这个流程确保了游戏能够正确地运行,直到玩家成功猜中秘密数字为止。

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

下面是代码的逐行解释:

  1. package main:定义了一个名为main的包,这是每个可执行Go程序的入口点。

  2. 导入必要的包:

    • "bufio":用于缓冲读写。
    • "fmt":格式化I/O。
    • "math/rand":生成伪随机数。
    • "os":提供了与操作系统交互的功能。
    • "strconv":实现了基本数据类型与字符串之间的转换。
    • "strings":实现了字符串操作的函数。
    • "time":提供了时间相关的函数。
  3. func main() {:定义了程序的入口函数main

  4. maxNum := 100:定义了一个变量maxNum,并将其初始化为100。这是随机数生成的上限。

  5. rand.Seed(time.Now().UnixNano()):使用当前时间的纳秒数作为随机数生成器的种子。这确保了每次运行程序时生成的随机数都是不同的。

  6. secretNumber := rand.Intn(maxNum):生成一个0到maxNum-1(即0到99)之间的随机整数,并将其赋值给secretNumber。这是玩家需要猜测的秘密数字。

  7. 注释掉的fmt.Println("The secret number is ", secretNumber):如果取消注释,这行代码将在控制台打印出秘密数字,但在游戏中通常不这样做,以保持游戏的神秘感。

  8. fmt.Println("Please input your guess"):向玩家显示提示信息,要求输入猜测的数字。

  9. reader := bufio.NewReader(os.Stdin):创建一个新的bufio.Reader,用于从标准输入(通常是键盘)读取数据。

  10. for {:开始一个无限循环,直到玩家猜中数字。

  11. input, err := reader.ReadString('\n'):从标准输入读取一行数据,直到遇到换行符\ninput是读取的字符串,err是可能发生的错误。

  12. 错误处理:如果读取输入时发生错误,打印错误信息并继续循环。

  13. input = strings.Trim(input, "\r\n"):使用strings.Trim函数移除输入字符串两端的换行符\r\n(Windows系统)或\n(Unix/Linux系统)。

  14. guess, err := strconv.Atoi(input):尝试将输入的字符串转换为整数。guess是转换后的整数,err是可能发生的错误。

  15. 错误处理:如果转换失败(即输入不是有效的整数),打印错误信息并继续循环。

  16. fmt.Println("You guess is", guess):打印出玩家的猜测。

  17. 使用if-else if-else结构比较guesssecretNumber

    • 如果guess大于secretNumber,提示玩家猜大了。
    • 如果guess小于secretNumber,提示玩家猜小了。
    • 如果guess等于secretNumber,打印出胜利信息并跳出循环。
  18. }:结束for循环。

  19. }:结束main函数。

总之,这个程序通过生成一个随机数并让玩家猜测,直到猜中为止,期间提供反馈以帮助玩家调整猜测。

总之上述内容是关于用go语言编写猜数小游戏的思路和代码解释,思路很简单,语法和之前学的c语言Java以及python语法差不多,只是有一些表达方式不一样,很容易弄混,需要自己注意区分。