2011-07-06 83 views
0

我建模撲克遊戲,我有一點懷疑的設計:撲克手造型問題

我有一個PokerHand,這是由5個PokerCard小號組成。 Straight,ThreeOfAKind, Poker等應該是PokerHand的子類嗎?或者它們應該是由計算它是什麼樣的手的PokerHand方法返回的符號?

我的子類PokerHand理由是,它將使檢查優勝者的手更容易和更快,但我不知道這是良好的工程...

是否有將適合這裏的任何設計模式?

謝謝!

+0

你在爲這個使用smalltalk嗎? –

+0

是的,我正在使用Smalltalk –

+1

請參閱[責任鏈:撲克示例](http://www.netobjectives.com/PatternRepository/index.php?title=TheChainOfResponsibilityPattern#Chain_of_Responsibility:_The_Poker_Example) – Fuhrmanator

回答

3

上個學期,我不得不在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並輕鬆實現各種手持分析儀。

+0

«你不能神奇地變身它變成了另一個類,»→Morphing類在Smalltalk中實際上是微不足道的:)因爲我找不到任何其他的缺點,我覺得它更接近現實生活中的問題,我想我會去它。謝謝! –

2

PokerHand應該有一個方法:GetCombination返回enumobject。手是手,如果玩家擁有Straigt,它不會添加任何新的行爲或狀態。所以組合是可以從卡片中計算出來的。

編輯:我想創建Combination類這些屬性:

  • Type - 枚舉表示組合。
  • Player - 參考玩家。
  • Cards - 涉及參與卡片陣列。通過Type第一然後通過Cards(對於最高卡):

然後實現比較邏輯,使得任何兩個的組合不能比擬的。

0

我可能會使用撲克牌作爲一套(大概5張牌)。然後,爲了檢查它是什麼類型的手,我會創建一個CalculateValue()方法,返回1對,2對2對,3對3等。這個值可以在手被構造時計算,然後簡單地在需要時重複使用。

祝你好運!

0

我一直在想這件事:

我的理由是,所有的手可以在HighCardPairTwoPairsThreeOfAKindStraightFlushFullHouseFourOfAKindStraightFlush進行分類。他們都是(或類)的手,而Hand只是一個抽象類。

所有這些子類只需要重寫<>,然後問了手,如果它比另外一個變得就像做aHand < anotherHand,這看起來很自然的,因爲簡單。

在現實生活中,我們會先拿兩手比較一下,先看看他們的種類(等級),然後(並且只在必要時)以他們的卡片價值來比較他們。因此,採用這種方法,<>的行爲將與此類似:檢查類是否不同,以防他們自動獲得答案。如果他們不是,我們遞歸地檢查哪一個擁有最好的卡片。