2017-03-02 1 views
0
public static ArrayList<Hand> getPossibleHands(Hand h) { 
    ArrayList<Hand> allPossible = new ArrayList<Hand>(); 
    addNext(allPossible, h); 
    return allPossible; 
} 

public static void addNext(ArrayList<Hand> poss, Hand h) { 
    if (h.cards.size() == 5) 
     poss.add(h); 
    else 
     for (int i = 0; i < 52; i++) { 
      Card c = Card.makeCard(i); 
      if (!h.contains(c)) 
       h.add(c); 
      addNext(poss,h); 
     } 
} 

上記のコードは、基本的に不完全なポーカーボード(0-4カードのいずれか)を取って、可能なすべての完全なボード(5枚のカード)を返すことになっています。私がそれが続くべきであると感じるロジックは以下の通りです:ボードのサイズが5に等しくなるまで有効な(ボード上ではない)カードを追加するすべての組み合わせを繰り返します。この場合、ボードをリストに追加し、残りの機能はスキップしてください。私のポーカーゲームの再帰ロジックをデバッグするには?

しかし、関数の最初にprintステートメントを使用すると、手のサイズが5より大きいか、作成されていることがわかります。関数の最初の部分は5ですべての手をキャッチしてそこで終了する必要があるので、残りの関数でコードがどのように実行されるかわかりません。

+0

は、カードの順番は重要ですか?つまり、カードの順番が異なるだけであれば、2本の手は区別されますか? –

+0

@Scott Hunterいいえ、注文は関係ありません –

答えて

0

当初、hは(おそらく)空です。したがって、addNextはすべての可能なカードをループし、いずれも手札にないので、現在何枚のカードが手に入っているかにかかわらず、各カードを手札に加える。

-1

ループでは、52回の反復を実行します。各反復であなたは(条件付きで)手札にカードを追加し、次にあなたの関数を再帰的に呼び出します。しかし、再帰呼び出しが戻った後、次の反復に行き、もう一度手札にカードを追加します。

「5カード制限」はここでは何も制限しません。

0

あなたのループのように見えますが、最終的に手にデッキ全体を追加しています。

1

クラスは空の手でスタックオーバーフローを受け取る必要があります。 あなたは新しいカード(0)を手札に送ります。これが追加されました。 次にadd nextを呼び出すと、 'for'は再び0から始まります。チェックは1を加算します。0から始まります - そこには何も追加せずにやり直します。 0から始まるところは何もしません。 0から始まる。Ad infinum - > StackOverFlow。

5枚のカードで終わり、バックトラックするたびに、前の状態に戻す必要があります。

あなたは再帰的なソリューションをしたい場合は、あなたが試すことができます:

private static ArrayList<Hand> getPossibleHands(Hand h) { 
     ArrayList<Integer> except; 
     if (h.cards == null) except = new ArrayList<>(); 
     else 
      except = h.cards.stream().map(c -> (c.getCard())).collect(Collectors.toCollection(ArrayList::new)); 
     ArrayList<Hand> allPossible = new ArrayList<>(); 
     addNext(allPossible, h, except); 
     return allPossible; 
    } 

    private static void addNext(ArrayList<Hand> poss, Hand h, ArrayList<Integer> except) { 
     //assuming hands 0-4 - we don't need to check on entry, only when we add 
     Hand localHand = h.copy(); 
     for (int i = 0; i < 52; i++) { 
      if (except.contains(i)) continue; 
      Card c = Card.makeCard(i); 
      if (!localHand.contains(c)) { 
       addNext(poss, localHand.copy(), copyExcept(except, i)); 
       localHand.add(c); 
       if (localHand.cards.size() == 5) { 
        poss.add(localHand); 
        break; 
       } 

      } 
     } 

    } 

    private static ArrayList<Integer> copyExcept(ArrayList<Integer> except, int i) { 
     ArrayList<Integer> clonedExcept = new ArrayList<>(except); 
     clonedExcept.add(i); 
     return clonedExcept; 
    } 


import java.util.ArrayList; 

public class Hand { 
    ArrayList<Card> cards = new ArrayList<>(); 

    public boolean contains(Card c) { 
     for (Card card : cards) { 
      if (card.getCard() == c.getCard()) 
       return true; 
     } 
     return false; 
    } 

    public void add(Card c) { 
     cards.add(c); 
    } 

    Hand copy() { 
     Hand temp = new Hand(); 
     for (Card c : cards) { 
      temp.add(new Card(c.getCard())); 
     } 
     return temp; 
    } 
} 


class Card { 
    private int card; 

    public Card(int card) { 
     this.card = card; 
    } 

    public static Card makeCard(int i) { 
     return new Card(i); 
    } 

    public int getCard() { 
     return card; 
    } 
} 
+0

これは必要以上に複雑に思えます...私はショットをつけますが、自分のクラスとメソッドを使いたいです。私は、重複を持って、含まれているメソッドを追加します。私はあなたのソリューションにgetCard()が何であるか分かりません。 –

+0

カードクラスを追加して編集しました。それよりももっと複雑であると確信しています:)私はそれの短いバージョンで来ることができるかどうかを見てください。 –

関連する問題