這應該任意數量的元素的工作,你可以指定任何機會價值。
var tiles:Array = [
{"item":"fire", "chance":70 },
{"item":"ice", "chance":10 },
{"item":"water","chance":20}
];
var picked:Object = pickRandomByChance(tiles);
trace(picked.item);
public function pickRandomByChance(options:Array):Object
{
var copy:Array = [];
var range:Number = 0;
for (var i:int = 0; i < options.length; i++)
{
copy.push({ "item":options[i].item, "chance":options[i].chance });
range += copy[i].chance;
if (i > 0)
copy[i].chance += copy[i - 1].chance;
}
var pick:Number = Math.floor(Math.random() * range);
for (i = 0; i < copy.length; i++)
{
if (pick <= copy[i].chance)
return copy[i];
}
return null;
}
這不會總是返回'火'或null,因爲循環總是首先檢查'火',而10和20在<= 70範圍內? –
你是對的我修改了答案。 –
trace(picked.item)訪問undefined屬性「pick」時發生錯誤。如何擺脫這一點? – Mirage01