免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1134 | 回复: 0
打印 上一主题 下一主题

Card game [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-27 15:02 |只看该作者 |倒序浏览

Card:一张牌
/**
* Object presenting one card
* @author reniaL
*/
public class Card {
    private int face;
    private int suit;
    private static final String faces[] = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };
    private static final String suits[] = { "Diamonds", "Clubs", "Hearts", "Spades" };
    public Card(int cardFace, int cardSuit) {
        face = cardFace;
        suit = cardSuit;
    }
    public int getFace() {
        return face;
    }
    public int getSuit() {
        return suit;
    }
    /**
     * Get the "value" of this card
     */
    public int getValue() {
        return face * 4 + suit;
    }
    public String toString() {
        return faces[face] + " of " + suits[suit];
    }
}

DeckOfCards:一副牌
/**
* presenting a deck of cards(52)
* @author reniaL
*/
public class DeckOfCards {
    private Card deck[];
    private int currentCard;
    private static final int NUM = 52;
    private Random rand;
    public DeckOfCards() {
        deck = new Card[NUM];
        currentCard = 0;
        rand = new Random();
        for (int i = 0; i  deck.length; i++) {
            deck = new Card(i / 4, i % 4);
        }
    }
    public void Shuffle() {
        currentCard = 0;
        for (int first = 0; first  deck.length; first++) {
            int second = rand.nextInt(NUM);
            Card temp = deck[first];
            deck[first] = deck[second];
            deck[second] = temp;
        }
    }
    public Card DealCard() {
        if (currentCard  deck.length) {
            return deck[currentCard++];
        } else
            return null;
    }
}

TypeOfHand:一手牌的类型
/**
* enumeration of type of a hand of cards
* @author reniaL
*/
public enum TypeOfHand {
    //     declare constants of enum type
    NOTHING(0, "Nothing"),
    PAIR(1, "A Pair"),
    THREE(2, "Three Of A Kind"),
    DOUBLE_PAIR(3, "Two Pairs"),
    HOUSE(4, "House"),
    FOUR(5, "Four Of A Kind"),
    FLUSH(6, "Flush"),
    STRAIGHT(7, "Straight");
    private final int type;
    private final String typeName;
    TypeOfHand(int theType, String theTypeName) {
        type = theType;
        typeName = theTypeName;
    }
    public int getType() {
        return type;
    }
    public String getTypeName() {
        return typeName;
    }
}

