Go語言實現(xiàn)猜謎小游戲
前言
本文是介紹用Go實現(xiàn)一個猜謎小游戲,就是程序先生成一個隨機數(shù)num,然后讓用戶來猜生成的數(shù)是多少,如果猜的數(shù)比num小就提示用戶猜測的數(shù)據(jù)小于num,如果猜的數(shù)比num大就提示用戶測試的數(shù)據(jù)大于num,如果猜測的數(shù)據(jù)剛好是num就提示用戶猜對了。
技術點
在本文中將會使用到以下技術點:隨機數(shù)、隨機數(shù)種子、獲取當前時間戳、兩種讀取終端輸入方式等。
隨機數(shù)
Go生成隨機數(shù)需要引入math/rand包,Intn(n int)函數(shù)可以生成一個0~n的非負隨機整數(shù)數(shù),包含0不包含n也就是[0,n)。
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Intn(100))
}
經過多次運行,我們發(fā)現(xiàn)產生的數(shù)并不是隨機的,每次都一樣。

隨機數(shù)種子
Go中的隨機數(shù)是通過rand.Seed(種子值seedNum)設置種子值,在同一個種子下每次產生的隨機數(shù)順序是一樣的。
為了保證種子值的隨機性,一般采用系統(tǒng)時間的毫秒值作為種子值,因為系統(tǒng)時間的毫秒值是一直變動的。
time.Now().UnixMilli()可以系統(tǒng)當前的毫秒時間戳。
time.Now().Unix()可以系統(tǒng)當前的秒時間戳。
time.Now().UnixMicro()可以系統(tǒng)當前的微秒時間戳。
time.Now().UnixNano()可以系統(tǒng)當前的納秒時間戳。
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Println(rand.Intn(100))
}
再次運行代碼,可以發(fā)現(xiàn)每次運行的隨機數(shù)都是不同的了。

接收用戶輸入
Reader
os.Stdin指向標準輸入文件/dev/stdin,os.Stdin是os包的一個變量。它是os包的NewFile函數(shù)的返回值。
bufio包中都是IO操作的方法,創(chuàng)建Reader對象,就可以讀取數(shù)據(jù)了。
reader := bufio.NewReader(os.Stdin)
設置按行讀?。?/p>
input, err := reader.ReadString('\n')
按行讀取得到的結果是包含換行符的,要把換行符給截取去掉:
input = strings.Trim(input, "\r\n")
再把得到的字符串轉換為數(shù)字:
guess, err := strconv.Atoi(input)
Scanf
Scanf函數(shù)也可以從os.Stdin中讀取數(shù)據(jù)。
var guess int
fmt.Scanf("%d", &guess)
fmt.Println(guess)
完整代碼
因為用戶不一定一次就猜中數(shù)據(jù),我們可以使用for循環(huán),當用戶猜不中時,可以讓用戶再繼續(xù)猜直到猜中。
下面來看下完整的代碼。
使用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語言來實現(xiàn)類一個猜字小游戲,在文中介紹了隨機數(shù)、隨機數(shù)種子以及如何從終端讀取數(shù)據(jù)的兩種方法。
對比從終端獲取用戶輸入的兩種方法,我們可以看到使用Scanf比使用bufio中的Reader方便了很多,大大簡化了代碼。
剛剛接觸Go難免有些錯誤與不足之處,如有發(fā)現(xiàn)歡迎指出。
以上就是Go語言實現(xiàn)猜謎小游戲的詳細內容,更多關于Go實現(xiàn)猜謎小游戲的資料請關注腳本之家其它相關文章!
相關文章
Golang使用Gin創(chuàng)建Restful API的實現(xiàn)
本文主要介紹了Golang使用Gin創(chuàng)建Restful API的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01

