我建模撲克遊戲,我有一點懷疑的設計:撲克手造型問題
我有一個PokerHand
,這是由5個PokerCard
小號組成。 Straight
,ThreeOfAKind
, Poker
等應該是PokerHand
的子類嗎?或者它們應該是由計算它是什麼樣的手的PokerHand
方法返回的符號?
我的子類PokerHand
理由是,它將使檢查優勝者的手更容易和更快,但我不知道這是良好的工程...
是否有將適合這裏的任何設計模式?
謝謝!
我建模撲克遊戲,我有一點懷疑的設計:撲克手造型問題
我有一個PokerHand
,這是由5個PokerCard
小號組成。 Straight
,ThreeOfAKind
, Poker
等應該是PokerHand
的子類嗎?或者它們應該是由計算它是什麼樣的手的PokerHand
方法返回的符號?
我的子類PokerHand
理由是,它將使檢查優勝者的手更容易和更快,但我不知道這是良好的工程...
是否有將適合這裏的任何設計模式?
謝謝!
上個學期,我不得不在Java中設計這樣一個系統作爲作業。雖然有必要我們使用責任鏈模式檢查手,但我相當肯定這是一個不好的方法來解決問題,而且大多隻是一種將模式插入作業的方式。
如果我必須在沒有責任鏈模式的情況下重做它,並且使用一個更加清晰,更有凝聚力的策略列表,我會使用類似以下的設計。
將有一個Card
類,與'顏色'(黑桃,俱樂部,鑽石,心臟)和一個數字(都是enum
s);一個Hand
職業,持有5張卡片(或者只有n
卡片)。一個實現Comparable<HandRank>
接口的抽象類,以及每種類型的手(兩種一種,三種一類,直線等)的子類,每種類都可以與另一種類型比較(如StraightFlush
優於TwoOfAKind
);和基類AbstractHandAnalyzer
。這AbstractHandAnalyzer
將有一個Analyze(Hand)
方法,將返回一個HandRank
對象。
現在,您可以按HandRank
的子類創建AbstractHandAnalyzer
的一個子類。如果手匹配,那些子類會檢查給定的手並返回一個HandRank
實例(例如,如果TwoOfAKindAnalyzer
發現您有兩個國王,它會返回一個TwoOfAKindRank
,表明它找到了兩個國王,並保存踢球者以防萬一需要它時稍後比較)。
然後,您需要做的所有事情就是分析一隻手,並按照後代順序列出手分析器(因此您需要以同花順方式開始),然後手動運行每個分析器,直到一個分析器不返回null
。
這裏的重要部分是將撲克牌手與隊伍本身分開。儘管大多數語言(儘管Smalltalk可能不是這種情況),但是如果構造一個Hand
對象,則不能將其變形爲另一個類,因此根據您的對象實例化方案,子類Hand
來限定等級可能很困難,並且可以如果手牌是可變的(有些撲克變種允許交換紙牌),則可能會變得難以接近。這種方法可以讓您重複使用Hand
並輕鬆實現各種手持分析儀。
«你不能神奇地變身它變成了另一個類,»→Morphing類在Smalltalk中實際上是微不足道的:)因爲我找不到任何其他的缺點,我覺得它更接近現實生活中的問題,我想我會去它。謝謝! –
PokerHand
應該有一個方法:GetCombination
返回enum
或object
。手是手,如果玩家擁有Straigt,它不會添加任何新的行爲或狀態。所以組合是可以從卡片中計算出來的。
編輯:我想創建Combination
類這些屬性:
Type
- 枚舉表示組合。Player
- 參考玩家。Cards
- 涉及參與卡片陣列。通過Type
第一然後通過Cards
(對於最高卡):然後實現比較邏輯,使得任何兩個的組合不能比擬的。
我可能會使用撲克牌作爲一套(大概5張牌)。然後,爲了檢查它是什麼類型的手,我會創建一個CalculateValue()
方法,返回1對,2對2對,3對3等。這個值可以在手被構造時計算,然後簡單地在需要時重複使用。
祝你好運!
我一直在想這件事:
我的理由是,所有的手可以在HighCard
,Pair
,TwoPairs
,ThreeOfAKind
,Straight
,Flush
,FullHouse
,FourOfAKind
和StraightFlush
進行分類。他們都是種(或類)的手,而Hand
只是一個抽象類。
所有這些子類只需要重寫<
和>
,然後問了手,如果它比另外一個變得就像做aHand < anotherHand
,這看起來很自然的,因爲簡單。
在現實生活中,我們會先拿兩手比較一下,先看看他們的種類(等級),然後(並且只在必要時)以他們的卡片價值來比較他們。因此,採用這種方法,<
和>
的行爲將與此類似:檢查類是否不同,以防他們自動獲得答案。如果他們不是,我們遞歸地檢查哪一個擁有最好的卡片。
你在爲這個使用smalltalk嗎? –
是的,我正在使用Smalltalk –
請參閱[責任鏈:撲克示例](http://www.netobjectives.com/PatternRepository/index.php?title=TheChainOfResponsibilityPattern#Chain_of_Responsibility:_The_Poker_Example) – Fuhrmanator