1

主类:

公共课二十一点{

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 张卡是空的,空的。我查看了代码,似乎找不到我的错误。也许你可以?TY 为您提供任何帮助。

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

4

3 回答 3

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 语句没有任何中断。我原以为这会导致编译时警告。你真的应该注意警告。您可以像这样添加中断语句:

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

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

于 2012-04-30T06:24:55.190 回答
1

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

于 2012-04-30T06:28:02.443 回答
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;

}

希望这会有所帮助。

于 2012-04-30T08:10:07.127 回答