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 枚のカードが null、null であることが出力されます。コードを調べましたが、エラーが見つからないようです。たぶんあなたはできる?あなたが私に与えるどんな助けにも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];

裏には51枚ではなく52枚のカードがあります。

編集:コメントに記載されているように、スーツを選択するための 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 命名規則に従って、より意味のある変数名を使用することを強くお勧めします。(実際には他にもさまざまな変更をコードに加える必要がありますが、それらから始めてください。)

于 2012-04-30T06:24:55.190 に答える
1

一見、問題はここにあるように見えます:for(int A=1;A>=4;A++){そしてここにfor(int B=1;B>=13;B++){。最初のループでは、最初の反復でAが1になり、したがって4未満になるため、これらのループは実行されません。つまり、最初のループの条件が破られ、同じことが2番目のループにも当てはまります。>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;
    }

}

DeckorHandクラスに入れる実際の実装は自分で任せます。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 に答える