2013-07-27 32 views
0

我對JavaScript比較陌生,我構建了一個小應用程序,它從一組52個卡(我將所有可能性存儲在數組中)中隨機生成一個卡。但我想確保同一張卡片不能生成兩次。我無法找到辦法。JavaScript刪除數組中的值

var cardType = ["A♠","2♠","3♠","4♠","5♠","6♠","7♠","8♠","9♠","10♠","J♠","Q♠","K♠"]; 

function generateCard() 
{ 
var card = cardType[Math.round(Math.random() * (cardType.length - 1))]; 
} 

鏟形符號實際上並不在我的數組中,我只是把它放在了可見性中。

回答

3

跟蹤已經生成的卡,請檢查是否新產生的卡已經存在,如果確實如此,生成一張新卡:

var already_generated = []; 
var cardType = ["A♠","2♠","3♠","4♠","5♠"...]; 

function generateCard() { 
    var card = cardType[Math.round(Math.random() * (cardType.length - 1))]; 

    if (already_generated.indexOf(card) == -1) { 
     already_generated.push(card); 
    }else{ 
     if (already_generated.length < cardType.length) generateCard(); 
    } 
} 

舊的瀏覽器將需要一個墊片爲Array.indexOf,它可以在MDN

一點題外話發現,原來陣列可以被切,但是這只是似乎更容易,除非你出於某種原因改變原有陣!

+0

如果您生成所有的卡和通話產生FN,你的執行會遇到麻煩 – OzrenTkalcecKrznaric

+0

@OzrenTkalčecKrznarić - 是的,我沒有爲它添加支票,因爲它看起來很明顯,但我現在就添加它。 – adeneo

+0

這個代碼(以及在問題中發佈的代碼)的基本問題是您在函數內定義了數組,這意味着每次調用該函數時都會重置該數組,這意味着您必須跟蹤已有的卡。看到我的答案更有效的解決方案 – Dogoku

-2

使用delete關鍵字。

樣品:

var x = [1,2,3]; 
delete x[1]; // delete element '2' 
for (i in x) { 
    console.log(x[i]); // outputs 1, 3 
} 
+2

但長度仍然相同,搞亂隨機卡的一代。 – adeneo

+1

有兩個不好的答案 - 數組中的'delete'只會使元素不確定,不會將其刪除,並且不應該在數組中使用'for ... in',僅限於對象。 – Alnitak

+0

我知道你在哪裏,請給OP一個真實的例子 – OzrenTkalcecKrznaric

0

我只想:

  • 讓你的有序集合的卡(即 「包」)
  • 使用effective shuffling algorithm從做一個 「甲板」 「pack」
  • 使用deck.pop()只需從該卡組中取出連續的卡片

在您開發應用程序時,抽象代表一副撲克牌可能會很有用。現在看起來似乎過度殺傷力,但從長遠來看這將是值得的。如果做得好,它應該可以在其他項目中重複使用。

3

預洗牌的陣列,並且在時間彈出一個卡,從陣列

var cardType = ["A♠","2♠","3♠","4♠","5♠","6♠","7♠","8♠","9♠","10♠","J♠","Q♠","K♠"]; 

//shuffles array 
cardType.sort(function() { return 0.5 - Math.random() }); 

function generateCard() 
{  
    return cardType.pop(); 
} 

當你undefined它意味着你得到了所有的卡

+0

好的答案,從我的+1 – OzrenTkalcecKrznaric

+0

我不相信那個'sort'輔助函數 - 它使用非確定性比較器來處理'O(n log n)'函數,當一個體面的Knuth-Fisher-Yates混洗將在'O(n)'時間內工作。 – Alnitak

+0

^^^克努特是達人! – adeneo