Как добавить к четвертому этапу математические ответы из большего массива ответов?

Как бы я изменил код ActionScript, чтобы тест мог представлять случайный набор ответов из более длинного списка? Например, могу ли я представить в тесте только 4 случайных ответа из файла XML, содержащего всего 12 ответов в виде флагов?

Я могу поставить все свои 12 ответов, все флаги появляются, и в текстовом поле вопроса только один вопрос - это название одного из этих флагов, но я не знаю, как случайным образом получить только четыре из флагов и поместить их в сцена и одно из имен в текстовом поле

Пример XML:

 <flags>
    <flag path="../assets/flags/flag1.png">                             
         <country>
            Aeland               
         </country>
    </flag> 

    <flag path="../assets/flags/AmSamoa.png">                               
         <country>
            AmSamoa          
         </country>
    </flag>  

    <flag path="../assets/flags/Bahamas.png">                               
         <country>
            Bahamas              
         </country>
    </flag>   
    <flag path="../assets/flags/CostaRica.png">                             
         <country>
            Costa Rica               
         </country>
    </flag>   
    <flag path="../assets/flags/CotedIvorie.png">                               
         <country>
            Cotedivoire          
         </country>
    </flag>   
    <flag path="../assets/flags/Croatia.png">                               
         <country>
            Croatia              
         </country>
    </flag>   

И мой код AS3:

private function onXMLLoad(event:Event):void
{           
    _xml = new XML(event.target.data); //create XML document_xmlLoader.removeEventListener(Event.COMPLETE, onXMLLoad);
    _myFlagList = new XMLList(_xml.flag);

    _xmlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
    //  _xml.ignoreWhitespace = false;          
    // trace("MyFlag: _answers: ",_answers);          
    //trace(_loader);          
    //trace(targetBtn);
    //trace(_myFlagList);


    for each (var flagPath:XML in _xml.flag.@path) 
    {
        trace("MyFlag: flagaths: ",flagPath);
        _flagPaths.push(flagPath);
    }   


    for each (var flag:XML in _xml.flag.country)
    {       //trace("MyFlag: flagaths: ",flag);     
        _allFlags.push(flag);
    }

    createButtons();

}


private function onIOError(event:IOErrorEvent):void
{
    _xmlLoader.removeEventListener(Event.COMPLETE, onXMLLoad);
    _xmlLoader.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
    trace('IO Error:', event.text);

}

private function createButtons():void
{


    var col:int;
    var row:int;    
    flagContainer = new Sprite(); 


    trace("Number of flags",_allFlags.length);


    for (var i:int = 0; i < NUMBER_OF_BTNS; i++) 
    {
        _answers.push(_allFlags[i]);

        targetBtn = new FlagButton(_allFlags[i],_flagPaths[i]);             
        targetBtn.x = col * (targetBtn.width + 10)+20;
        targetBtn.y = row * (targetBtn.height+ 10)+20;
        flagContainer.addChild(targetBtn);
        addChild(flagContainer);



        col++;

        if( col == 3)
        {
            col = 0;
            row++;
        }
    }



    randomOption(); 
}
private function randomOption():void
{


    trace("MyFlag: all flags: ", _allFlags);        

    flagToFind = _allFlags[Math.floor(Math.random() * _allFlags.length)];
    trace("MyFlag: flag to find: ", flagToFind);        

    _bk.text.text=flagToFind;

}

1 ответ

Решение

Вы в основном хотите массив объектов. Возможно, будет лучше, если вы разместите свои флаги в XML так:

<flag> 
     <path>../assets/flags/flag1.png</path> 
     <country>Aeland</country>
</flag> 

При этом вы получите массив flag в вашем объекте XML, который может быть повторен.

О выборе из массива случайным образом - это более простая задача, просто убедитесь, что вы не выбрали индекс, который вы уже выбрали ранее.

var selected:Array=[];
while (selected.length<4) {
    var si:int=Math.floor(Math.random()*flags.length);
    if (selected.indexOf(si)==-1) selected.push(si);
}
trace(flags[selected[0]]); // first selected flag
trace(flags[selected[3]]); // fourth selected flag
Другие вопросы по тегам