使用动作脚本获取随机场地而不重复

时间:2012-11-23 14:48:22

标签: xml actionscript-3 random random-access

用户堆栈溢出我正在努力通过as3和xml随机化我的数据。

我可以加载xml并生成一个随机场所但是当我点击我创建的随机按钮时,同一个节点会显示两次!基本上我只想随意选择前一场地不重复的数据,如果这是有意义的话。

我的xml:

<gallery>
<venue>
        <name>1</name>
        <description>1</description>
        <picture>images/1.jpg</picture>
        <thumb>thumbs/1.jpg</thumb>
        <address>1</address>
        <website>http://1.co.uk</website>
</venue>

<venue>
        <name>2</name>
        <description>2</description>
        <picture>images/2.jpg</picture>
        <thumb>thumbs/2.jpg</thumb>
        <address>2</address>
        <website>http://2.co.uk</website>
</venue>

<venue>
        <name>3</name>
        <description>3</description>
        <picture>images/3.jpg</picture>
        <thumb>thumbs/3.jpg</thumb>
        <address>3</address>
        <website>http://3.co.uk</website>
</venue>
</gallery>

我目前的代码:

var xml:XML = <venues>
<venue name="" description="" address="" website="" picture=""/>
<venue name="" description="" address="" website="" picture=""/> 
<venue name="" description="" address="" website="" picture=""/>
<venue name="" description="" address="" website="" picture=""/>
</venues>;

var Gallerylist:XMLList = new XMLList(xml.venue);

function RandomGallery(e:Event)
{
    var rand:int = Gallerylist.length() * Math.random();
    myTextBoxTitle.text = myXML.venue.name[rand]
    myTextBoxDes.text = myXML.venue.description[rand]
    myTextBoxAddress.text = myXML.venue.address[rand]
    myTextBoxWeb.text = myXML.venue.website[rand]
    myVenueImage.source = myXML.venue.picture[rand]
}
randomBTN.addEventListener(MouseEvent.MOUSE_DOWN, RandomGallery);

2 个答案:

答案 0 :(得分:1)

创建一个包含场地名称的数组。如果数据集太大或者只是从您的示例的硬编码值开始以使其工作,您可以以编程方式执行此操作。单击随机按钮时,请关闭该名称并使用它来选择下一个名称。这将避免必须检查哪些已经使用过,你只需从数组中剩余的未被查看的那些中选择。当用户选择最后一个并且数组为空时,重新初始化并继续。

答案 1 :(得分:0)

如果您不介意直接对您的xml进行随机播放以避免制作该名称的新副本,您可以使用像FicherYates之类的随机播放功能来随机播放您的数据。

你可以制作一个多功能的功能,每次点击一个新的场地时都会拾取,并在结束时重新开始。

这里是一个函数示例,每次响应click事件时都会选择一个随机元素:

var xml:XML = <venues>
<venue name="" description="" address="" website="" picture=""/>
<venue name="" description="" address="" website="" picture=""/> 
<venue name="" description="" address="" website="" picture=""/>
<venue name="" description="" address="" website="" picture=""/>
</venues>;


var fnShuffle:Function = function(xl:XMLList):Function {
 var len:int=xl.length();
 var lastUsedIndex:int;

 return function(e:MouseEvent):void{
   var i:int;

   if (len<=0) {
     // restart over since you have reached the end of the list
     len = xl.length();
     i = int(Math.random() * (len--));

     // in case of a new round you don't want to redisplay the last one again
     if (i == lastUsedIndex) i = len; 
   } else {
     i = int(Math.random() * (len--));
   }

   var myRandomVenue:XML = xl[i];
   var tmp:XML = xl[len];
   xl[i] = tmp;
   xl[len] = myRandomVenue;
   lastUsedIndex = len;

   // here do what you want with your randow venue
   trace(myRandomVenue);
 }
}

this.addEventListener(MouseEvent.CLICK, fnShuffle(xml.venue));

每次单击TextArea时,您都可以在wonderfl中看到它: http://wonderfl.net/c/aQ1D