Вставка вероятностей в карточную игру - PullRequest
0 голосов
/ 02 апреля 2020

Я ищу, чтобы создать код, в котором карта будет вытянута случайным образом, нажав кнопку. Тем не менее, я хотел бы, чтобы некоторые карты были реже, чем другие, но я не знаю, как интегрировать это, код совсем не мой любимый домен ... Большое спасибо за вашу помощь и советы, которые вы можете дать мне !

    var spongebob = "<img src = 'http://www.homastudio.com/img/spongebob.png'>";
var patrick = "<img src = 'http://www.homastudio.com/img/patrick.png'>";
var squidward = "<img src = 'http://www.homastudio.com/img/squidward.png'>";
var sandy = "<img src = 'http://www.homastudio.com/img/sandy.png'>";
var krabs = "<img src = 'http://www.homastudio.com/img/krabs.png'>";
var larry = "<img src = 'http://www.homastudio.com/img/larry.png'>";
var images = [spongebob, patrick, squidward, sandy, krabs, larry]
var names = ["Spongebob Squarepants", "Patrick Star", "Squidward Tentacles", "Sandy Cheeks", "Eugene Krabs", "Larry Lobster"]
function displayImage(){
  var rn = Math.random();
  rn = rn*6;
  rn = Math.floor(rn);
  document.getElementById("pic").innerHTML=images[rn];
  document.getElementById("name").innerHTML=names[rn];
}

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

То, что вы ищете, называется взвешенным случайным выбором, то есть это все еще случайный выбор, но некоторые элементы имеют более высокий вес. Алгоритм довольно прост.

Вы начинаете со списка предметов и назначаете каждому относительный вес. Чем выше вес, тем больше шансов, что его выберут. Затем выберите случайное число от 0 до общего веса всех предметов , и вы пошагово просматриваете предметы, вычитая вес каждого предмета из выбранного вами случайного числа. когда число достигает нуля, у вас есть ваш товар.

Вот пример.

function WeightedBroker(){
    this.totalWeight = 0;
    this.items = [];
    
    this.addItem = function(value,weight){
       this.items.push({value,weight});
       this.totalWeight+= weight;
    }
    
    this.pickItem = function(){
       var rnd = Math.floor(Math.random() * this.totalWeight);
       for(var i=0;i<this.items.length;i++){
           if(rnd<=this.items[i].weight)
              return this.items[i].value;
           rnd -= this.items[i].weight;
       }
    }
}

var broker = new WeightedBroker();
broker.addItem("a",100);
broker.addItem("b",10);
broker.addItem("c",1);

for(var i=0;i<10;i++)
   console.log(broker.pickItem());

Применить это к вашему коду довольно просто, вы захотите изменить эти 2 массива (один с img html, а другой с именами) на объекты, содержащие свойства name и src. Вы добавляете каждый из этих элементов в брокер, который я написал выше, с соответствующими весами для каждого в соответствии с вашими требованиями. Примерно так:

function WeightedBroker(){
    this.totalWeight = 0;
    this.items = [];

    this.addItem = function(value,weight){
       this.items.push({value,weight});
       this.totalWeight+= weight;
    }

    this.pickItem = function(){
       var rnd = Math.floor(Math.random() * this.totalWeight);
       for(var i=0;i<this.items.length;i++){
           if(rnd<=this.items[i].weight)
              return this.items[i].value;
           rnd -= this.items[i].weight;
       }
    }
}

var broker = new WeightedBroker();
broker.addItem({src:"<img src = 'http://www.homastudio.com/img/spongebob.png'>",name:"Spongebob Squarepants"},100);
broker.addItem({src:"<img src = 'http://www.homastudio.com/img/patrick.png'>",name:"Patrick Star"},100);
broker.addItem({src:"<img src = 'http://www.homastudio.com/img/squidward.png'>",name:"Squidward Tentacles"},100);
broker.addItem({src:"<img src = 'http://www.homastudio.com/img/sandy.png'>",name:"Sandy Cheeks"},100);
broker.addItem({src:"<img src = 'http://www.homastudio.com/img/krabs.png'>",name:"Eugene Krabs"},100);
broker.addItem({src:"<img src = 'http://www.homastudio.com/img/larry.png'>",name:"Larry Lobster"},100);

var item = broker.pickItem();
document.getElementById("pic").innerHTML=item.src;
document.getElementById("name").innerHTML=item.name;
<div id="name"></div>
<div id="pic"></div>
0 голосов
/ 02 апреля 2020

вместо того, чтобы массив просто заставлял изображения делать что-то вроде следующего (где меньшее число в 'редкости' означает более редкое:

  var spongebob = {
    url:"<img src = 'http://www.homastudio.com/img/spongebob.png'>",
    rarity: 1
  };

  var patrick = {
    url:"<img src = 'http://www.homastudio.com/img/patrick.png'>",
    rarity: 2
  };
  var squidward = {
    url:"<img src = 'http://www.homastudio.com/img/squidward.png'>",
    rarity: 4
  };
  var images = [spongebob, patrick, squidward];

  var imageChoiceArr = [];

  for(var i=0;i<images.length;i++) {
    image = images[i];
    for(var ii=0;ii<image.rarity;ii++) {
      imageChoiceArr.push(image.url);
    }
  }

Затем случайным образом выбирайте из 'imageChoiceArr'

...