HandOfCards:一手牌
/**
* A. a pair
* B. two pairs
* C. three of a kind
* D. a full house
* E. four of a kind
* F. a flush
* G. a straight
*/
public class HandOfCards {
    private static final int NUM = 5; // number of cards
    private Card myCards[];
    private TypeOfHand type; // type of this hand
    private int value; // value of this hand
    private ArrayListInteger> unneeded; // array of index of the unneeded cards
    /**
     * Deal from deckOfCards 5 times to make a hand of cards, and sort
     */
    public HandOfCards(DeckOfCards deckOfCards) {
        myCards = new Card[NUM];
        unneeded = new ArrayListInteger>();
        for (int i = 0; i  NUM; i++) {
            myCards = deckOfCards.DealCard();
        }
        // sort and analyze the cards on hand
        sortCards();
        analyze();
    }
    /**
     * Analyze the cards on hand to determine the type and value
     */
    private void analyze() {
        unneeded.clear();
        if (checkPair()) { // type is PAIR, continue to check if it's double pair, three, four, or house
            if (checkThree()) {
                if (!checkFour()) {
                    checkHouse();
                }
            } else {
                checkDoublePair();
            }
        } else if (!checkStraight()) {
            if (!checkFlush()) { // NOTHING
                type = TypeOfHand.NOTHING;
                value = myCards[4].getValue();
                for (int i = 0; i  5; i++) {
                    unneeded.add(i);
                }
            }
        }
    }
    private boolean checkPair() {
        for (int i = 1; i  NUM; i++) {
            if (myCards.getFace() == myCards[i - 1].getFace()) {
                type = TypeOfHand.PAIR;
                value = type.getType() * 52 + myCards.getValue();
                for (int j = 0; j  NUM; j++) {
                    if ((j != i) && (j != i - 1)) {
                        unneeded.add(j);
                    }
                }
                return true;
            }
        }
        return false;
    }
    private boolean checkDoublePair() {
        int i = 1;
        while ((i  NUM) && (myCards.getFace() != myCards[i - 1].getFace())) {
            i++;
        }
        for (int j = i + 2; j  NUM; j++) {
            if (myCards[j].getFace() == myCards[j - 1].getFace()) {
                unneeded.clear();
                type = TypeOfHand.DOUBLE_PAIR;
                value = type.getType() * 52 + myCards[j].getValue();
                if (j == 3) { // AABBX
                    unneeded.add(4);
                } else {
                    if (i == 1) { // AAXBB
                        unneeded.add(2);
                    } else { // XAABB
                        unneeded.add(0);
                    }
                }
                return true;
            }
        }
        return false;
    }
    private boolean checkThree() {
        for (int i = 2; i  NUM; i++) {
            if ((myCards.getFace() == myCards[i - 1].getFace())
                    && (myCards.getFace() == myCards[i - 2].getFace())) {
                unneeded.clear();
                type = TypeOfHand.THREE;
                value = type.getType() * 52 + myCards.getValue();
                for (int j = 0; j  NUM; j++) {
                    if ((j != i) && (j != i - 1) && (j != i - 2)) {
                        unneeded.add(j);
                    }
                }
                return true;
            }
        }
        return false;
    }
    private boolean checkHouse() {
        if ((myCards[0].getFace() == myCards[1].getFace())
                && (myCards[3].getFace() == myCards[4].getFace())
                && ((myCards[2].getFace() == myCards[0].getFace()) || (myCards[2]
                        .getFace() == myCards[4].getFace()))) {
            type = TypeOfHand.HOUSE;
            if (myCards[2].getFace() == myCards[0].getFace()) {
                value = type.getType() * 52 + myCards[2].getValue();
            } else {
                value = type.getType() * 52 + myCards[4].getValue();
            }
            unneeded.clear();
            return true;
        }
        return false;
    }
    private boolean checkFour() {
        for (int i = 3; i  NUM; i++) {
            if ((myCards.getFace() == myCards[i - 1].getFace())
                    && (myCards.getFace() == myCards[i - 2].getFace())
                    && (myCards.getFace() == myCards[i - 3].getFace())) {
                type = TypeOfHand.FOUR;
                value = type.getType() * 52 + myCards.getValue();
                unneeded.clear();
                return true;
            }
        }
        return false;
    }
    private boolean checkFlush() {
        int suit = myCards[0].getSuit();
        for (int i = 1; i  NUM; i++) {
            if (myCards.getSuit() != suit) {
                return false;
            }
        }
        type = TypeOfHand.FLUSH;
        value = type.getType() * 52 + myCards[4].getValue();
        unneeded.clear();
        return true;
    }
    private boolean checkStraight() {
        for (int i = 1; i  NUM; i++) {
            if ((myCards.getFace() - myCards[i - 1].getFace() != 1)) {
                return false;
            }
        }
        type = TypeOfHand.STRAIGHT;
        value = type.getType() * 52 + myCards[4].getValue();
        unneeded.clear();
        return true;
    }
    /**
     * Sort cards on hand, insertion sort
     */
    private void sortCards() {
        Card tempCard;
        for (int i = 0; i  NUM; i++) {
            for (int j = i; (j > 0)
                    && (myCards[j].getValue()  myCards[j - 1].getValue()); j--) {
                tempCard = myCards[j];
                myCards[j] = myCards[j - 1];
                myCards[j - 1] = tempCard;
            }
        }
    }
    public void reDeal(DeckOfCards deckOfCards) {
        for (int i : unneeded) {
            myCards = deckOfCards.DealCard();
        }
        // sort and analyze the cards on hand
        sortCards();
        analyze();
    }
    public void display() {
        for (int i = 0; i  NUM; i++) {
            System.out.print(myCards + "\t");
        }
        System.out.println("\nType: " + type.getTypeName());
        System.out.println("Value: " + value);
        if (unneeded.size() == 0) {
            System.out.println("Unneeded: empty");
        } else {
            System.out.println("Unneeded: " + unneeded);
        }
    }
    public TypeOfHand getType() {
        return type;
    }
    public int getValue() {
        return value;
    }
    public ArrayListInteger> getUnneeded() {
        return unneeded;
    }
    public Card[] getMyCards() {
        return myCards;
    }
    public void setMyCards(Card[] myCards) {
        this.myCards = myCards;
        sortCards();
        analyze();
    }
}

GameTest:测试
public class GameTest {
    public static void main(String[] args) {
        DeckOfCards deckOfCards = new DeckOfCards();
        deckOfCards.Shuffle();
        HandOfCards hand = new HandOfCards(deckOfCards);
        System.out.println("Before redeal:");
        hand.display();
        hand.reDeal(deckOfCards);
        System.out.println("\nAfter redeal:");
        hand.display();
    }
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/39889/showart_509797.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP