此为历史版本和 IPFS 入口查阅区,回到作品页
YingYun
IPFS 指纹 这是什么

作品指纹

猜數字遊戲邏輯範例|GO學習筆記

YingYun
·
·
這次學習的範例是一個簡單的遊戲,在一定的理解和實作後,在這個範例中,我對於GO有更多的了解,因此寫一篇學習紀錄。

基本邏輯

先來討論如何實現一個簡單的遊戲,我會分三個部分來實作,首先是生成隨機數,在猜謎遊戲中,先生成隨機的數字來當作題目,再來程式需要一個讀取用戶輸入的功能,有了以上兩組數據後就可以設計邏輯判斷來進行遊戲。

數字生成

package main

import(
    "fmt"
    "math/rand" 
    "time" 
)

func main(){
    maxNum := 100 
    rand.Seed(time.Now().UnixNano()) 
    secretNumber := rand.Intn(maxNum) 
    fmt.Println("The secret number is ", secretNumber) 
}
  • maxNum := 100:定義了一個整數變數 maxNum 並將其初始化為 100,這將作為隨機數的上限。

  • rand.Seed(time.Now().UnixNano()):用當前時間的納秒級別作為種子,這樣每次執行程式時都會產生不同的隨機數。

  • secretNumber := rand.Intn(maxNum):生成一個隨機數,範圍從0(包括)到 maxNum(不包括)。

  • fmt.Println("The secret number is ", secretNumber)輸出隨機生成的秘密數字,這在測試時很有用,但在實際遊戲中應該被刪除,以免玩家看到答案。

Tips: 在測試時,僅僅導入"math/rand"是沒有辦法順利生成隨機數的,輸出結果會重複,因此導入"time" 來使隨機數初始化

資訊讀取

程式碼要求用戶輸入一個數字,然後將輸入轉換為整數並顯示出來。如果輸入的內容不是合法的整數,或者在讀取輸入時出現了錯誤,程式將顯示相應的錯誤信息。

package main

import(
    "bufio"
    "os"
    "strconv"
    "strings"
)

func main(){
    fmt.Println("Please input your guess") 
   
    reader := bufio.NewReader(os.Stdin) 
    input, err := reader.ReadString('\n') 
    if err != nil{
        fmt.Println("An error occured while reading input. Please try again", err)
        return
    }
    input = strings.TrimSuffix(input, "\n") 
    
    guss, err := strconv.Atoi(input) 
    if err != nil{
        fmt.Println("Invalid input. Please enter an integer value")
        return
    }
    fmt.Println("You guess is ", guess) 
}

  • import 部分:引入了所需的包,這些包包括 bufio 用於讀取標準輸入、os 用於標準輸入輸出、strconv 用於字符串和數字之間的轉換、strings 用於操作字符串。

  • func main():主函數,程式的入口。

  • fmt.Println("Please input your guess"):這行程式碼輸出 "Please input your guess",提示用戶輸入數字。

  • reader := bufio.NewReader(os.Stdin):在這裡,我們創建一個新的讀取器 reader,並將其連接到標準輸入流 os.Stdin 上。這將用於讀取玩家輸入的數字。

  • input, err := reader.ReadString('\n'):在這裡,我們使用 reader.ReadString('\n') 來讀取玩家輸入的一行文字。當玩家輸入數字並按下 Enter 鍵時,這一行程式碼將把玩家輸入的內容讀取並存儲在 input 變數中。同時,它也檢查是否發生了錯誤,並將錯誤存儲在 err 變數中。

  • if err != nil:這裡使用 if 條件判斷來檢查是否發生了錯誤。如果 err 不為空,表示讀取輸入時出現了錯誤。

  • fmt.Println("An error occured while reading input. Please try again", err):如果讀取輸入時出現了錯誤,這一行程式碼將輸出 "An error occurred while reading input. Please try again" 並顯示相應的錯誤信息 err

  • return:如果發生錯誤,這個 return 語句將結束程式的執行,防止後續代碼執行。

  • input = strings.TrimSuffix(input, "\n"):這一行程式碼使用 strings.TrimSuffix() 函數去除 input 中的換行符 '\n'。玩家輸入的內容從讀取器讀取時通常會包含換行符,這會干擾後續處理,所以這裡需要將其去除。

  • guss, err := strconv.Atoi(input):這一行程式碼用於將純數字字符串 input 轉換為整數 guessstrconv.Atoi()strconv 包中的一個函數,它用於將字符串轉換為整數。這裡,我們將去除換行符的 input 字符串轉換為 guess 整數變數,同時處理可能出現的錯誤,如果轉換失敗,err 變數將包含錯誤信息。

  • if err != nil:這裡再次使用 if 條件判斷來檢查是否發生了錯誤。如果 err 不為空,表示轉換數字時出現了錯誤。

  • fmt.Println("Invalid input. Please enter an integer value"):如果轉換數字時出現了錯誤,這一行程式碼將輸出 "Invalid input. Please enter an integer value",提示用戶輸入的數字不是合法的整數。fmt.Println("You guess is ", guess):這一行程式碼用於輸出玩家猜測的數字 guess

判斷

上面已經將範例完成得差不多了,基本功能具備後,這個遊戲並不是很複雜,主要是比對資訊是否正確,根據玩家猜測的數字和秘密數字之間的大小關係,提供相應的提示信息,引導玩家進行下一步猜測,直到猜對為止。這是猜數字遊戲的核心邏輯部分。

func main(){
    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 smalller than the secret number. Please try again")
    } else {
        fmt.Println("Correct, you Legend!") 
    }
}
  • if guess > secretNumber:這是一個 if 條件判斷,用於比較玩家猜測的數字 guess 和秘密數字 secretNumber 的大小。如果 guess 大於 secretNumber,則執行接下來的程式塊。

  • fmt.Println("Your guess is bigger than the secret number. Please try again"):如果 guess 大於 secretNumber,這一行程式碼將輸出 "Your guess is bigger than the secret number. Please try again",提示玩家猜測的數字太大了,需要再次猜測。

  • else if guess < secretNumber:這是一個 else if 條件判斷,用於進一步比較玩家猜測的數字 guess 和秘密數字 secretNumber 的大小。如果 guess 小於 secretNumber,則執行接下來的程式塊。

  • fmt.Println("Your guess is smaller than the secret number. Please try again"):如果 guess 小於 secretNumber,這一行程式碼將輸出 "Your guess is smaller than the secret number. Please try again",提示玩家猜測的數字太小了,需要再次猜測。

  • else:這是 if 條件判斷的最後一個分支,即當前猜測的數字既不大於 secretNumber 也不小於 secretNumber 時,即猜測正確。

  • fmt.Println("Correct, you Legend!"):如果 guess 等於 secretNumber,這一行程式碼將輸出 "Correct, you Legend!",表示猜測正確,並結束遊戲

整合程式碼

以下就是將上面程式碼整理後的

package main

import(
    "fmt"
    "math/rand" 
    "time" 
    "bufio"
    "os"
    "strconv"
    "strings"
)

func main(){
    maxNum := 100 
    rand.Seed(time.Now().UnixNano())
    secretNumber := rand.Intn(maxNum) 
    fmt.Println("The secret number is ", secretNumber)
    
    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.TrimSuffix(input, "\n") 
    
        guss, err := strconv.Atoi(input) 
        if err != nil{
            fmt.Println("Invalid input. Please enter an integer value")
       
        }
        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 smalller than the secret number. Please try again")
        } else {
            fmt.Println("Correct, you Legend!")
            break 
        }
    }
}

結果

CC BY-NC-ND 4.0 授权