GO语言工程实践课后作业:实现思路、代码以及路径记录 | 豆包MarsCode AI刷题

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.NewReaderos.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 循环允许用户多次输入猜测,直到用户猜中正确的数字。
  • 实时反馈:若输入不正确,程序立即提示用户重新尝试;若输入正确,则程序退出循环并显示祝贺信息。
  • 完整性:该版本完成了游戏的全部功能,提供了良好的用户交互体验。

小结

经过五个版本的逐步改进,我们完成了一个交互式的猜数字游戏。每个版本都进行了合理的功能扩展和错误处理改进,使代码从简单的随机数生成,逐渐扩展为支持用户输入、反馈提示及循环猜测的完整应用。

相关推荐
Find1 个月前
MaxKB 集成langchain + Vue + PostgreSQL 的 本地大模型+本地知识库 构建私有大模型 | MarsCode AI刷题
青训营笔记
理tan王子1 个月前
伴学笔记 AI刷题 14.数组元素之和最小化 | 豆包MarsCode AI刷题
青训营笔记
理tan王子1 个月前
伴学笔记 AI刷题 25.DNA序列编辑距离 | 豆包MarsCode AI刷题
青训营笔记
理tan王子1 个月前
伴学笔记 AI刷题 9.超市里的货物架调整 | 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵1 个月前
分而治之,主题分片Partition | 豆包MarsCode AI刷题
青训营笔记
三六1 个月前
刷题漫漫路(二)| 豆包MarsCode AI刷题
青训营笔记
tabzzz1 个月前
突破Zustand的局限性:与React ContentAPI搭配使用
前端·青训营笔记
Serendipity5651 个月前
Go 语言入门指南——单元测试 | 豆包MarsCode AI刷题;
青训营笔记
wml1 个月前
前端实践-使用React实现简单代办事项列表 | 豆包MarsCode AI刷题
青训营笔记
用户44710308932421 个月前
详解前端框架中的设计模式 | 豆包MarsCode AI刷题
青训营笔记