垄断挑选随机卡和流行阵列

时间:2014-01-25 12:16:50

标签: javascript jquery

点击

function click() {

        createCards();
        pickCard();

    }

挑选卡

function pickCard() {
        var x = Math.floor(Math.random() * ((15 - 0) + 1) + 0);
        var title = cards.chance[x].title;
        console.log(x + ". " + title);
        //pop the array we just picked
        //adjust Math.floor since there are only 15 cards to pick from instead of  16

    }

创建卡片

function createCards() {
cards = {

    chance: [{
        title: 'Advance to go',
        type: 'move',
        position: 40
    }, {
        title: "Advance to London",
        type: "move",
        position: 39
    }, {
        title: "Your ass is going to jail",
        type: "move",
        position: 10
    }, {
        title: "Advance to Rome",
        type: "move",
        position: 24
    }, {
        title: "Advance to Charles de Gaulle",
        type: "move",
        position: 15
    }, {
        title: "Advance to Amsterdam",
        type: "move",
        position: 11
    }, {
        title: "Go back 3 spaces",
        type: "movex",
        position: -3
    }, {
        title: "No drink and driving mate1",
        type: "bill",
        bill: 20
    }, {
        title: "Get out of Jail free card",
        type: "bill",
        bill: 150
    }, {
        title: "Pay school fees",
        type: "bill",
        bill: 150
    }, {
        title: "Speeding fine",
        type: "bill",
        bill: 150
    }, {
        title: "Bank pays you dividend",
        type: "bonus",
        bonus: 40
    }, {
        title: "You have won the competition",
        type: "bonus",
        bonus: 200
    }, {
        title: "Your building loan matures",
        type: "bonus",
        bonus: 200
    }, {
        title: "You are assessed for street repairs $40 per house $115 per hotel",
        type: "billx"
    }, {
        title: "House repairs $25 per house $100 per hotel",
        type: "billx"
    }]
};

}

好吧,伙计们,我正在尝试选择一张随机卡,然后我想弹出它,但由于我使用的是随机发生器,我必须调整最小值,最大值,因为数组中会少1张卡。我也会接受一个更好的答案,一个更有效的方法。例如shuffle?我不知道那是怎么回事。

4 个答案:

答案 0 :(得分:1)

您可以使用splice弹出元素并使用array.length而不是使用固定数字。

   // if there are no more cards, create them

   var cardsLeft = cards.chance.length;
   if(cardsLeft == 0){
     createCards();
   }

    // Math  
    var x = Math.floor(Math.random() * cardsLeft);

    // pop
    cards.chance.splice(x, 1);  

答案 1 :(得分:1)

我会在开始时“洗牌”:

function shuffle(cards) {

    var shuffled = [],
        i = cards.length,
        j = 0;

    while (i--) {
        j = Math.floor(Math.random() * (i+1));
        shuffled.push(cards[j]);
        cards.splice(j,1);    
    }

    return shuffled;

}

var shuffledCards = shuffle(cards.chance);

shuffledCards数组现在将按随机顺序保存所有卡片。然后,您可以在使用时从shuffledCards弹出卡片,或者使用计数器来完成它们。后者意味着您可以稍后重新洗牌。

注意:这只是我在这里写的内容的改写:https://stackoverflow.com/a/18806417/1937302

答案 2 :(得分:0)

首先使用索引填充数组:

var i, indexes, pickedIndex;

indexes = [];
for (i = 0; i < 15; i++) // 16 cards from 0 to 15
{
  indexes[i] = i;
}

现在,当您需要一张卡时,请先选择索引:

pickedIndex = Math.floor(Math.random() * indexes.length);

然后,通过覆盖数组中最后一个选择的索引来删除消耗的索引:

i = indexes.pop();

if (pickedIndex <= indexes.length)
{
    indexes[pickedIndex] = i;
}

上面的代码片段将剩余的索引减少一个,删除所选的一个,并保持未来选择的概率在索引中均匀分布。

使用挑选的索引获取实际的卡片。

当indices.length为0时,所有索引都被选中。

答案 3 :(得分:0)

这个答案使用索引方法以随机顺序对机会卡进行排序,然后通过卡从0到15运行。

<!DOCTYPE HTML>
<html>
<head>
<title>card shuffle</title>

<script type="text/javascript">
function set() {
        pack = new createCards();
        pack.shuffle();

    }

function click() {
    pack.pickCard();
}    

function pickCard() {
        var title = this.cards.chance[this.pick++].title;
        console.log((this.pick-1) + ". " + title);

    } 

function shuffle() {
    for (var i=0; i<16; i++) {
        this.cards.chance[i].place=Math.random();
    }
    //sort chance cards on place order which is now random 
    this.cards.chance.sort(function(a,b) {return a.place - b.place;});      
}

function createCards() {
this.cards = {

    chance: [{
        place:0,
        title: 'Advance to go',
        type: 'move',
        position: 40
    }, {
        place:0,
        title: "Advance to London",
        type: "move",
        position: 39
    }, {
        place:0,
        title: "Your ass is going to jail",
        type: "move",
        position: 10
    }, {
        place:0,
        title: "Advance to Rome",
        type: "move",
        position: 24
    }, {
        place:0,
        title: "Advance to Charles de Gaulle",
        type: "move",
        position: 15
    }, {
        place:0,
        title: "Advance to Amsterdam",
        type: "move",
        position: 11
    }, {
        place:0,
        title: "Go back 3 spaces",
        type: "movex",
        position: -3
    }, {
        place:0,
        title: "No drink and driving mate1",
        type: "bill",
        bill: 20
    }, {
        place:0,
        title: "Get out of Jail free card",
        type: "bill",
        bill: 150
    }, {
        place:0,
        title: "Pay school fees",
        type: "bill",
        bill: 150
    }, {
        place:0,
        title: "Speeding fine",
        type: "bill",
        bill: 150
    }, {
        place:0,
        title: "Bank pays you dividend",
        type: "bonus",
        bonus: 40
    }, {
        place:0,
        title: "You have won the competition",
        type: "bonus",
        bonus: 200
    }, {
        place:0,
        title: "Your building loan matures",
        type: "bonus",
        bonus: 200
    }, {
        place:0,
        title: "You are assessed for street repairs $40 per house $115 per hotel",
        type: "billx"
    }, {
        place:0,
        title: "House repairs $25 per house $100 per hotel",
        type: "billx"
    }]
}    
this.pick=0;    

this.pickCard=pickCard;
this.shuffle=shuffle;
};

set();
for(var i=0;i<16;i++) {
    click();
}

</script>
</head>
<body>  
</body>
</html>