2016-03-19 11 views
0

最初の質問はここにあります... 私は単純な3枚のカードのハンドの評価者をコーディングしていて、複数の "ストレート" )を値の配列から削除します。値の配列で3つのシーケンスをすべて見つける方法

私はすべての直線を抽出して返す必要があります。ここでの例は次のとおり

(アレイが第一増分数値的にソートされると仮定)

myArray = [1h,2h,3c,3h,4c] 

可能な3値の配列である: [1H、2H、3C] [1H、2H、3H] [2h、3c、4c]

ここで、配列に.valueと.suitのカードオブジェクトが含まれている3のシーケンスを見つけるための私のオリジナルコードです。この質問を簡単にするために私はここで、「2時間」などを置く:もちろん

private var _pokerHand = [1h,2h,3c,3h,4c]; 
private function getAllStraights(): Array 
{ 
    var foundStraights:Array = new Array(); 
    for (var i: int = 0; i < (_handLength - 2); i++) 
    { 
     if ((_pokerHand[i].value - _pokerHand[i + 1].value) == 1 && (_pokerHand[i + 1].value - _pokerHand[i + 2].value) == 1) 
     { 
      trace("found a straight!"); 
      foundStraights.push(new Array(_pokerHand[i], _pokerHand[i + 1], _pokerHand[i + 2])); 
     } 
    } 
    return foundStraights; 
} 

が、それは(3の上記のような)値の重複がある場合に失敗します。彼らは異なるスーツになる可能性があるので、私は重複を捨てることはできません。私は上記の例のようにすべてのストレートが必要です。これは私が "ストレートフラッシュ"を見つけるために "フラッシュ"機能を通してストレートを走らせることを可能にする。

どのような配列の反復方法がありますか?

+0

私は別の解決策を見つけた可能性があります。私は最初にスーツのソートと重複カードの破棄(一時的)によってストレートフラッシュをチェックする必要があります。ストレートフラッシュが見つからない場合は、再度ストレートをチェックすることができます。この時点でスーツは重要ではありません。 – LilGames

答えて

1

これは興味深い問題です。ポーカーゲーム(およびFlash)の人気を考えると、これは何度も解決されていると確信していますが、私はオンラインの例を見つけることができませんでした。ここに私はそれにアプローチする方法です:

  • それはパスの問題を見つけるのように見てください。
  • 手の中のすべてのカードを、可能なパスの開始点(直線)として開始します。
  • 可能なストレートはありますが、
    • リストから1つを削除してください。
    • は、すべての次の有効な手順を探す(何もすることができなかった、または最大4に同じ値を持つカード以下)、及び各次の有効なステップのために:
      • は、それがゴールに到達した場合は追加(ストレートを完成)見つかったストレートのリストに。
      • それ以外の場合は、次のステップでスタックを追加します。

これは、あなたが(Cardオブジェクトがintとして.valueを持って)やりたいようだ:[1♥,2♥,3♣,3♥,4♣]考える

private function getAllStraights(cards:Vector.<Card>, straightLength:uint = 3):Vector.<Vector.<Card>> { 
    var foundStraights:Vector.<Vector.<Card>> = new <Vector.<Card>>[]; 

    var possibleStraights:Vector.<Vector.<Card>> = new <Vector.<Card>>[]; 
    for each (var startingCard:Card in cards) { 
     possibleStraights.push(new <Card>[startingCard]); 
    } 

    while (possibleStraights.length) { 
     var possibleStraight:Vector.<Card> = possibleStraights.shift(); 
     var lastCard:Card = possibleStraight[possibleStraight.length - 1]; 
     var possibleNextCards:Vector.<Card> = new <Card>[]; 
     for (var i:int = cards.indexOf(lastCard) + 1; i < cards.length; i++) { 
      var nextCard:Card = cards[i]; 
      if (nextCard.value == lastCard.value) 
       continue; 
      if (nextCard.value == lastCard.value + 1) 
       possibleNextCards.push(nextCard); 
      else 
       break; 
     } 
     for each (var possibleNextCard:Card in possibleNextCards) { 
      var possibleNextStraight:Vector.<Card> = possibleStraight.slice().concat(new <Card>[possibleNextCard]); 
      if (possibleNextStraight.length == straightLength) 
       foundStraights.push(possibleNextStraight); 
      else 
       possibleStraights.push(possibleNextStraight); 
     } 
    } 

    return foundStraights; 
} 

あなたが得る:[1♥,2♥,3♣], [1♥,2♥,3♥], [2♥,3♣,4♣], [2♥,3♥,4♣]

とき、それは本当に面白いです[1♥,1♣,1♦,1♠,2♥,2♣,3♦,3♠,4♣,4♦,4♥]のような重複がたくさんあります。これはあなたを与える:私は徹底的にこれをチェックしていないが、それは右一目見

[1♥,2♥,3♦], [1♥,2♥,3♠], [1♥,2♣,3♦], [1♥,2♣,3♠], [1♣,2♥,3♦], [1♣,2♥,3♠], [1♣,2♣,3♦], [1♣,2♣,3♠], [1♦,2♥,3♦], [1♦,2♥,3♠], [1♦,2♣,3♦], [1♦,2♣,3♠], [1♠,2♥,3♦], [1♠,2♥,3♠], [1♠,2♣,3♦], [1♠,2♣,3♠], [2♥,3♦,4♣], [2♥,3♦,4♦], [2♥,3♦,4♥], [2♥,3♠,4♣], [2♥,3♠,4♦], [2♥,3♠,4♥], [2♣,3♦,4♣], [2♣,3♦,4♦], [2♣,3♦,4♥], [2♣,3♠,4♣], [2♣,3♠,4♦], [2♣,3♠,4♥]

+0

ありがとう!私はテストする必要がありますが、今のところ正しいとマークします。 – LilGames