BlackJack Java:手动打印错误

时间:2013-07-03 20:34:01

标签: java blackjack

我有一个手牌,有很多牌。经销商将卡片交给我的手,我希望我的游戏能够显示用户当前拥有的卡片。这是游戏代码,在我的GameEngine课程中我打印出手中的卡片。问题是它打印出整个套牌!这是打印输出:Your hand: [Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King] of Spades。我只想要打印一张卡,而不是所有卡,所以在我的代码中搞砸了什么?

public void beginCardDeal () {
    for (int x = 0; x < 2; x++) {
        System.out.print("\nDealer is dealing a card. . . \n");
        d.dealCard();
        System.out.println("\nYour hand: " + pl.getMyCards());
    }
}

pl是Player类的一个实例,因为玩家有一手牌。 d是Deck的实例。

public class Player extends Person {

private Hand myCards = new Hand();
private int playerCashAmount = 100;

public Player() {

}

public Player(String name) {
    this.name = name;
}

public String getName() {
    return super.getName();
}

public int getPlayerCashAmount() {
    return playerCashAmount;
}

public void setPlayerCashAmount(int playerCashAmount) {
    this.playerCashAmount = playerCashAmount;
}

public Hand getMyCards() {
    return myCards;
}

public void setMyCards(Hand myCards) {
    this.myCards = myCards;
}

此外,这是我的Deck课程:

public class Deck {

private ArrayList<Card> deck = new ArrayList<Card>();
private List<Card> cardUsed = new ArrayList<Card>();

int numCards = 0;

public Deck(int numCards) {
    this.createDeck(numCards, 4);
}

private void createDeck(int numCards, int numSuits) {
    deck = new ArrayList<Card>();
    cardUsed = new ArrayList<Card>();
    if ((numCards % numSuits) > 0) return;
    for (int i=0; i < numSuits; i++) {
        for(int j=1; j <= (numCards / numSuits); j++) {
            deck.add(new Card(new Suit(i), j));
        }
    }
}

public Card dealCard( ) {
    Card dealtCard = null;
    if (deck.size() == 0){
        deck.addAll(cardUsed);
        this.shuffle();
        cardUsed = new ArrayList<Card>();
    }

    dealtCard = deck.get(0);
    deck.remove(0);
    cardUsed.add(dealtCard);

    return dealtCard;
}

public void shuffle() {
    Collections.shuffle(deck);
}

public ArrayList<Card> getDeck() {
    return deck;
}

public void setDeck(ArrayList<Card> deck) {
    this.deck = deck;
}

public int getNumUsedCards() {
    return cardUsed.size();
}

public List<Card> getCardUsed() {
    return cardUsed;
}

public void setCardUsed(List<Card> cardUsed) {
    this.cardUsed = cardUsed;
}

编辑:

public class Hand {

int total = 0;
private ArrayList<Card> hand = new ArrayList<Card>();

public Hand(){

}

public String toString(){
    //Suit s = new Suit(total);
    //Card c = new Card(s, total);
    //return (Arrays.toString(c.getCardRanks())) + " of " + s.getSuitName();
    return Arrays.toString(hand.toArray());
}

public boolean discardHand(){
    if (hand.isEmpty()) {
        hand = new ArrayList<Card>();
    }
    return false;
}

public void addCard(Card c) {
    this.hand.add(c);
}

public Card getPosition(int index){
    return hand.get(index);
}

public int handCardCount(){
    return hand.size();
}

public int getTotal() {
    return total;
}

public void setTotal(int total) {
    this.total = total;
}

public ArrayList<Card> getHand() {
    return hand;
}

public void setHand(ArrayList<Card> hand) {
    this.hand = hand;
}

2 个答案:

答案 0 :(得分:1)

当您发牌时,不要将其添加到玩家手中。

答案 1 :(得分:0)

你的对象需要更好地反映它们所代表的性质:一副牌和一张牌都只是一组有序的牌,因此使用底层数组列表(或一个简单的数组)就可以了。 “交易”牌是将牌从牌组移动到牌上的行为,因此它应该是牌手对象作为参数处理的方法,例如: deck.dealTo(hand),或者返回一张卡并使用作业,例如hand.add(deck.deal())。您现在的d.dealCard()会从卡座上取下一张卡片并将其放在地板上。它也以一种奇怪的方式处理 - 我无法想象任何游戏,当甲板耗尽时你只需要洗牌新牌并继续交易!

同样,玩家对象应该包含对手对象的引用(或者可能没有,或者多于一个,具体取决于游戏),但是你没有交易玩家,你可以交易。此外,一些“手”可能根本不与玩家联系,例如在cribbage中的“crib”或德州扑克中的“棋盘”。