Design Card

Deck of cards: Design the data structures for a generic deck of cards. Explain how you would subclass the data structures to implement blackjack.

Blackjack就是所谓的21点,虽然21点是什么还是不懂。

四种花色:diamond,club(梅花),heart,spade(铲子).

  1. 解决模糊性问题,是设计Uno还是普通的牌
  2. 设计核心对象,Suit花色,Card,Deck,Hand
    • Deck表示当前有多少牌在可以分发
    • Deck有个shuffle的函数打乱牌的顺序
    • Deck可以把牌给手,手可以接受牌
    • Hand可以知道当前它的分数

太久没有自定义C++类了,原来C++ abstract class定义前不用加abstract。C++ 类前也不用加public修饰符。C#代码看多了的影响。

package Q7_01_Deck_of_Cards;

public class BlackJackCard extends Card {
    public BlackJackCard(int c, Suit s) {
        super(c, s);
    }

    public int value() {
        if (isAce()) { // Ace
            return 1; 
        } else if (faceValue >= 11 && faceValue <= 13) { // Face card
            return 10;
        } else { // Number card
            return faceValue;
        }
    }

    public int minValue() {
        if (isAce()) { // Ace
            return 1; 
        } else {
            return value();
        }
    }

    public int maxValue() {
        if (isAce()) { // Ace
            return 11; 
        } else {
            return value();
        }
    }

    public boolean isAce() { 
        return faceValue == 1;
    } 

    public boolean isFaceCard() {
        return faceValue >= 11 && faceValue <= 13;
    }
}

package Q7_01_Deck_of_Cards;

import java.util.ArrayList;

public class Hand <T extends Card> {
    protected ArrayList<T> cards = new ArrayList<T>();

    public int score() {
        int score = 0;
        for (T card : cards) {
            score += card.value();
        }
        return score;
    }

    public void addCard(T card) {
        cards.add(card);
    }    

    public void print() {
        for (Card card : cards) {
            card.print();
        }
    }    
}

package Q7_01_Deck_of_Cards;

import java.util.ArrayList;

import CtCILibrary.AssortedMethods;

public class Deck <T extends Card> {
    private ArrayList<T> cards;
    private int dealtIndex = 0; // marks first undealt card

    public Deck() {
    }

    public void setDeckOfCards(ArrayList<T> deckOfCards) {
        cards = deckOfCards;
    }

    public void shuffle() {
        for (int i = 0; i < cards.size(); i++) {
            int j = AssortedMethods.randomIntInRange(i, cards.size() - i - 1);
            T card1 = cards.get(i);
            T card2 = cards.get(j);
            cards.set(i, card2);
            cards.set(j, card1);
        }
    }

    public int remainingCards() {
        return cards.size() - dealtIndex;
    }

    public T[] dealHand(int number) {
        if (remainingCards() < number) {
            return null;
        }

        T[] hand = (T[]) new Card[number];
        int count = 0;
        while (count < number) {
            T card = dealCard();
            if (card != null) {
                hand[count] = card;
                count++;
            }
        }

        return hand;
    }

    public T dealCard() {
        if (remainingCards() == 0) {
            return null;
        }

        T card = cards.get(dealtIndex);
        card.markUnavailable();
        dealtIndex++;

        return card;        
    }

    public void print() {
        for (Card card : cards) {
            card.print();
        }
    }
}
package Q7_01_Deck_of_Cards;

public abstract class Card {
    private boolean available = true;

    /* number or face that's on card - a number 2 through 10, 
     * or 11 for Jack, 12 for Queen, 13 for King, or 1 for Ace 
     */
    protected int faceValue;
    protected Suit suit;

    public Card(int c, Suit s) {
        faceValue = c;
        suit = s;
    }

    public abstract int value();

    public Suit suit() { 
        return suit; 
    }

    /* returns whether or not the card is available to be given out to someone */
    public boolean isAvailable() {
        return available;
    }

    public void markUnavailable() {
        available = false;
    }

    public void markAvailable() {
        available = true;
    }

    public void print() {
        String[] faceValues = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        System.out.print(faceValues[faceValue - 1]);
        switch (suit) {
        case Club:
            System.out.print("c");
            break;
        case Heart:
            System.out.print("h");
            break;
        case Diamond:
            System.out.print("d");
            break;
        case Spade:
            System.out.print("s");
            break;            
        }
        System.out.print(" ");
    }
}
package Q7_01_Deck_of_Cards;

public enum Suit { 
    Club (0),
    Diamond (1),
    Heart (2),
    Spade (3);

    private int value;
    private Suit(int v) {
        value = v;
    }

    public int getValue() {
        return value;
    }

    public static Suit getSuitFromValue(int value) {
        switch (value) {
        case 0:
            return Suit.Club;
        case 1:
            return Suit.Diamond;
        case 2:
            return Suit.Heart;
        case 3: 
            return Suit.Spade;
        default:
                return null;
        }
    }
}

results matching ""

    No results matching ""