【GO】go语言入门实战 —— 猜数字游戏

程序介绍

首先生成一个介于1~100之间的随机数,然后提示玩家输入数字,并告诉玩家是猜对了还是猜错了,如果对了程序就结束,如果错了就提醒玩家是大了还是小了,然后玩家继续输入。

设置随机数

maxNum := 100
rand.Seed(time.Now().UnixNano())  //修改随机数种子为当前时间戳
secretNumber := rand.Intn(maxNum)
  1. rand.Seed(seed int64):播种seed为随机数种子
  2. func time.Now() time.Time:获取当前时间
  3. func (time.Time).UnixNano() int64:将Time转成时间戳返回
  4. 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, ". ")
  1. func (b *Reader) ReadString(delim byte) (string, error)ReadString一直在Reader* b中读取,直到读到delimdelim也会被读进去

  2. reader := bufio.NewReader(os.Stdin):将reader与标准输入流Stdin关联

    func NewReader(rd io.Reader) *ReaderNewReader返回一个具有默认缓冲区大小新的Reader

  3. 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)。

  4. input = strings.TrimSuffix(input, "\n"):因为读入的时候把回车符\r和换行符\n也读进来了,所以这一步是去掉换行符。只保留input中换行符之前的内容,不包括换行符。当然也可以使用

    func TrimSuffix(s, suffix string) stringTrimSuffix返回s,不包含所提供的后缀字符串。如果s没有以后缀结尾,则返回不变的s

  5. guess, err := strconv.Atoi(input):将字符串input转成整型存给guess

    func 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
    }
}
  1. 上面只完成了用户的一次猜测,用户输入往后的部分改成循环即可完成,猜对记得跳出循环。
  2. 当输入错误的时候不要直接返回了,可以改为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
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LeePlace

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值