1

コンソール テキサス ホールデム ポーカーを作成しています。私はすでにこのゲームの作成を完了しており、すべてが想定どおりに機能しています。コードを書くための最良の方法について未定になったフルハウスを期待してください。

これが私がカードを提示する方法です:「D5」、「S2」、「SA」...カードを表すのが悪い考えであることは知っていますが、現在OOPの方法で考えていません。実際に遊んでいますこれは優れたコード プラクティスです。

問題はペアやスリーカードをどう書くかではなく、私は実際にこのようなことをする素晴らしいアイデアを思いつきました...

if (isPair() && isThreeOfKind()) {
   //
}

しかし、それは不可能です。なぜなら、私は (私がここにいる) 問題を扱っていて 、同じカードisPair()isThreeOfAKind()見つける"DA", "CA", "SA"からです。 ."DA""CA""DA", "CA", "SA"

コードの更新:

public boolean isPair(int playerIndex) {
        boolean isPair = false;

        if (hasSameRank(playerAndHand[playerIndex])) {
            isPair = true;
        } else {
            for (int i = 0; i < TABLE_CARDS_LENGTH; i++) {
                for (int j = 0; j < HAND_CARDS_LENGTH; j++) {
                    if (playerAndHand[playerIndex][j].charAt(1) == tableCards[i].charAt(1)) {
                        isPair = true;
                        break;
                    }
                }
                if (isPair) break; 
            }
        }
        return isPair;
    }

public boolean isThreeOfKind(int playerIndex) {
        boolean isThreeOfKind = false;

        // 2 from player hand 1 from table
        if (hasSameRank(playerAndHand[playerIndex])) {
            for (int i = 0; i < TABLE_CARDS_LENGTH; i++) {
                if (playerAndHand[playerIndex][0].charAt(1) == tableCards[i].charAt(1)) {
                    isThreeOfKind = true;
                    break;
                }
            }
        } else {
            for (int i = 0; i < TABLE_CARDS_LENGTH; i++) {
                // first card in player hand and 2 more on table
                if (playerAndHand[playerIndex][0].charAt(1) == tableCards[i].charAt(1)) {
                    for (int j = 0; j < TABLE_CARDS_LENGTH; j++) {
                        if (j != i) {
                            if (playerAndHand[playerIndex][0].charAt(1) == tableCards[j].charAt(1)) {
                                isThreeOfKind = true;
                                break;
                            }
                        } else {
                            continue;
                        }
                    }
                    if (isThreeOfKind) break;
                    // second card in player hand and 2 more on table   
                } else if (playerAndHand[playerIndex][1].charAt(1) == tableCards[i].charAt(1)) {
                    for (int j = 0; j < TABLE_CARDS_LENGTH; j++) {
                        if (j != i) {
                            if (playerAndHand[playerIndex][1].charAt(1) == tableCards[j].charAt(1)) {
                                isThreeOfKind = true;
                                break;
                            }
                        } else {
                            continue;
                        }
                    }
                    if (isThreeOfKind) break;
                }                   
            }
        }
        return isThreeOfKind;
    }
4

3 に答える 3

0

このような「単純な」ポーカー ハンド エバリュエーター (つまり、各ハンド タイプを個別に照合するもの) は、次の順序でハンドをテストする必要があります: ストレート フラッシュ、フラッシュ、ストレート、クワッド、フル ハウス、トリップ、ツー ペア、および最後にシングルペア。この順番で実行するときは、関数を見つけたらその関数から戻る必要があります。ランクでハンドをソートすると、はるかに簡単になります。また、内部表現にテキストを使用することはお勧めできません。このテーマに関する私のエッセイをチェックしてください: Representing Cards in Software . そのエッセイには、より洗練されたポーカー コードへのリンクもたくさんあります。これには、私自身のもの (Java バインディングがあります) も含まれます。

于 2013-05-31T21:58:52.490 に答える
0

isThreeOfKindカードの値を返すか、3 種類がない場合は空白の文字を返すように取得します。次にisPair、無視するカードの値を受け入れる必要があります。したがって、フルハウスの小切手は になりisPair(playerIndex, isThreeOfKind(playerIndex))ます。

通常のスリー・オブ・ア・カインドのチェックはスリー・オブ・ア・カインドであることに注意してくださいif (isThreeOfKind(playerIndex)!='')。あなたの通常の Is Pair チェックは になりif (isPair(playerIndex,''))、それはペアです。

例:

public boolean isPair(int playerIndex, char charToIgnore) {
        boolean isPair = false;

        if (hasSameRank(playerAndHand[playerIndex])) {
            isPair = true;
        } else {
            for (int i = 0; i < TABLE_CARDS_LENGTH; i++) {
                if (tableCards[i].charAt(1) == charToIgnore) continue;
                for (int j = 0; j < HAND_CARDS_LENGTH; j++) {                        
                    if (playerAndHand[playerIndex][j].charAt(1) == tableCards[i].charAt(1)) {
                        isPair = true;
                        break;
                    }
                }
                if (isPair) break; 
            }
        }
        return isPair;
    }

public char isThreeOfKind(int playerIndex) {
        boolean isThreeOfKind = false;
        char cardValue = '';

        // 2 from player hand 1 from table
        if (hasSameRank(playerAndHand[playerIndex])) {
            for (int i = 0; i < TABLE_CARDS_LENGTH; i++) {
                if (playerAndHand[playerIndex][0].charAt(1) == tableCards[i].charAt(1)) {
                    cardValue = tableCards[i].charAt(1);
                    isThreeOfKind = true;
                    break;
                }
            }
        } else {
            for (int i = 0; i < TABLE_CARDS_LENGTH; i++) {
                // first card in player hand and 2 more on table
                if (playerAndHand[playerIndex][0].charAt(1) == tableCards[i].charAt(1)) {
                    for (int j = 0; j < TABLE_CARDS_LENGTH; j++) {
                        if (j != i) {
                            if (playerAndHand[playerIndex][0].charAt(1) == tableCards[j].charAt(1)) {
                                cardValue = tableCards[j].charAt(1);
                                isThreeOfKind = true;
                                break;
                            }
                        } else {
                            continue;
                        }
                    }
                    if (isThreeOfKind) break;
                    // second card in player hand and 2 more on table   
                } else if (playerAndHand[playerIndex][1].charAt(1) == tableCards[i].charAt(1)) {
                    for (int j = 0; j < TABLE_CARDS_LENGTH; j++) {
                        if (j != i) {
                            if (playerAndHand[playerIndex][1].charAt(1) == tableCards[j].charAt(1)) {
                                cardValue = tableCards[j].charAt(1);
                                isThreeOfKind = true;
                                break;
                            }
                        } else {
                            continue;
                        }
                    }
                    if (isThreeOfKind) break;
                }                   
            }
        }
        return cardValue;
    }
于 2013-06-01T02:20:43.913 に答える
0

if(isThreeOfKind() && cardTypes() ==2 && !(isFourOfKind()))

... フルハウスには 2 つの異なる値しかないため (f. ex AAA 7 7)

于 2013-05-31T21:43:48.470 に答える