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

Nat*_*cat 1 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));
}
Run Code Online (Sandbox Code Playgroud)

}

手类:

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);
}
Run Code Online (Sandbox Code Playgroud)

}

甲板班

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);
}
Run Code Online (Sandbox Code Playgroud)

}

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

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

Jon*_*eet 5

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

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

   ...
   for(int B=1;B>=13;B++)
Run Code Online (Sandbox Code Playgroud)

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

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

   ...
   for(int B=1;B<=13;B++)
Run Code Online (Sandbox Code Playgroud)

此外,您没有分配足够的大小:

P=new String[51];
Run Code Online (Sandbox Code Playgroud)

后面有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;
}
Run Code Online (Sandbox Code Playgroud)

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