用 Go 語言開發一個石頭剪刀布遊戲,很簡單

本文將通過 Go 語言實現一個玩家與電腦對戰的石頭剪刀布遊戲,並重點講解如何通過 Go 的 crypto/rand 包生成安全的隨機數,確保遊戲的公平性。

一、遊戲模型設計

在編寫代碼之前,我們首先要設計遊戲的基本模型,包括參與者、動作和遊戲狀態。

1. 用戶與動作

遊戲的參與者有兩個:玩家和電腦。每個參與者可以做出三種選擇:石頭、剪刀或布。我們通過 Go 的枚舉類型來表示這些選擇。

// 用戶類型

type UserType int



const(

    Player UserType =iota

    Computer

)



// 動作類型

type ActionType int



const(

    NoAction ActionType =iota

    Rock

    Scissors

    Paper

)

每個用戶將擁有一個 Action,用於表示他們的選擇。我們還可以定義一個 User 結構體,用於存儲用戶信息。

type User struct{

    Type   UserType

    Action ActionType

}



// 創建新用戶

funcNewUser(userType UserType) User {

return User{

        Type:   userType,

        Action: NoAction,

}

}

2. 遊戲狀態與結果

爲了管理遊戲流程,我們需要追蹤遊戲的狀態和結果。這裏使用枚舉類型來表示遊戲的不同狀態和結果。

// 遊戲狀態

type GameStateType int



const(

    NotPlaying GameStateType =iota

    Playing

    ActionTaken

    AwaitingResult

    ResultsDeclared

)



// 遊戲結果

type OutcomeType int



const(

    NotPlayed OutcomeType =iota-2

    Lost

    Draw

    Win

)

二、遊戲核心邏輯

1. 獲取玩家輸入

首先,我們需要通過 bufio 包讀取玩家的輸入,允許玩家選擇石頭、剪刀或布。輸入對應數字 1、2、3 分別代表石頭、剪刀和布。

funcgetUserInput() ActionType {

    reader := bufio.NewReader(os.Stdin)

    fmt.Print("請輸入您的選擇 (石頭: 1, 剪刀: 2, 布: 3): ")



    input,_:= reader.ReadString('\n')

    input = strings.TrimSpace(input)



var action ActionType

switch input {

case"1":

        action = Rock

case"2":

        action = Scissors

case"3":

        action = Paper

default:

        fmt.Println("無效的選擇,請重新輸入。")

returngetUserInput()

}



return action

}

2. 生成電腦隨機動作

爲了確保遊戲公平,我們需要使用安全的隨機數生成器來決定電腦的動作。crypto/rand 包能夠生成安全的隨機數,避免僞隨機數的可預測性。

funcgenerateComputerAction() ActionType {

    randomNumber,_:= rand.Int(rand.Reader, big.NewInt(3))

returnActionType(randomNumber.Int64()+1)

}

3. 比較動作並判斷結果

根據石頭剪刀布的規則,我們比較玩家和電腦的動作,判斷勝負。

funcdetermineOutcome(playerAction, computerAction ActionType) OutcomeType {

if playerAction == computerAction {

return Draw

}



switch playerAction {

case Rock:

if computerAction == Scissors {

return Win

}else{

return Lost

}

case Scissors:

if computerAction == Paper {

return Win

}else{

return Lost

}

case Paper:

if computerAction == Rock {

return Win

}else{

return Lost

}

}



return NotPlayed // 理論上不會執行到此處

}

三、整合遊戲流程

接下來,我們將所有功能整合到 main 函數中,構建完整的遊戲流程。

funcmain(){

    player :=NewUser(Player)

    computer :=NewUser(Computer)



    fmt.Println("歡迎來到石頭剪刀布遊戲!")



// 獲取玩家和電腦的動作

    player.Action =getUserInput()

    computer.Action =generateComputerAction()



    fmt.Printf("您出: %d\n", player.Action)

    fmt.Printf("電腦出: %d\n", computer.Action)



// 判斷結果並輸出

    outcome :=determineOutcome(player.Action, computer.Action)



switch outcome {

case Win:

        fmt.Println("恭喜您,您贏了!")

case Lost:

        fmt.Println("很遺憾,您輸了。")

case Draw:

        fmt.Println("平局!")

}

}

四、隨機性與遊戲體驗

在這段代碼中,我們使用了 crypto/rand 包來生成電腦的隨機出招,確保其不可預測性。這對維護遊戲的公平性至關重要。如果我們使用普通的僞隨機數生成器,電腦的出招可能會被玩家預測,導致遊戲失去挑戰性。而使用加密級別的隨機數生成器,可以確保每一局的公平和不可預測性。

五、總結與展望

本文介紹瞭如何使用 Go 語言構建一個公平的石頭剪刀布遊戲,重點討論瞭如何使用安全的隨機數生成器來避免遊戲中的作弊現象。通過這段代碼,我們構建了一個簡潔而有趣的遊戲,但它僅是一個開始。

未來的改進方向:

  1. 圖形界面

    爲遊戲添加圖形界面,提升視覺體驗。

  2. 歷史戰績

    記錄玩家和電腦的歷史戰績,並進行統計分析。

  3. 智能策略

    根據玩家的歷史行爲,電腦可以逐步學習並預測玩家的出招,提升遊戲的挑戰性。

通過不斷優化和擴展,我們可以爲玩家帶來更加豐富的遊戲體驗。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/7XbH02HsomjatcUsSUJHmg