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

你可能感兴趣的:(golang,游戏,python)