2013-04-12 55 views
0

我正在嘗試創建一個撲克程序,它將生成一張5張隨機卡片。我碰到的一個問題是,該程序偶爾會產生兩次相同的卡片。如何在JavaScript中創建一個帶有許多條件的while循環?

我想要解決這個問題的最佳方式是實現一個看起來像這樣的while循環。

while (randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3) { 

randSuit2 = Math.round(Math.random()*3);      
randFace2 = Math.round(Math.random()*13); 

} 

雖然這打破了while循環的語法並拒絕運行。

有沒有什麼辦法可以創建一個while循環,類似於上面那個有許多複雜條件的循環......只有一個在語法上有效嗎?

謝謝!

+1

裹在'(即整體狀況)',它可能會工作。 – tymeJV

回答

4

是的,添加更多括號。

while ((randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3)) { 
    // Do whatever 
} 

while循環將檢驗一切括號立即while關鍵字後面。你可以使用更多的括號或任何你喜歡的操作符無限地嵌套條件,只要這些括號中的任何內容都可以被評估爲真或假。

+0

非常感謝!我現在就試試這個。 –

1

它看起來像你缺少一個括號

while ((randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 &&  randSuit2 == randSuit3)) { 

randSuit2 = Math.round(Math.random()*3);      
randFace2 = Math.round(Math.random()*13); 

} 
1

只需使用括號組的條件,如:

while((randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3)) { 
randSuit2 = Math.round(Math.random()*3);      
randFace2 = Math.round(Math.random()*13); 
} 
0

這聽起來好像是一個XY problem,使注意到這個答案不回答問題的主題,而是回答問題本身。

首先,你應該使用Math.floor,因爲Math.round會給你一個非均勻分佈:

function randomInt(max) { 
    return Math.floor(Math.random() * (max + 1)) 
} 

然後,你必須在某處存儲所有這些價值觀,對不對?那麼爲什麼你不使用對象或數組?我會假設你正在使用一副52張牌。如果你有這樣一個約定:

  • 之心:指標0 - 12
  • 鑽石:指數13 - 25
  • 俱樂部:指數26 - 38
  • 黑桃:指​​數39 - 51

那麼你的 「甲板」 表示僅僅是一個int數組:

var deck = []; 
for (var i = 0; i < 52; i++) 
    deck.push(i); 

現在你可以創建一個「打平臺」只是洗牌的常規之一:

// Using the Fisher Yates shuffle: http://en.wikipedia.org/wiki/Fisher-Yates_shuffle 

function shuffle(array) { 
    var len = array.length; 
    var shuffled = array.slice(); 

    while (len--) { 
    random = randomInt(len + 1); 
    // swap 
    shuffled[len] = [shuffled[random], shuffled[random] = shuffled[len]][0]; 
    } 

    return shuffled; 
} 

// creating a new, shuffled deck from the original 
var playingDeck = shuffle(deck); 

,並使用playingDeck實際分配你的卡。比方說,你想給第5張牌的PLAYER1:

var player1Hand = playingDeck.splice(0, 5); 

然後你player1Hand將是一個五行陣,其中的元素是從「播放甲板之上」令牌(第一五行)。因此,如果您現在查詢的是playingDeck.length,則將爲47。你想給其他5張牌給玩家2?同一代碼:

var player2Hand = playingDeck.splice(0, 5); 

如果你想重新洗牌在比賽中間的卡?只是洗牌playingDeck並將其分配給自己:

playingDeck = shuffle(playingDeck); 

你也可以從上面繪製一個卡:

var card = playingDeck.shift(); 

(請注意,在這種情況下,這不是卡的列表 - 陣列 - 但是卡本身 - 數字)

,基本上使用任何你想要的Array methods,模擬真實的甲板。

正如你可以看到它的處理模擬卡更自然的方式,你不必來連接許多條件在循環得出一些卡。

我會使用我在開始時提到的慣例,但請記住,如果您想擁有該卡的不同表示形式,那麼也可以:所描述的方法仍然有效,您不必更改代碼;只有陣列的價值是不同的,所以只有代甲板的生成。例如,你可以有字符串:

var deck = ["1H", "2H", /*etc*/, "10H", "JH", "QH", "KH", /* etc */]; 

如果最後一封信是西裝,剩下的就是卡的價值。或者你也可以使用一個物體:

var deck = [{"suit": "Hearts", "face": "1"}, /* etc */]; 

真的沒關係。什麼讓你更容易處理。但其餘的方法仍然是一樣的。

希望它有幫助!

+0

非常感謝!我非常感謝你的迴應。 –

+0

其中一些建議稍微超出了我的水平......但是我非常好奇的一件事是Math.random方法。我正在嘗試生成四種隨機套裝中的一種。每個都與0和3之間的數組索引配對。如果我使用randSuit2 = Math.floor(Math.random()* 4);我有沒有機會得到4號?我將如何避免這種情況?再次感謝!這些評論是非常有幫助的。 –

+0

如果您有任何疑問,隨時提問,我可以想象一下,有幾件事情可能無法立即理解。關於你的問題,如果你使用'Math.floor(的Math.random()* 4)'沒有機會,你會產生數量那是因爲'Math.random'產生0之間的浮點數(含)和1(不含),所以你可以有,也許'0.99 * 4',那就是'3.96',因爲[Math.floor(https://developer.mozilla.org/en-US/docs/JavaScript/ Reference/Global_Objects/Math/floor)返回小於或等於數字的最大整數,結果將爲'3'。 – ZER0