编写一个程序来测试纸牌游戏的开局牌

时间:2018-01-03 15:44:04

标签: javascript arrays loops

游戏的启动如下:

  1. 洗牌60张牌
  2. 将7张牌作为你的开局牌
  3. 基本上,我想创建一个程序来测试我的开局牌包含某些牌的频率。

    $(document).ready(function() {
        function shuffle(array) {
            var currentIndex = array.length,
                temporaryValue, randomIndex;
    
            // While there remain elements to shuffle...
            while (0 !== currentIndex) {
    
                // Pick a remaining element...
                randomIndex = Math.floor(Math.random() * currentIndex);
                currentIndex -= 1;
    
                // And swap it with the current element.
                temporaryValue = array[currentIndex];
                array[currentIndex] = array[randomIndex];
                array[randomIndex] = temporaryValue;
            }
    
            return array;
        }
    
        let deckarray = ["Grubbin", "Grubbin", "Grubbin", "Charjabug", "Vikavolt",
            "Vikavolt", "Vikavolt", "Tapu LeLe", "Tapu LeLe", "Tapu Bulu",
            "Tapu Bulu", "Tapu Bulu", "Octillery", "Remoraid", "Remoraid", "N", "N",
            "N", "N", "Skyla", "Skyla", "Skyla",
            "Guzma", "Guzma", "Guzma", "Brigette", "Brigette", "Brigette", "Kukui",
            "Kukui", "Ultra Ball", "Ultra Ball",
            "Ultra Ball", "Ultra Ball", "Heavy Ball", "Rare Candy", "Rare Candy", "Rare 
    Candy", "Rare Candy",
            "Choice Band", "Choice Band", "Choice Band", "Choice Band", "Float Stone",
            "Float Stone", "Energy Recycler",
            "Energy Recycler", "Field Blower", "Field Blower", "Lightning", "Lightning",
            "Lightning", "Lightning",
            "Grass", "Grass", "Grass", "Grass", "Grass", "Grass", "Grass"
        ];
    
        $('#shuffle').click(function() {
            $('#deck').empty();
            shuffle(deckarray);
            var openingHand;
            for (var i = 0; i < 7; i++) {
                openingHand += deckarray[i] + "<br />";
            }
            $('#deck').append(openingHand);
        });
    
        var sevenhand = [];
        var brigettecount = 0;
        $('#stats').click(function() {
            shuffle(deckarray);
            sevenhand.length = 0;
            brigettecount = 0;
            for (var i = 0; i <= 10000; i++) {
                for (var i = 0; i < 7; i++) {
                    sevenhand.push(deckarray[i]);
                }
                if (sevenhand.includes("Brigette")) {
                    brigettecount += 1;
                }
                console.log(brigettecount);
            }
    
        });
    });
    

    基本上,我希望#stats按钮的click功能能够测试10,000个开局牌。最终我希望它能够给出我用特定卡片组合打开的一定比例的次数,但是现在,我想让它记录我开始时在我的开幕式中使用名为“Brigette”的卡多少次7。

    上面的点击事件在点击时简单地洗牌并“重绘”7张牌(它在阵列的开头有一个奇怪的未定义,但这是我猜的另一个话题。)

    我的问题是,当我点击我的#stats按钮时,它会永远计算在内,并且sevenhand数组中没有添加任何卡片,brigettecount也没有。即使我在评论中指出10,000更正为10000,也会发生这种情况。

1 个答案:

答案 0 :(得分:1)

请查看this question

这是上面提到的超几何分布的快速Javascript实现。

参数是牌组大小(60),初始牌局中的牌数(7),以及你想要计算牌组(3“Brigette”牌)概率的牌的重复数量。

function hyperGeo(deckSize, cardsDrawn, wanted) {
  // x is the probability of *not* drawing one of the wanted cards
  // 1 - x is the probability of drawing *at least one* of the wanted cards
  var x = 1;
  for (var i=0; i < cardsDrawn; i++) {
    x *= (deckSize - i - wanted) / (deckSize - i);
  }
  return 1 - x;
}

console.log(hyperGeo(60, 7, 3));