2012-07-25 54 views
0

我正在嘗試創建一個Javascript卡片遊戲,但我需要匹配到4個列表中的數字。但我總是創建一些瘋狂的分層循環:匹配到一個有序數組

cards = [{card:'h7'},{card:'c8'},{card:'h9'},{card:'st'}] 
var sorted = ['7','8','9','t','j','q','k','a']  

var found4 = false 
for(var i =0;i < 5;i++){ 
    var found = 0;   
    for(var j = 0;j < 4;j++){    
     for(var c in cards){ 
      if(cards[c].card.charAt(1) == sorted[i+j]){ 
       found++ 
      } 
     } 
    } 
    if(found == 4){ 
     found4 = true 
    } 
} 

是否有更好的方法來匹配數組?

一些輸入例子:

'7','8','9','t' => true 
'j','q','k','a' => true 
'7','8','k','a' => false 
'j','k','7','a' => false 

(輸入不排序)

+2

分配每卡標誌的流水號代替。然後,您可以簡單地測試從一張卡到下一張卡的距離(在排序列表上)。如果該距離大於1,則沒有序列。 – Yoshi 2012-07-25 09:43:55

+0

順便說一句,h7的意思是7,st意味着t?我不知道這個遊戲:P – Tamil 2012-07-25 09:45:56

+1

@Tamil h7是他的編碼中的「7顆心」,「st」是「黑桃10」。 – 2012-07-25 09:51:21

回答

0

我會對西裝和價值不同的領域。這樣就可以更容易地測試值是否有序。請注意,下面的代碼不包括範圍檢查或其他驗證,但我假設這是照顧。

// Suit is [c]lubs, [d]iamonds, [h]earts, or [s]pades 
// Value is from Ace (1) to King (13). Jack is 11, and Queen is 12. 
cards = [ 
    {suit:'h', value: 7 } // 7 of hearts 
    {suit:'c', value: 8 } // 8 of clubs 
    {suit:'h', value: 9 } // 9 of hearts 
    {suit:'s', value: 10 } // Ten of spades 
    {suit:'s', value: 11 } // Jack of spades 
] 

if (cards.length <= 1) 
{ 
    // Having 0 or 1 cards means they are, by definition, in order. 
    return true; 
} 

// Test each card (starting with the second) to ensure that it is 
// 1 greater than it's predecessor. 
var previousValue = cards[0].value; 
for(var i = 1; i < cards.length; i++){ 
    if (previousValue + 1 != cards[i].value) 
    { 
     // This card is not the next card in sequence, so 
     // the hand is not in order. 
     return false; 
    } 
} 

return true; 
1

你可以寫爲陣的原型方法(可以參考以下post)作爲

Array.prototype.contains = function(obj) { 
    var i = this.length; 
    while (i--) { 
     if (this[i] == obj) { 
      return i; 
     } 
    } 
    return false; 
} 

var sorted = ['7', '8', '9', 't', 'j', 'q', 'k', 'a'] 

function check(arr) { 
    index = sorted.contains(arr[0]) 
    if (index === false) { 
     return false; 
    } 
    count = 1 
    for (var i = 1; i < 4; i++) { 
      sortedIndex = index + i > sorted.length ? index + i - sorted.length : index + i 
     if (sorted[sortedIndex] == arr[i]) count++; 
     } 
     if (count == 4) { 
      return true; 
     } 
     return false; 
    } 

console.log(check(['j','q','k','a']))​ 

你可以看到它的工作here

0

首先,你的算法應該都工作在陣列(沒有固定的長度等),所以讓我們讓字符找到:

var tofind = cards.map(function(c){return c.card.charAt(1);}); 

當你所有的作品都長一個,有一個很簡單的功能,以幫助您:

return sorted.join("").indexOf(tofind.join(""))!=-1; 

不過,我不完全理解你的做法。此循環:

for (var c in cards) 
    if (cards[c].card.charAt(1) == sorted[i+j]) 
     found++ 

對我來說似乎很奇怪。首先,cards是一個數組,所以不要使用for-in-loop。但是,如果您搜索所有要匹配的當前信件的卡片,這與訂單有什麼關係?

0

一個可能的解決方案使用Underscore,並保持你的數據結構

function test(seq,expected) { 
    var res=isSequence(seq); 
    if (res===expected) 
     console.log(seq.join(',')+" : success"); 
    else 
     console.log(seq.join(',')+" : fail"); 
} 

function isSequence(seq) { 
    var sorted = ['7','8','9','t','j','q','k','a'], l=seq.length, i, ix; 
    if (l===0) return true; 

    ix=_.indexOf(sorted, seq[0]); 
    if (ix===-1) return false; 
    if (ix>sorted.length-l) return false; 

    for (i=1;i<l;i++) { 
     if (sorted[ix+i]!==seq[i]) 
      return false; 
    } 

    return true; 
} 

var cards = [{card:'h7'},{card:'c8'},{card:'h9'},{card:'st'}] 

test(_.map(cards, function(obj) { 
    return obj.card.charAt(1); 
}), true); 

test(['7','8','9','t'] , true); 
test(['j','q','k','a'] , true); 
test(['7','8','k','a'] , false); 
test(['j','k','7','a'] , false); 

並有小提琴http://jsfiddle.net/KDrDy/2/