这是我参与「第五届青训营 」伴学笔记创造活动的第 2 天
前语
本文是介绍用Go完成一个猜谜小游戏,便是程序先生成一个随机数num
,然后让用户来猜生成的数是多少,假如猜的数比num
小就提示用户猜测的数据小于num
,假如猜的数比num
大就提示用户测验的数据大于num
,假如猜测的数据刚好是num
就提示用户猜对了。
技能点
在本文中将会运用到以下技能点:随机数、随机数种子、获取当时时刻戳、两种读取终端输入办法等。
随机数
Go
生成随机数需求引入math/rand
包,Intn(n int)
函数能够生成一个0~n
的非负随机整数数,包括0
不包括n
也便是[0,n)
。
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Intn(100))
}
通过屡次运转,咱们发现发生的数并不是随机的,每次都相同。
随机数种子
Go
中的随机数是通过rand.Seed
(种子值seedNum
)设置种子值,在同一个种子下每次发生的随机数顺序是相同的。
为了保证种子值的随机性,一般采用体系时刻的毫秒值作为种子值,由于体系时刻的毫秒值是一向变动的。
time.Now().UnixMilli()
能够体系当时的毫秒时刻戳。
time.Now().Unix()
能够体系当时的秒时刻戳。
time.Now().UnixMicro()
能够体系当时的微秒时刻戳。
time.Now().UnixNano()
能够体系当时的纳秒时刻戳。
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Println(rand.Intn(100))
}
再次运转代码,能够发现每次运转的随机数都是不同的了。
接纳用户输入
Reader
os.Stdin
指向标准输入文件/dev/stdin
,os.Stdin
是os
包的一个变量。它是os
包的NewFile
函数的返回值。
bufio
包中都是IO
操作的办法,创立Reader
对象,就能够读取数据了。
reader := bufio.NewReader(os.Stdin)
设置按行读取:
input, err := reader.ReadString('\n')
按行读取得到的结果是包括换行符的,要把换行符给截取去掉:
input = strings.Trim(input, "\r\n")
再把得到的字符串转换为数字:
guess, err := strconv.Atoi(input)
Scanf
Scanf
函数也能够从os.Stdin
中读取数据。
var guess int
fmt.Scanf("%d", &guess)
fmt.Println(guess)
完好代码
由于用户不一定一次就猜中数据,咱们能够运用for
循环,当用户猜不中时,能够让用户再继续猜直到猜中。
下面来看下完好的代码。
运用Reader
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
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
}
}
}
运用Scanf
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano())
secretNumber := rand.Intn(maxNum)
fmt.Println("Please input your guess")
var guess int
for {
fmt.Scanf("%d", &guess)
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
}
}
}
来运转一下代码看下最终效果:
总结
本文介绍了运用Go
言语来完成类一个猜字小游戏,在文中介绍了随机数、随机数种子以及怎么从终端读取数据的两种办法。
对比从终端获取用户输入的两种办法,咱们能够看到运用Scanf
比运用bufio
中的Reader方便了很多,大大简化了代码。
刚刚触摸Go难免有些错误与不足之处,如有发现欢迎指出。
引用
字节内部课-Go 言语的实战事例