1

私はポーカーゲームに取り組んでいます。これまでのところ、私はポーカーハンドの比較にこだわっています。私はそれをどのように行うかについてある程度の考えを持っていますが、私のコードの何が悪いのかわかりません。誰かが何が悪いのか指摘してもらえますか?

それでは、私のコードが何をしているのかを簡単に説明しましょう。

プログラムの他の部分では、手札のカードを調べて、カード値の頻度を配列にリストします。

h = Hearts
c = Clubs
d = Diamonds
s = Spades
d4 = 4 of Diamond

つまり、私の手にc3、h4、d4、s4、2dがあるとしましょう。プログラムの他の部分を呼び出して、手にあるカードを読み取り、集計配列を返します。上記の私の手の集計配列は[0,0,1,1,3,0,0,0,0,0,0,0,0,0]になります。つまり、この配列が言っていることは、私の手が1つ2つ、1つ3つ、3つ4つあります。

これが、Three of a Kindを見つけようとする私の方法です。フルハウス(3種類とペア)の場合はfalseを返す必要があります。

public boolean hasThreeOfAKind() {
    int [] temp;
    temp = this.getCounts();
    for (int i = 0; i< temp.length; i++){
        if (temp [i] == 3 ){
            for (int j = 0; j < temp.length ; j++)
                if ( temp [j] != 2){
                    return true;
                }
        }
    }return false;

したがって、上記で実行しようとしているのは、最初に配列を実行し、3がある場合は配列を実行し、3がある場合は配列を再度実行して、2があるかどうかを確認します。 a 2、それなら私はそれが3種類であることを知っています。2がある場合、それはフルハウスであり、falseを返す必要があります。私の論理は正しいと思いますが、私のコードに何か問題があります。

そして、私が問題を抱えている秒針は、私の手が正確に1つのペアを持っているかどうかを判断する方法です。ペアが1つしかない場合にのみtrueを返します。2つのペアなどがある場合はfalseを返します。

public boolean hasOnePair() {
    int [] temp;
    temp = this.getCounts();

    for (int i = 0; i< temp.length; i++){
        if (temp [i] == 2 ){
            return true;
        }
    }return false;

これについては、配列内の値を降順または昇順で並べ替えることを考えています。降順を選択した場合、最初に配列を読み取り、2があるかどうかを確認します。次に、次の配列をスキャンして、最初の2の後の次の値も2であるかどうかを確認します。別の2がある場合は、 falseを返します。

誰かが私のコードを見て、何が悪いのか指摘してもらえますか?どうもありがとうございます。

4

5 に答える 5

4

なぜこのような低レベルのプリミティブを使用しているのですか?本格的なカードクラスを使用していない理由はありますか?コードははるかに単純になります。

class Card
  enum Value {
    TWO,
    ...
    ACE
  };

  enum Suit {
    SPADES,
    ...
    CLUBS

  };
  private Suit suit;
  private Value value;

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

public class Hand {
  private final List<Card> cards;
  public Hand(Card first, Card second, Card third, Card fourth, Card fifth) {
     // add to cards list.

     // sort ascending by value

  }

  public boolean hasThreeOfAKind() {
    for (int i = 0; i < 3; i++) {
      Value firstValue = cards.get(i).getValue();
      Value secondValue = cards.get(i+1).getValue();
      Value thirdValue = cards.get(i+2).getValue();
      if (firstValue == secondValue && secondValue == thirdValue) {
        return true;
      }
    }
    return false;
  }
}

これはあなたの質問に直接答えるものではありませんが、私の意見では、この種のコードは整数のみを含むコードよりもはるかに読みやすく、保守しやすく、デバッグが容易です。JavaはCではなく、Cのように扱うことで実際に多くを得ることができません。

于 2012-04-28T01:44:00.290 に答える
2

あなたhasThreeOfAKind()には次のエラーがあります:

for (int j = 0; j < temp.length ; j++) 
  if ( temp [j] != 2){ 
    return true; 
  } 
} 

これは、2以外のjを最初に見つけたときにtrueを返します(これは、その上でチェックした3で統計化されます。したがってtrue、満員の家に戻ります。代わりに、次が必要です。

boolean foundTwo = false;
for (int j = 0; j < temp.length ; j++) 
  if ( temp [j] == 2){ 
    foundTwo = true; 
  }
} 
if (!foundTwo) {
  return false;
}

他の場合も同様です。すでに見つけたものとは異なる別の2つを見つけたかどうかを確認する必要があります。

for (int i = 0; i< temp.length; i++) {  
  if (temp [i] == 2 ){
    boolean foundAnother = false;
    for (int j = 0; j< temp.length; j++) { 
      if (i != j && temp [j] == 2 ){
        foundAnother = true;  
      }  
    }
    if (!foundAnother) {
      return true;
    }
  }  
}
return false;  

もう1つできることは、認識された手ごとにフィルターを用意することです。ペアフィルター、スリーフィルター、フルハウスフィルターなど、これらすべてのフィルターを手に通します。より良い(より高い値の)一致があるかどうかを心配する必要はありません。どのフィルターがtrueを返すか(探していたパターンを見つけた)を確認し、合格したフィルターの中から最も高いポイント値を選択してください。

于 2012-04-28T01:33:26.893 に答える
0

threeOfAKindメソッドでは、配列に格納されている最初の数値が2でない限り、2番目のforループは1回だけ実行され、次のようになります。

public boolean hasThreeOfAKind() {
    int [] temp;
    temp = this.getCounts();
    for (int i = 0; i< temp.length; i++){
        if (temp [i] == 3 ){
            for (int j = 0; j < temp.length ; j++)
                if ( temp [j] == 2){
                    return false;
                }
        }
    }
    return true;
}

上記のコードでは、最初にペアに当たったときに、その手が3種類ではなく完全な家であることに気づき、falseを返します。

他のメソッドhasOnePair()については、次のようになります。

public boolean hasOnePair() {
    int [] temp;
    temp = this.getCounts();
    int count = 0;

    for (int i = 0; i< temp.length; i++){
        if (temp [i] == 2  ){
            count++;
        }
    }
    return count == 1;
}
于 2012-04-28T01:37:54.173 に答える
0

同様のカードの番号を探して、配列を作成します。SOカード{1,1,2,2,2,5,7}(今のところスーツは無視しましょう)は(3,2,1,1)にマップされます。つまり、2番目の配列を簡単に確認できるフルハウスです。

于 2015-07-29T00:54:56.177 に答える
0

私は息子が大学のJavaコース(私が教えていたコース)で同様の問題を抱えているのを手伝っています。これが私が提案することです。

まず、スーツに関係なく、カードを最低から最高の2からエースに並べ替えます。次に、比較します。card [0] ==card[3]またはcard[1]== card [4]の場合、4種類あり、次の2行は無視してください。card [0] ==card[2]またはcard[1]==card[3]またはcard[2]== card [4]の場合、3種類ありますが、次の行は無視してください。card [0] ==card[1]またはcard[1]==card[2]またはcard[2]==card[3]またはcard[3]== card [4]の場合、ペアになります。

于 2019-12-03T01:13:03.817 に答える