2012-04-28 4 views
1

私はポーカーゲームに取り組んでいます。これまでは、私はポーカーの手を比較することに固執しています。私はそれを行う方法について考えているが、コードに何が間違っているか分からない。誰かが間違っていることを指摘できますか?Javaでのポーカーハンドの比較

私のコードが何をしているのかを簡単に説明します。

私のプログラムの私の他の部分は、私の手札のカードを通過し、配列のカードの値の頻度を列挙します。

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

がスリーを見つけようとの私の方法でありました、それは(種類プラスペアの3である)完全な家のため

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; 
をfalseを返す必要があります

だから私が上でやろうとしているのは、最初に配列を実行し、もしあれば3を返します。もし3があれば、再び配列を実行し、 2つではない、私はそれが3つの種類であることを知っています。 2がある場合は、それはフルハウスであり、私はfalseを返します。私の論理は正しいと思うが、私のコードには何か問題がある。

私が問題を抱えている第二の手は、私の手が完全に一組であるかどうかを判断する方法です。ペアが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であるかどうかを調べることができます。 falseを返します。

誰かが自分のコードを見て、間違っていることを指摘できますか?どうもありがとうございました。これ - それはあなたがちょうどその上にチェック3でstatisfiedされる非2 jで(見つけ

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

これが真の最初の時間を返します。あなたのhasThreeOfAKind()次のエラーを持って

答えて

2

。完全な家のための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つのことは、認識されたそれぞれの手のためのフィルタを持っていることです:ペアフィルタ、3フィルタ、フルハウスフィルタなど。手ですべてのフィルタを実行します。より良い(より高い値)一致がある場合は心配する必要はありません。どのフィルタが真を返すか(探しているパターンが見つかりました)を確認して、合格したものの中で最も高いポイント値を選択してください。

+0

ありがとうございます。私のコードは今働いている。 – ScoutBlade

0

threeOfAKindメソッドでは、上記のコードで

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; 
} 

、それがいることを実現ペアを打つ初めて:ループための第二は、あなたの配列に格納された最初の数が2である場合を除き、それはより多くのように、これを見てする必要があり、一度実行されます手は種類の3つではなく、フルハウスであり、偽を返します。

とあなたの他の方法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; 
} 
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のように扱うことでそれほど多くは得られません。

+0

私は同意します。このような構造を使用する方がずっと簡単です。 – CaffeinatedCM

+0

私は説明目的であることを知っていますが、あなたの 'hasThreeOfAKind'はそれほど有用ではありません。最初の3枚のカードしかチェックしません。さらに、5つのカード内のすべての組み合わせをチェックするためにロジックを拡張することは難しいでしょう。 – Attila

+0

@Attilaもう一度それを読んでください。イテレーション0チェック0 1 2.イテレーション1チェック1 2 3.イテレーション2チェック2 3 4。これにより、5枚のカードすべてが徹底的にチェックされます。 – I82Much

0

それぞれの類似したカードの番号を探して配列を探します。 SOカード{1,1,2,2,2,5,7}(現在のところスーツを無視する)は、(3,2,1,1)すなわち2番目の配列を簡単にチェックできるフルハウスにマップされます