在Java中为二十一点模拟器创建卡片组

时间:2014-07-16 02:43:40

标签: java arrays

我正在创建一个二十一点模拟器来更好地学习java。我最近完成了udacity的免费课程,这是一个很好的资源,https://www.udacity.com/course/cs046

到目前为止,我已经创建了一副牌并成功打印出来。它由3个类别组成,Blackjack拥有主要方法,甲板创建甲板和卡片创建卡片。

有更好的方法吗?跳出来的一件事是甲板构造函数有多长。在我看到的所有例子中,构造函数都要短得多。

另外,我没有在卡中使用getter方法,因此应删除或使用它们。我倾向于删除它们,因为一旦创建了套牌,没有其他方法可以调用这些方法。

我没有使用Google搜索,因为我不想为将来的方法提供答案。我不是第一个有这个想法的人!

感谢您的反馈。

Card.java

package blackjack;

public class Card {
    private final String name;
    private final String suit;
    private final int value;

    public Card(String name, String suit, int value){
        this.name = name;
        this.suit = suit;
        this.value = value;
    }

    public String getName(){
        return name;
    }

    public String getSuit() {
        return suit;
    }

    public int getValue() {
        return value;
    }

    public String toString(){
        return (this.name + " of " + this.suit + " " + this.value);
    }
}

Deck.java

package blackjack;

import java.util.*;

public class Deck {

    private static int numSuits = 4;
    private static int numRanks = 13;
    private static int numCards = numSuits * numRanks;

    private Card[] cards;

    public Deck() {

        String suit = null;
        String name = null;        
        int value = 0;
        cards = new Card[numCards];

        int arrayIndex=0;

        for (int i=1; i<=numSuits; i++){
            for (int j=1; j <= numRanks; j++){
                switch (i){
                    case 1: suit = "Clubs"; break;
                    case 2: suit = "Diamonds"; break;
                    case 3: suit = "Hearts";  break;
                    case 4: suit = "Spades"; break;
                }

                switch (j){
                    case 1: name = "Ace"; value = 0; break;
                    case 2: name = "Two"; value = 2; break;
                    case 3: name = "Three"; value = 3; break;
                    case 4: name = "Four"; value =4; break;
                    case 5: name = "Five"; value = 5; break;                             
                    case 6: name = "Six"; value = 6; break;
                    case 7: name = "Seven"; value = 7; break;
                    case 8: name = "Eight"; value = 8; break;
                    case 9: name = "Nine"; value = 9; break;
                    case 10: name = "Ten"; value = 10; break;                           
                    case 11: name = "Jack"; value = 10; break;
                    case 12: name = "Queen"; value = 10; break;
                    case 13: name = "King"; value = 10; break;                           
                }

                Card card = new Card (name, suit, value);  
                cards[arrayIndex] = card; 
                arrayIndex++;
            }
        }
    }

    public void printDeck(){
        System.out.println(Arrays.toString(cards));
    }

}

Blackjack.java

package blackjack;

import java.util.*;

/**
 *
 * @author
 */
public class Blackjack {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Deck deck = new Deck();
        deck.printDeck();
    }
}

1 个答案:

答案 0 :(得分:1)

有更好的方法吗?跳出来的一件事是甲板构造函数有多长。在我看到的所有例子中,构造函数都要短得多。

<强>答案:
你是对的,一般来说,构造函数应该是简约的。原因是,您希望尽快创建对象,并且当构造函数执行太多工作时,“不好的事情会发生”的可能性增加,然后您可能会得到一个“混乱”对象(这是当你发现它时,很难调试的东西......)。总而言之,您的构造函数有两个嵌套循环,每个循环运行52次并执行2个操作(+2比较)。那不是 很多工作 - 所以,恕我直言,这很好。


另外,我没有在卡中使用getter方法,因此应删除或使用它们。我倾向于删除它们,因为一旦创建了套牌,没有其他方法可以调用这些方法。

<强>答案:
没有!所有Card的字段都是私有的,当您浏览Card[] cards时(在课程Deck中),您将无法访问它们以实际读取这些卡片。是的,将来......