2016-03-24 10 views
0

私は54人のトランプカードを4人のプレイヤーに無作為に配布するスクリプトを持っています。ランダムなカードを得るために2つの乱数、カテゴリー番号(1から4まで) 、スペード、ダイヤモンド、クラブ "、カード番号(1〜13)が含まれます。jquery:あまりにも多くの再帰を避ける

このスクリプトでは再帰が多すぎるので、どのようにスレッドまたは類似の関数を呼び出すことでこのエラーを回避できますか?

私のコード:再帰を修正

$(document).ready(function(){ 
    var human = []; 
    var east = []; 
    var west = []; 
    var north = []; 
    var used_cards = []; 

    distributeCards(north,$('#north')); 
    distributeCards(east,$('#east'),'vertical'); 
    distributeCards(west,$('#west')); 
    distributeCards(human,$('#south')); 

    function distributeCards(array,container,view){ 
     for(var i = 0; i < 13; i++){ 
      var category,card; 
      do{ 
       var uniqueCard = uniqueRandomCard(); 
      }while(typeof uniqueCard === "undefined") 
      category = uniqueCard[0]; 
      card = uniqueCard[1]; 
      array.push(uniqueCard); 
      var category_name = ''; 
      if(category === 1){ 
       category_name = 'hearts'; 
      } 
      else if(category === 2){ 
       category_name = 'spades'; 
      } 
      else if(category === 3){ 
       category_name = 'diamonds'; 
      } 
      else if(category === 4){ 
       category_name = 'clubs'; 
      } 
      if(card === 1){ 
       card = 'ace'; 
      } 
      else if(card === 11){ 
       card = 'jack'; 
      } 
      else if(card === 12){ 
       card = 'queen'; 
      } 
      else if(card === 13){ 
       card = 'king'; 
      } 
      if(view === 'vertical'){ 
       $(container).children('.row').append('<img src="cards/backRotate.png" class="card"/>'); 
      } 
      else if(view === 'horizontal'){ 
       $(container).children('.row').append('<img src="cards/back.png" class="card"/>'); 
      } 
     } 
    } 
    function randomNumberFromRange(min,max){ 
     return Math.round(Math.floor(Math.random()*max)+min); 
    } 
    function uniqueRandomCard(){ 
     var card = randomNumberFromRange(1, 13); 
     var category = randomNumberFromRange(1, 4); 
     if(!inAssocArray(category,card,used_cards)){ 
      var array = []; 
      array[0] = category; 
      array[1] = card; 
      used_cards.push(array); 
      return array; 
     } 
     else{ 
      uniqueRandomCard(); 
     } 
    } 
    function inAssocArray(key,value,array){ 
     var flag = false; 
     for(var i = 0; i < array.length; i++){ 
      if(array[i][0] === key && array[i][1]=== value){ 
       flag = true; 
      } 
     } 
     return flag; 
    } 
}); 
+2

あなたのuniqueRandomCard()関数は再帰を持つ唯一のようであり、それ自身を呼び出すときに戻り値で何もしないという点で論理的なエラーがあります。あなたは未定義をチェックする他の関数のwhileループを使ってそれに対処しますが、それを直接修正する方がいいでしょうか?しかし、私はなぜそこで再帰を使用するのかわかりません - あなたはuniqueRandomCard()の中でwhileループを使用できませんでしたか? – nnnnnn

+0

@nnnnnn 'used_cards'配列に見つからない値を返すまで、再帰的に呼び出さなければなりません。 – Mohammad

+0

@nnnnnnええ、whileループは良いアイデアです。感謝 – Mohammad

答えて

1

あなたはそれが非常に簡単です実装しました方法。あなたの呼び出しとif文をwhile文で置き換えるだけです。

function uniqueRandomCard(){ 
    var card = randomNumberFromRange(1, 13); 
    var category = randomNumberFromRange(1, 4); 
    while(inAssocArray(category,card,used_cards)) { 
    card = randomNumberFromRange(1, 13); 
    category = randomNumberFromRange(1, 4); 
    } 
    var array = []; 
    array[0] = category; 
    array[1] = card; 
    used_cards.push(array); 
    return array; 
} 

これは、このような限られたセットを処理するいくつかの基本的なより良い方法があると言われています。未使用のカードを保管し、それからランダムに選択することははるかに優れています。

関連する問題