问题描述
我的代码是喝酒或冒险游戏。每次用户单击按钮时,它将抽取1张饮料卡和1张通配符。问题在于,它多次选择同一张牌,并且随机选择的多样性不足以使其变得有趣。有什么办法可以减少选择同一张卡的次数。有时同一张卡片会连续被选中2到3次。
var cards = [
'1-wildcard','2-wildcard','3-wildcard','4-wildcard','5-wildcard','6-wildcard','7-wildcard','8-wildcard','9-wildcard','10-wildcard','11-wildcard','12-wildcard','13-wildcard','14-wildcard','15-wildcard','16-wildcard','17-wildcard','18-wildcard','19-wildcard','20-wildcard','21-wildcard','22-wildcard','23-wildcard','24-wildcard','25-wildcard','26-wildcard','27-wildcard','28-wildcard','29-wildcard','30-wildcard'
];
var drinks = [
'1-drink','2-drinks','3-drinks','4-drinks','5-drinks','6-drinks','7-drinks','8-drinks','9-drinks','1-shot','2-shots','3-shots','4-shots'
]
function drawCard() {
var randomNumber = Math.floor(Math.random() * (cards.length - 1));
var randomNumber1 = Math.floor(Math.random() * (drinks.length - 1));
console.log(cards.length);
console.log(cards[randomNumber]);
document.getElementById("drinks").src = 'assets/js/games/cards/drinkordare/' + drinks[randomNumber1] + '.png';
document.getElementById("wildcard").src = 'assets/js/games/cards/drinkordare/' + cards[randomNumber] + '.png';
switch(cards[randomNumber]) {
}
switch (drinks[randomNumber1]) {
}
}
解决方法
您可以将最后选择的卡添加到临时阵列(称为卡A),然后在其余卡中选择下一张卡。然后,当(选择5张)卡片A后再拿出更多卡片时,您将卡片A再次推回初始阵列,依此类推。
这消除了在保持算法随机性的情况下连续选择(在这种情况下为5张)卡的可能性。例如,我对卡片执行了该算法(但请注意,对于饮料,它是相同的算法,您只需要更改名称和数组即可。)
let cards = ['1-wildcard','2-wildcard','3-wildcard','4-wildcard','5-wildcard','6-wildcard','7-wildcard','8-wildcard','9-wildcard','10-wildcard','11-wildcard','12-wildcard','13-wildcard','14-wildcard','15-wildcard','16-wildcard','17-wildcard','18-wildcard','19-wildcard','20-wildcard','21-wildcard','22-wildcard','23-wildcard','24-wildcard','25-wildcard','26-wildcard','27-wildcard','28-wildcard','29-wildcard','30-wildcard'];
let lastSelectedCards = [];
function getRandomCard() {
let bufferSize = 5; // If you pick a card,the next 5 cards will not be the same
let randomNumber = Math.floor(Math.random() * (cards.length - 1));
// Push to the selected array and removes from the cards array
lastSelectedCards.push(cards[randomNumber]);
cards.splice(randomNumber,1);
// Push back the last element in the cards array after 5 new random cards selected
if (lastSelectedCards.length == bufferSize + 2) {
cards.push(lastSelectedCards.shift());
}
// Returns the last selected card
return lastSelectedCards[lastSelectedCards.length - 1];
}
// Select 10 cards for testing
for (let i = 0; i < 10; i++) {
console.log(getRandomCard());
}
,
您可以通过以下操作来防止重复:复制数组的随机副本,从中弹出并在用完时重新填充,如下所示:
var cards = ["a","b","c"],shuffledCards = [];
for(var i = 0; i < 10; i++) console.log((shuffledCards = shuffledCards.length ? shuffledCards : randoSequence(cards)).pop().value);
<script src="https://randojs.com/2.0.0.js"></script>
此代码使用Rando.js进行随机播放,但如果您引用,则可以shuffle with plain JavaScript。