二十一点程序返回卡为空?

时间:2012-04-30 06:22:41

标签: java

主类:

公共类二十一点{

static Deck D;
static Hand P;
public static void main(String[] args) {
    init();
}

private static void init() {
    D=new Deck();
    P=new Hand(D);
    startGame();
}

private static void startGame() {
    System.out.print("Your cards are: "+P.H.get(0)+", "+P.H.get(1));
}

}

手类:

import java.util.ArrayList;
import java.util.Random;


public class Hand {
ArrayList<String> H;
Random R;
public Hand(Deck D){
    R=new Random();
    H=new ArrayList<String>();
    int C=R.nextInt(D.getP().length);
    H.add(D.getP()[C]);
    D.removeFromDeck(C);
    int E=R.nextInt(D.getP().length);
    H.add(D.getP()[E]);
    D.removeFromDeck(E);
}

}

甲板等级

public class Deck {
String[] P;
public Deck(){
    P=new String[52];
    String Suit="Default";
    int C=0;
    for(int A=1;A<=4;A++){
        switch(A){
        case 1:
            Suit="Hearts";
            break;
        case 2:
            Suit="Diamonds";
            break;
        case 3:
            Suit="Clubs";
            break;
        case 4:
            Suit="Spades";
            break;
        }
        for(int B=1;B<=13;B++){
            if(B>10){
                switch(B){
                case 11: P[C]="Joker of "+Suit; 
                break;
                case 12: P[C]="Queen of "+Suit;
                break;
                case 13: P[C]="King of "+Suit;
                break;
                }
            }else{
                P[C]=B+" of "+Suit;
            }
        }
    }
}
public void setP(String[] p) {
    P = p;
}
public String[] getP() {
    return P;
}
public void removeFromDeck(int C){
    System.arraycopy(P, C + 1, P, C,
            P.length - C - 1);
}

}

当我编译并运行此代码时,它打印出我的2张卡为null,null。我查看了代码,似乎无法找到我的错误。也许你可以? TY给你任何帮助。

编辑:现在只返回黑桃,有人可以帮忙吗?

3 个答案:

答案 0 :(得分:5)

你的循环都有错误的循环条件:

for(int A=1;A>=4;A++)

   ...
   for(int B=1;B>=13;B++)

这些都不会执行任何迭代。他们应该是:

for(int A=1;A<=4;A++)

   ...
   for(int B=1;B<=13;B++)

此外,您没有分配足够的尺寸:

P=new String[51];

背面有52张牌,而不是51张。

编辑:正如评论中所指出的那样,你总是得到代码为发布的黑桃,因为你选择套装的switch语句没有任何中断。我本来希望这会导致编译时间警告。你真的应该注意警告。你可以像这样添加break语句:

switch(A) {
    case 1:
        S = "Hearts";
        break;
    case 2:
        S = "Diamonds";
        break;
    case 3:
        S = "Clubs";
        break;
    case 4:
        S = "Spades";
        break;
}

最后,我强烈建议您使用更有意义的变量名,最好遵循Java命名约定。 (实际上我会对您的代码进行各种其他更改,但从这些更改开始。)

答案 1 :(得分:1)

乍一看,问题出现在这里:for(int A=1;A>=4;A++){for(int B=1;B>=13;B++){。这些循环永远不会执行,因为在第一次循环中,在第一次迭代时A将为1,因此小于4,这意味着它会破坏第一个循环的条件,同样适用于第二个循环。用>替换<应该会产生一些东西。

答案 2 :(得分:0)

我很困惑为什么你还没有封装Card类,因为它会使卡的实例化变得更容易。此外,您可以随时将套装抽象到自己的类或枚举中。

无论如何,我可能会为你做太多的设计工作,但这里有一些东西可以帮助你入门:

public enum Suit {
    Spade,
    Heart,
    Diamond,
    Club;

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

这是一个使用此套装的简单Card类。

public class Card {

    private Suit suit;
    private int value;

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

    public Card(int suit, int value) {
        this(Suit.getSuit(suit), value);
    }

    public int getValue() { return value; }
    public Suit getSuit() { return suit; }

}

创建套牌很简单。这是一个简单的工厂,可以帮助您入门:

public class DeckFactory {

    public static List<Card> BuildDeck() {
        List<Card> cards = new ArrayList<Card>();

        for (int value = 1; value <= 13; ++value) {
            for (int suit = 0; suit < 4; ++suit) {
                cards.add(new Card(value, suit));
            }
        }

        return cards;
    }

}

我将实际的实现留给DeckHand课程。在Card类中,您可以覆盖toString()方法以返回Card对象的更好的字符串表示形式。

// in Card.java
@override
public String toString() {

   String output = "";

   switch(this.value) {
       1: 
           output += "Ace ";
           break;
       11: 
           output += "Jack ";
           break;
       12: 
           output += "Queen ";
           break;
       13: 
           output += "King ";
           break;
       default:
           output += this.value;
           break;
   }

   output += " of ";

   output += this.suit.toString();
       // returns the name of the enum

   return output;

}

希望这会有所帮助。