作者adrianshum (Alien)
看板java
标题Re: [问题] 判别扑克牌问题
时间Fri Jan 2 12:37:50 2009
※ 引述《ogamenewbie (._.)》之铭言:
: ※ 引述《infinity7519 (富贵险中求)》之铭言:
: : public class Card {
: : private String face;
: : private String suit;
: : public Card( String cardFace, String cardSuit ){
: : face = cardFace;
: : suit = cardSuit;
: : }
: : public String toString(){
: : return face + " of " + suit;
: : }
: : }
: : 请问板上前辈 要如何增加一个功能
: : 让它能够判别所发的牌是否有葫芦或twopair等等
: : 一次发五张牌
: 先作 getter 让你可以取得 face 跟 suit,
: 最好是取得一个适合比较的数值而非 string 本身
: 然後另外写一个程式去 random 产生五张 Card
: 再根据那个 getter 去比较五张卡的情况
: 可以傻傻的统计 cardFace 每种有几张, cardSuit 每种有几张.
: 再根据那两个阵列依照优先顺序比对牌组的组合下来.
: 例如说先看看有没有哪个 cardFace 有 5 个的, 且 cardSuit 有依序
: 然後再检查 cardSuit 里面哪个有 4 个的,
: 然後再 blahblah...
如果是我写的话, 我会这样写 (半 psuedo code):
class Card {
Suit suit;
int number;
// ctor, getter etc
}
class Deck { // 一副牌
// 内容自己想
public void shuffle();
public Card deal();
}
class HandOfCards { // 手牌
List<Card> cards;
//ctor, getter etc
public void add(Card card);
public void sort(Comparator<Card> comparator);
}
interface CardPattern {
boolean match(HandOfCards hand);
}
class FlushPattern { // 同花顺
boolean match(HandOfCards hand) {
hand.sort(new BySuitComparator()); // 适当的 comparator
// 令手牌先用花再用点数 sort
// sort 好後再检查就很简单了吧?
}
}
class FullHousePattern {
boolean match(HandOfCards hand) {
hand.sort(new ByNumberComparator());
// 用点数 sort 好, 再检查 full house 应该也简单得多了吧?
}
}
main() {
Deck deck = new Deck();
Hand = new Hand();
CardPatterns supportedPatterns = {
new FlushPattern(),
new FullHousePattern(),
new StraightPattern(),
new FourOfAKindPattern()
}
for (int i = 0; i < 4; i++) { // 发五张牌到手牌
hand.add(deck.deal());
}
for (CardPatterns pattern: supportedPatterns) {
if (pattern.match(hand)) {
System.out.println("Match Pattern! " + pattern.getClass().getName());
break;
}
}
}
把 Card (个别的牌), Deck (副牌), Hand (手牌) 都以物件代表,
加上 CardPattern 来代表不同的牌面, 这样以後要新增
牌面 (比如三条, two pair 等), 就新增新的 card pattern
就好了, 这样的写法, 以後也比较好 reuse.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.155.236.82