日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Go語言實現猜謎小游戲_Golang

作者:Java星辰 ? 更新時間: 2023-03-22 編程語言

前言

本文是介紹用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/stdinos.Stdinos包的一個變量。它是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難免有些錯誤與不足之處,如有發現歡迎指出。

原文鏈接:https://juejin.cn/post/7191469064588361785

欄目分類
最近更新