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(铲子).
- 解决模糊性问题,是设计Uno还是普通的牌
- 设计核心对象,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;
}
}
}