0

文字列の配列から 2 つのランダム値を生成するカード ペア ゲームに取り組んでいます。私が知りたいのは、文字列の配列から 2 つのランダム値の合計を取得して勝者を決定する方法です。ここにコードがあります

import java.util.*;

public class Cards {
private String suit;
private String face;
private String[] cardSuits;
private String[] cardFaces;
private Random ran;

public Cards() {
    ran = new Random();
    cardSuits = new String[] { "of Spade", "of Hearts", "of Diamonds",
            "of Clubs" };
    cardFaces = new String[] { "Ace", "2", "3", "4", "5", "6", "7", "8", "9",
            "10", "Jack", "Queen", "King" };

}

public String setPlayerCardSuit() {
    suit = cardSuits[ran.nextInt(4)];
    return suit;

}

public String setPlayerCardFace() {
    face = cardFaces[ran.nextInt(13)];
    return face;
}

public String setPlayerCardSuit2() {
    suit = cardSuits[ran.nextInt(4)];
    return suit;

}

public String setPlayerCardFace2() {
    face = cardFaces[ran.nextInt(13)];
    return face;
}

public String setCompCardSuit() {
    suit = cardSuits[ran.nextInt(4)];
    return suit;

}

public String setCompCardFace() {
    face = cardFaces[ran.nextInt(13)];
    return face;
}

public String setCompCardSuit2() {
    suit = cardSuits[ran.nextInt(4)];
    return suit;

}

public String setCompCardFace2() {
    face = cardFaces[ran.nextInt(13)];
    return face;
}

public void getResults() {
    System.out.println("Here are your cards: " + setPlayerCardFace() + " "
            + setPlayerCardSuit() + " and " + setPlayerCardFace2() + " "
            + setPlayerCardSuit2());
}

public void getCompCard() {
    System.out.println("Here's the computer's cards: " + setCompCardFace()
            + " " + setCompCardSuit() + " and " + setCompCardFace2() + " "
            + setCompCardSuit2());
}

}

Cards クラスをテストするコードは次のとおりです。

import javax.swing.JOptionPane;

public class TestCards {
public static void main(String[] args) {
    Cards playerCards = new Cards();
    Cards computerCards = new Cards();

    int confirm, x = 1;
    while (x == 1) {
        JOptionPane.showMessageDialog(null,
                "Random Card game \nPlease press OK to Start Game",
                "Card Pair Game", JOptionPane.INFORMATION_MESSAGE);

        JOptionPane.showMessageDialog(
                null,
                "Here are your Cards: " + playerCards.setPlayerCardFace()
                        + " " + playerCards.setPlayerCardSuit() + " and "
                        + playerCards.setPlayerCardFace2() + " "
                        + playerCards.setPlayerCardSuit2()
                        + "\nThe Computer's Cards are: "
                        + computerCards.setCompCardFace() + " "
                        + computerCards.setCompCardSuit() + " and "
                        + computerCards.setCompCardFace2() + " "
                        + computerCards.setCompCardSuit2());


        confirm = JOptionPane.showConfirmDialog(null, "Game Ends. Again?",
                "Game Over", JOptionPane.YES_NO_OPTION);

        if (confirm != JOptionPane.YES_OPTION) {
            x = 2;
        }
    }
}
}

現在欠けているのは、勝者を決定するためのコードです。

PS: 私は Java プログラミングの初心者です..コードの異常な使用法を見つけた場合はご容赦ください :)


私はディランの提案を試しましたが、うまくいかないようです..代わりに彼のアイデアを使用して、このコードを Cards クラスに追加しました。

public int playerValues(){
    int temp = 0;
    if(face != cardFaces[0] && face != cardFaces[10] && face != cardFaces[11] && face != cardFaces[12]){
        temp = Integer.parseInt(face);
    }else if(face == cardFaces[0]){
        temp = 1;
    }else if(face == cardFaces[10]){
        temp = 11;
    }else if(face == cardFaces[11]){
        temp = 12;
    }else if(face == cardFaces[12]){
        temp = 13;
    }
    return temp;
}
public int computerValues(){
    int temp = 0;
    if(face != cardFaces[0] && face != cardFaces[10] && face != cardFaces[11] && face != cardFaces[12]){
        temp = Integer.parseInt(face);
    }else if(face == cardFaces[0]){
        temp = 1;
    }else if(face == cardFaces[10]){
        temp = 11;
    }else if(face == cardFaces[11]){
        temp = 12;
    }else if(face == cardFaces[12]){
        temp = 13;
    }
    return temp;
}
4

