系統開發-定義類別、方法與操作介面

更新於 2024/11/05閱讀時間約 6 分鐘
raw-image


依據之前自訂的流程圖,定義系統的類別(Class)與相關的動作(方法Method)

raw-image


並設計系統的操作介面(Interface)

raw-image


實際玩法中,只有「莊家」和「玩家」這兩個角色,若撲克牌的處理邏輯放在這些角色裡,這樣的設計可能在 莊家 和 玩家 中都直接處理撲克牌的生成、發牌和計分等邏輯。在這個設計中,所有與撲克牌相關的處理都放在 Dealer(莊家) 和 Player(玩家) 中,這會導致代碼變得難以維護,因為每個角色都需要自己處理牌的邏輯。

以上是不好的作法,若是從原本只有「莊家」和「玩家」兩個類別擴展成三個 Class (Deck, Card, Player),可以幫助學習如何將物件導向設計中的「責任分離」概念應用到實際程式中,並理解物件導向的設計和封裝。

首先將撲克牌的數據(例如花色、點數)獨立出來,建立一個 Card 類別。這樣做可以避免在其他類別中重複使用相同的牌資料定義。Card 只需處理每張牌的屬性,像是花色和點數,這樣在「莊家」和「玩家」類別中就不再需要自行定義牌的結構。

public class Card {
public string Suit { get; set; } // 花色
public int Rank { get; set; } // 點數

public Card() {} //建立類別
}

將所有與撲克牌堆(deck)相關的邏輯(如建立、洗牌、發牌)抽離成 Deck 類別。這樣一來,「莊家」和「玩家」類別只需要從 Deck 中抽牌,無需自己處理整副牌的邏輯。

public class Deck {
private Card[] cards; //牌堆(只能透過DrawCard取得,所以設定private)

public Deck() {} //建立類別
void Shuffle() {} //洗牌(生成時,自動洗牌,所以不需要設定public)
public Card DrawCard() {} //發牌,回傳Card
}

最後,Player 類別(莊家和玩家都是Player類別)可以簡化成只需處理玩家和莊家手牌的接收和計算分數。Player 會從 Deck 類別中抽取撲克牌,並計算手牌的總分。

public class Player {
public List<Card> cards { get; set; } //手牌

public Player() {} //建立類別
public void AddCard(Card d) {} //接收Deck發過來的牌,加入手牌中
public int CalculatePoints() {} //計算手牌總分
public bool IsBusted() {} //判斷手牌是否爆牌(超過21點)
}

這樣的設計讓 Deck 處理所有與牌組相關的邏輯,Card 專門表示單張牌的資料,而 Player 只需管理手牌和分數,簡化了每個類別的責任。這樣,可以清晰地看到如何將複雜的程式分割成各自獨立的模組,並讓這些模組合作來實現整體功能,以提升代碼的可維護性和可讀性。


流程函式如下

public partial class BJ21 : System.Web.UI.Page {
protected void ResetGame() {} //初始化遊戲參數與動作(初始發牌)

protected void DrawForDealer() {} //發牌給莊家
protected void DrawForPlayer() {} //發牌給玩家

//按鈕OnClick後觸發
protected void btn_hit_Click() {} //玩家要牌,呼叫DrawForPlayer()
protected void btn_stand_Click() {} //玩家停牌,換莊家要牌DrawForDealer(),直到計分比較輸贏
protected void btn_newgame_Click() {} //新牌局(下一回合),呼叫NextRound()

protected void NextRound() {} //下一回合,呼叫ResetGame()
}

完成基本類別與方法定義後,加上邏輯與法判斷,即可完成系統開發,當然過程中還使用一些資料存取技巧,後續會補上。

若想加上其他功能,例如統計總共玩過幾次,或是玩家贏過幾次的功能,等整個基本架構完成可以運作後,再來加上即可,避免程式碼複雜化,也比較容易除錯(Debug)。


    avatar-img
    0會員
    19內容數
    FIRE
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    你可能也想看
    Google News 追蹤
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
    Thumbnail
    一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
    Thumbnail
    在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
    Thumbnail
    你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
    Thumbnail
    前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
    Thumbnail
    這是為了搭建自己想要的工作流而開始的研究工作。
    Thumbnail
    Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
    Thumbnail
    一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
    Thumbnail
    在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
    Thumbnail
    你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
    Thumbnail
    前面已經安裝好IIS後,並且也新建站台了,那麼接下來這篇就會分享如何使用它
    Thumbnail
    這是為了搭建自己想要的工作流而開始的研究工作。
    Thumbnail
    Accept:用戶端能夠接收的內容類型。 Accept: text/plain, text/html Accept-Charset:瀏覽器可以接受的字元編碼集。 Accept-Charset: utf8 Accept-Encoding:指定瀏覽器可以支援的web伺服器返回內容壓縮編碼