2016-03-24 10 views
0

4 oyuncunun rasgele 54 oyun kartını dağıtan bir betik var, rastgele bir kart elde etmek için 2 rastgele sayı üretecek, kategori numarası (1'den 4'e) anlamına geliyor: "kalpler" , maça, elmas, kulüp "ve kart numarası (1 ila 13 arası).jquery: çok fazla yinelemeden kaçının

Sorun, bu komut dosyasında çok fazla yineleme var, bu yüzden bu hatayı, iş parçacıklarındaki veya benzer bir işlevdeki işlevleri arayarak nasıl önleyebilirim?

kodum:

$(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

ÖzgünRandomCard() özyinelemeli yineleme ile tek bir işlev gibi görünüyor ve kendi kendine döndüğünde, dönüş değeriyle hiçbir şey yapmıyor olması mantıklı bir hatadır. Bu döngü ile undefined için kontrol eden diğer işlevdeki while döngüsü ile baş edersin, ancak doğrudan düzeltmek daha iyi olmaz mıydı? Ama neden orada özyinelemeyi kullandığınızı bilmiyorum - uniqueRandomCard() içinde bir süre döngü kullanamaz mıydınız? – nnnnnn

+0

@nnnnnn yinelemeli olarak çağrılmalıdır, "used_cards" dizisinde bulunmayan bir değer döndürene kadar – Mohammad

+0

@nnnnnn evet, while döngüsü daha iyi bir fikir olurdu, nasıl denemeyi düşünmedim !! teşekkürler – Mohammad

cevap

1

Özyineleme Siz uyguladıktan şekilde Tespit oldukça kolaydır. Aramanızın ve if ifadesinin bir while ifadesiyle değiştirilmesi yeterlidir.

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

Bunun gibi sınırlı kümeleri ele almanın bazı temel daha iyi yolları olduğu söyleniyor. Kullanılmayan kartları saklamak ve rastgele seçim yapmak çok daha üstün.