6 に答える 6

4

すべてのカードが一意ではないという問題があります。2 人のプレイヤーが同じカードを持つことができます。それらはすべて同じカードである可能性さえあります。

代わりに、可能なすべてのカードのリストを生成する必要があります。Cardクラスを使用することをお勧めします。Collections.shuffleそれらをシャッフルするために使用します。このようにして、すべてのプレイヤーが異なるカードを持つことになります。

カードのセットを比較するためのルールが必要です。最初に英語で定義してから、コードに翻訳します。

于 2012-08-06T14:58:43.860 に答える
3

カードの面を保持するために文字列の配列を使用するのではなく、名前(表示用)と値(面の合計を計算するため)を持つCardFaceの配列を使用する必要があります。また、値は13しかないため、列挙型にする必要があります。

public enum CardFace {
    ACE("Ace, 1),
    TWO("2", 2),
    ...
    KINK("King", 13);

    private String face;
    private int value;

    private CardFace(String face, int value) {
        this.face = face;
        this.value = value;
    }

    public String getFace() {
        return this.face;
    }

    public int getValue() {
        return this.value;
    }
}
于 2012-08-06T15:03:08.620 に答える
0

組み合わせの取得については誰も話していないようですので、ここで説明します。わからないことがあれば、ここにコメントしてください。

ストレートフラッシュ-forループが必要です。

まず、プレーヤーのカードの配列を昇順(1、2、3、4、5など)で並べ替える必要があります。ここで、最初のエントリから最も低いものを確認します。

配列カードは、手の値のみを整数で格納することに注意してください。

// Variables to store the current and previous cards.
int previous = 0;
int current = 0; 

cards = Arrays.sort(cards); // Sort cards into ascending order

boolean straightFlush = false;

for (i = 0; i < cards.length; i++) {
    current = cards[i];
    if (!current == cards[0]) { // If current is not the first card, execute the rest. You don't want random errors popping up, do you? :)
        // Check if it is the last card - a straight flush would then be present
        if (current == cards[cards.length - 1]) {
            straightFlush = true;
            break;
        }

        // Checks if current - 1 != previous or the current card is not consecutive to the previous card
        if (current - 1 != previous) {
            break;
        }
    }
...

では、手を比較する方法は?それがストレートフラッシュである場合、カードの中で最も高い値を見つけます。

これについてはすぐに投稿します。

于 2012-08-10T09:43:10.510 に答える
0

TestCard文字列の配列から2つのランダムな値を表示する代わりに、クラスを変更することで勝者を決定することができました。配列から1つの値のみが表示されるように変更しました。それで私は勝者が誰であるかを決定することができました。

于 2012-08-08T13:08:26.947 に答える
0

メソッドを使用するString.parseInt()と、文字列内の数値が返されます。ただし、エース、カインド、クイーン、ジャックは数字ではないため、問題が発生します。次のようなステートメントを作成することをお勧めします。

if(!cardFaces[x].equals("Ace")&&!cardFaces[x].equals("Queen")&&!cardFaces[x].equals("King")&&!cardFaces[x].equals("Jack"))
  {
    int temp = cardFaces[x].parseInt();
   }
else if(cardFaces[x].equals("Ace")
{
  int temp = 1;
}
else if(cardFaces[x].equals("King") || cardFaces[x].equals("Queen") || cardFaces[x].equals("Jack"))
{
 int temp = 10;
于 2012-08-06T15:07:38.313 に答える
0

カードをクラスまたは少なくとも列挙型にすることをお勧めします。次に、それらを合計すると意味があります。

また、この2つを説明してください

public String setCompCardFace()
public String setCompCardFace2()  //identical

必要なのは、各プレイヤーが最初と同じようにカードのインスタンスを持つことです

public class Cards extends ArrayList<Card>

しかし、途中で道に迷い、これら 2 つのクラスを混同して、実際には何もしない 1 つのクラスにします。

だからあなたのカードにこれらを入れます

public class Card 
{
    private String suit;
    private String face;

    public Card(String face, String color)
    {
        suit = color; this.face = face;
    }

    @Override
    public int compareTo(Card otherCard); //implement this yourself
 }
于 2012-08-06T15:00:07.947 に答える