2012-11-23 2 views
0

Привет, пользователей переполнения стека. Я в настоящее время борется с рандомизацией моих данных через as3 и xml.Получение случайного места с использованием ActionScript без повторения

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

Мой 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); 
+0

вам нужно сохранить имя последнего выбранного места для сравнения с вновь созданным местом встречи, если они совпадают, отбросить его и заново создать – Awalias

+0

. Я не особо знаком с Action Script, но вам может понадобиться «срез», элементы из «Gallerylist» по мере их выбора. –

+0

Привет, добро пожаловать в StackOverflow. Пожалуйста, не публикуйте ссылки на код. Вместо этого скопируйте и вставьте код на эту страницу. Каждый вопрос должен быть самодостаточным, не требуя от пользователей перехода на другой сайт (который может исчезнуть в какой-то момент времени). Я отредактировал ваш вопрос и сделал это для вас, потому что я хороший парень :-) –

ответ

1

Создать массив со всеми именами мест. Вы можете сделать это программно, если набор данных становится слишком большим или просто начинается с жестко закодированных значений для вашего примера, чтобы заставить его работать. Когда вы нажимаете случайную кнопку, вытащите имя и используйте его, чтобы выбрать следующий. Это позволит избежать необходимости проверять, какие из них уже были использованы, и вам просто нужно выбрать из оставшихся в массиве, которые не были просмотрены. Когда пользователь выбирает последний, а массив пуст, повторно инициализируйте его и продолжайте.

0

Если вы не хотите перетасовывать непосредственно свой xml, чтобы избежать создания новой копии имени, вы можете использовать функцию тасования, такую ​​как FicherYates, чтобы перетасовать ваши данные.

Вы можете сделать все в одной функции, которая будет срабатывать при каждом нажатии на новое место и когда конец будет завершен.

вот пример функции, которая будет выбирать случайный элемент каждый раз, когда он реагирует на событие щелчка:

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)); 

Вы можете увидеть его в прямом эфире на wonderfl каждый раз, когда вы нажимаете на TextArea: http://wonderfl.net/c/aQ1D

+0

Patrick Я внедрил ваш код, но я не получаю никакого вывода. Использование трассировки и динамического текстового поля! есть идеи?? уже загруженный XML и т. д. http://pastebin.com/8TfjhH6H Прошу прощения за ссылку на другой сайт. Я никогда не смогу правильно отобразить код! Извините Wouter van Nifterick :) – John

+0

@John В коде myRandomVenue есть узел XML, который вы хотите использовать, а имя - атрибут не узла, поэтому к нему следует обращаться с помощью @: 'myTextBoxTitle.text = myRandomVenue. @ Name'; – Patrick

+0

Здесь скорректированная версия вашего кода: http://pastebin.com/PeqcFk46 – Patrick

Смежные вопросы