這聽起來好像是一個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 */];
真的沒關係。什麼讓你更容易處理。但其餘的方法仍然是一樣的。
希望它有幫助!
裹在'(即整體狀況)',它可能會工作。 – tymeJV