文章目录
程序介绍
首先生成一个介于1~100之间的随机数,然后提示玩家输入数字,并告诉玩家是猜对了还是猜错了,如果对了程序就结束,如果错了就提醒玩家是大了还是小了,然后玩家继续输入。
设置随机数
maxNum := 100
rand.Seed(time.Now().UnixNano()) //修改随机数种子为当前时间戳
secretNumber := rand.Intn(maxNum)
rand.Seed(seed int64):播种seed为随机数种子func time.Now() time.Time:获取当前时间func (time.Time).UnixNano() int64:将Time转成时间戳返回func rand.Intn(n int) int:设置一个随机数,随机数的范围为[0, n)
读取用户输入
这里用的是高并发输入,可以用简单的Scan进行输入。
fmt.Print("Guess a number between 1 and", maxNum, ": ")
reader := bufio.NewReader(os.Stdin)
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occurred while reading input. Try again", err)
return
input = strings.TrimSuffix(input, "\r\n") //去掉input末尾的回车换行符
guess, err := strconv.Atoi(input) //将input转换为整数
if err != nil {
fmt.Print("Invalid input. Try again: ")
return
fmt.Print("Your guess is ", guess, ". ")
-
func (b *Reader) ReadString(delim byte) (string, error):ReadString一直在Reader* b中读取,直到读到delim,delim也会被读进去 -
reader := bufio.NewReader(os.Stdin):将reader与标准输入流Stdin关联func NewReader(rd io.Reader) *Reader:NewReader返回一个具有默认缓冲区大小新的Reader -
input, err := reader.ReadString('\n'):从reader中读取,遇到'\n'就停止,把包括'\n'在内的内容放到字符串input中,错误信息返回到err中func (b *Reader) ReadString(delim byte) (string, error):ReadString读取直到输入中第一次出现分隔符delim,返回一个字符串,其中包含delim之前的数据并包括delim。如果ReadString在找到分隔符之前遇到错误,它将返回在错误之前读取的数据和错误本身(通常是io.EOF)。 -
input = strings.TrimSuffix(input, "\n"):因为读入的时候把回车符\r和换行符\n也读进来了,所以这一步是去掉换行符。只保留input中换行符之前的内容,不包括换行符。当然也可以使用func TrimSuffix(s, suffix string) string:TrimSuffix返回s,不包含所提供的后缀字符串。如果s没有以后缀结尾,则返回不变的s。 -
guess, err := strconv.Atoi(input):将字符串input转成整型存给guessfunc Atoi(s string) (int, error):Atoi相当于转换为int类型的ParseInt(s, 10,0)
实现判断逻辑
if guess > secretNumber {
fmt.Print("Too Big! Try again: ")
} else if guess < secretNumber {
fmt.Print("Too Small! Try again: ")
} else {
fmt.Println("You got it!")
break
}
一个简单的if分支语句,没什么好说的。
实现游戏循环
fmt.Println("Guess a number between 1 and ", maxNum, ": ")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occurred while reading input. Try again", err)
continue
}
input = strings.TrimSuffix(input, "\r\n") //去掉input末尾的回车换行符
guess, err := strconv.Atoi(input) //将input转换为整数
if err != nil {
fmt.Print("Invalid input. Try again: ")
continue
}
fmt.Print("Your guess is ", guess, ". ")
if guess > secretNumber {
fmt.Print("Too Big! Try again: ")
} else if guess < secretNumber {
fmt.Print("Too Small! Try again: ")
} else {
fmt.Println("You got it!")
break
}
}
- 上面只完成了用户的一次猜测,用户输入往后的部分改成循环即可完成,猜对记得跳出循环。
- 当输入错误的时候不要直接返回了,可以改为
continue继续循环
完整代码
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.Print("Guess a number between 1 and ", maxNum, ": ")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occurred while reading input. Try again", err)
continue
}
input = strings.Trim(input, "\r\n") //去掉input末尾的换行符
guess, err := strconv.Atoi(input) //将input转换为整数
if err != nil {
fmt.Print("Invalid input. Try again: ")
continue
}
fmt.Print("Your guess is ", guess, ". ")
if guess > secretNumber {
fmt.Print("Too Big! Try again: ")
} else if guess < secretNumber {
fmt.Print("Too Small! Try again: ")
} else {
fmt.Println("You got it!")
break
}
}
}










