猜數字遊戲邏輯範例|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
轉換為整數guess
。strconv.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
}
}
}