猜數字遊戲邏輯範例|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
}
}
}
結果
喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!


