Go语言工程实践 | 豆包MarsCode AI刷题

95 阅读3分钟

猜字游戏

作为GO语言的第一个小项目,猜字游戏是个不错的选择。
我们首先将该程序的必要代码写出。
如下,我们首先要实现生成一个0~100的随机数
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)
}

我们利用Go的库函数”math/rand“,”time“
首先介绍‘math/rand’
如同其他语言类似,这是一个包括生成随机数函数的库
maxNum := 100
rand.Seed(time.Now().UnixNano()) \\设置种子
rand.Intn(maxNum) \\定义范围
我们可以利用上述语句去进行生成0~100的随机数
在本地的VS code时,你可能会发现不去设置种子,而是直接尝试使用 rand.Intn 去生成也是可以成功运行
这是因为,在不去指定种子时,编译器会自动使用系统时间去作为种子,虽然可以运行,但是并不安全
如果设置一个固定的种子,那么每次运行便会生成一个固定的随机数

image.png

这里我们可以看见如果将种子设置为固定100,那么每次运行便生成固定随机数。
接下来,我们继续改进代码完成度

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

  • input, err := reader.ReadString('\n'):使用 ReadString 方法读取用户输入的一行文本,直到遇到换行符为止。这个方法返回读取的字符串和可能发生的错误。

  • if err!= nil {... }:检查是否在读取输入时发生了错误,如果有错误,打印错误信息并使用 return 语句提前结束函数的执行。

  • input = strings.Trim(input, "\r\n"):使用 strings.Trim 函数去除输入字符串两端的换行符和回车符。

  • guess, err := strconv.Atoi(input):使用 strconv.Atoi 函数将输入的字符串转换为整数,并将其赋值给 guess

  • if err!= nil {... }:检查是否在转换字符串为整数时发生了错误,如果有错误,打印错误信息并使用 return 语句提前结束函数的执行。

    如下
    
package main

import (
	"fmt"
	"math/rand"
	"bufio"
	"os"
	"strings"
	"strconv"
	"time"
	
)

func main() {
	maxNum := 100
	rand.Seed(100)
	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)
	
}
 

如上,我们可以进行到一个80%的完成度代码
接下来,我们进行正确判断


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

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

    如上,便是我们的第一个小项目,猜字游戏
    
    
    

IMG_20220922_150833.jpg

谢谢!