在学习go语言中,接触到了第一个小项目,猜数游戏。这个项目可以让我们更好的运用go语言,思路和其他语言差不多,具体要注意的是语法问题。go语言和其他语言的语法都不相同,它比其他语言简单且容易上手。
以下是猜数字游戏的具体思路:
-
初始化游戏:
- 设定一个数字范围(在这个例子中,范围是0到99,因为
rand.Intn(100)生成的是0到99之间的随机整数)。 - 使用当前时间的纳秒数作为种子来初始化随机数生成器,以确保每次运行游戏时生成的秘密数字都不同。
- 生成一个秘密数字作为玩家需要猜测的目标。
- 设定一个数字范围(在这个例子中,范围是0到99,因为
-
用户交互:
- 提示玩家输入他们的猜测。
- 使用标准输入读取玩家的输入。
- 检查输入是否为有效的整数。如果不是,提示玩家重新输入。
-
处理猜测:
- 将玩家的猜测与秘密数字进行比较。
- 如果猜测大于秘密数字,提示玩家他们的猜测太大了。
- 如果猜测小于秘密数字,提示玩家他们的猜测太小了。
- 如果猜测等于秘密数字,打印出胜利信息,并结束游戏循环。
-
循环直到胜利:
- 使用一个无限循环来重复上述步骤,直到玩家猜中秘密数字。
-
结束游戏:
- 当玩家猜中秘密数字时,打印出胜利信息,并退出循环,从而结束游戏。
当然上述内容页可以总结为一个简单的流程:
-
初始化游戏(设置范围,生成秘密数字)
-
提示玩家输入猜测
-
读取玩家输入
-
验证输入是否为整数
- 是:继续下一步
- 否:提示重新输入,并回到步骤3
-
比较猜测与秘密数字
- 等于:打印胜利信息,结束游戏
- 不等于:继续下一步
-
提示玩家猜测太大或太小
-
回到步骤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
}
}
}
下面是代码的逐行解释:
-
package main:定义了一个名为main的包,这是每个可执行Go程序的入口点。 -
导入必要的包:
"bufio":用于缓冲读写。"fmt":格式化I/O。"math/rand":生成伪随机数。"os":提供了与操作系统交互的功能。"strconv":实现了基本数据类型与字符串之间的转换。"strings":实现了字符串操作的函数。"time":提供了时间相关的函数。
-
func main() {:定义了程序的入口函数main。 -
maxNum := 100:定义了一个变量maxNum,并将其初始化为100。这是随机数生成的上限。 -
rand.Seed(time.Now().UnixNano()):使用当前时间的纳秒数作为随机数生成器的种子。这确保了每次运行程序时生成的随机数都是不同的。 -
secretNumber := rand.Intn(maxNum):生成一个0到maxNum-1(即0到99)之间的随机整数,并将其赋值给secretNumber。这是玩家需要猜测的秘密数字。 -
注释掉的
fmt.Println("The secret number is ", secretNumber):如果取消注释,这行代码将在控制台打印出秘密数字,但在游戏中通常不这样做,以保持游戏的神秘感。 -
fmt.Println("Please input your guess"):向玩家显示提示信息,要求输入猜测的数字。 -
reader := bufio.NewReader(os.Stdin):创建一个新的bufio.Reader,用于从标准输入(通常是键盘)读取数据。 -
for {:开始一个无限循环,直到玩家猜中数字。 -
input, err := reader.ReadString('\n'):从标准输入读取一行数据,直到遇到换行符\n。input是读取的字符串,err是可能发生的错误。 -
错误处理:如果读取输入时发生错误,打印错误信息并继续循环。
-
input = strings.Trim(input, "\r\n"):使用strings.Trim函数移除输入字符串两端的换行符\r\n(Windows系统)或\n(Unix/Linux系统)。 -
guess, err := strconv.Atoi(input):尝试将输入的字符串转换为整数。guess是转换后的整数,err是可能发生的错误。 -
错误处理:如果转换失败(即输入不是有效的整数),打印错误信息并继续循环。
-
fmt.Println("You guess is", guess):打印出玩家的猜测。 -
使用
if-else if-else结构比较guess和secretNumber:- 如果
guess大于secretNumber,提示玩家猜大了。 - 如果
guess小于secretNumber,提示玩家猜小了。 - 如果
guess等于secretNumber,打印出胜利信息并跳出循环。
- 如果
-
}:结束for循环。 -
}:结束main函数。
总之,这个程序通过生成一个随机数并让玩家猜测,直到猜中为止,期间提供反馈以帮助玩家调整猜测。
总之上述内容是关于用go语言编写猜数小游戏的思路和代码解释,思路很简单,语法和之前学的c语言Java以及python语法差不多,只是有一些表达方式不一样,很容易弄混,需要自己注意区分。