Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как перейти на след вопрос, если ответ правильный (http://www.flasher.ru/forum/showthread.php?t=197968)

AlexTrin 16.04.2013 19:37

Как перейти на след вопрос, если ответ правильный
 
Здравствуйте, имеется код:

Код:

<?xml version="1.0" encoding="UTF-8"?>
<myList>
    <excercise>
        <question>2 x 2?</question>
        <answer>4</answer>
    </excercise>
</myList>

Код AS3:

package 
{
 
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.xml.*;
    import flash.events.Event;
    import flash.display.Loader;
 
 
    public class Main extends MovieClip
    {
        var myFile:String;
        var xmlLoader:URLLoader;
        var myList:XML;
 
        public function Main()
        {         
            myFile =  "myList.xml";
            loadXml();
        }
        function loadXml():void
        {
            xmlLoader = new URLLoader(new URLRequest(myFile));         
            xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded);
        }
        function xmlLoaded(event:Event):void
        {
            myList = new XML(event.target.data);
            myList.ignoreWhite = true;
 
            questionTxt.text = myList.excercise[0].question;
            checkBtn.addEventListener(MouseEvent.CLICK, checkAnswer)
        }
 
          function checkAnswer (event:MouseEvent) : void {
            if (answerTxt.text == myList.excercise[0].answer) {
              trace ("correct");
            } else {
              trace ("wrong");
            }
        }
 
    }
 
}

Как перейти к следующему вопросу, если дан правильный ответ?

Добавлено через 1 час 37 минут
Пробовал так, что то не выходит:
Код AS3:

for (var i:uint = 0; i < NUM_QUESTIONS; i++) {
questionTxt.text = myList.excercise[i].question;
checkBtn.addEventListener(MouseEvent.CLICK, checkAnswer);
}

Добавлено через 1 час 52 минуты
Попробовал так:
Код AS3:

package 
{
        import flash.display.*;
    import flash.net.*;
    import flash.xml.*;
        import flash.text.*;
        import flash.events.*;
        import org.casalib.util.ArrayUtil;
 
    public class Main extends MovieClip
    {
        var myFile:String;
        var xmlLoader:URLLoader;
        var myList:XML;
                var questionTxt:TextField = new TextField();
            var questionNumber:uint = 0;
        var correctNumber:uint = 0;               
                var correctAnswer:String;
                var randomAnswer:Array;
                const NUM_QUESTIONS:uint = 3;
 
        public function Main()
        { 
                    right = new Sprite();
            addChild(right);
 
            myFile = "myList.xml";
            loadXml();
        }
 
        function loadXml():void
        {
            xmlLoader = new URLLoader(new URLRequest(myFile));         
            xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded);
        }
 
                public function randomiseArray(answers:XMLList):Array {
                        var rArray:Array = new Array();
                        for (var i:uint = 0; i < NUM_QUESTIONS; i++) {
                          rArray.push(answers[i]);
                        }
                    return ArrayUtil.randomize(rArray);
                }
 
                  function nextQuest ():void {
                        correctAnswer = myList.excercise[questionNumber].answer[0];
                        randomAnswer = randomiseArray ( myList.excercise[questionNumber].answer.children() );
 
                        questionTxt.type = "dynamic";
                        questionTxt.width = 208;
                        questionTxt.height = 32;
                        questionTxt.x = 196;
                        questionTxt.y = 101;
                        addChild(questionTxt);
                        questionTxt.text = myList.excercise[questionNumber].question;
 
                        for (var i:uint = 0; i < NUM_QUESTIONS; i++) {
                        var answerTxt:TextField  = new TextField(randomAnswer[i]);
                        answerTxt.type = "input";
                        answerTxt.x = 196;
                        answerTxt.y = 301;
                        answerTxt.width = 208;
                        answerTxt.height = 32;
                        answerTxt.background = true;
                        answerTxt.backgroundColor = 0xFFF00; 
                        answerTxt.addEventListener(KeyboardEvent.KEY_UP, checkAnswer);
                        addChild(answerTxt);               
                        }
                        }               
 
        function xmlLoaded(event:Event):void
        {
            myList = new XML(event.target.data);
            myList.ignoreWhite = true;
            totalNr = myList.excercise.length();
                        nextQuest();
                        }
 
                function checkAnswer (e:KeyboardEvent):void
                {                       
 
                while (right.numChildren) right.removeChildAt(0);
 
                if(correctAnswer == e.target.getChildAt(e.target.numChildren - 1).text) correctNumber++;
 
                        if (questionNumber == myList.excercise.length()-1) {
                                      trace ("wrong");
                                    answerTxt.backgroundColor = 0xFF0000;
                        }else{
 
                                        trace ("correct");
                                  answerTxt.backgroundColor = 0xFFF00;
                                  correctNumber++;
                                  nextQuest();
                                  }       
                        }                       
 
                }
 
}

Не выходит как то.
Задача кода в том, чтобы правильный ответ вводился в answerTxt, и если он правильный то тут же следовал следующий вопрос.
Как осуществить, что то не доходит.

chamele0n 17.04.2013 04:14

так чтоли ?
Код AS3:

private var question_id:int = 0;
 
function xmlLoaded(event:Event):void {
 myList = new XML(event.target.data);
 myList.ignoreWhite = true;
 questionTxt.text = myList.excercise[question_id].question;         
 checkBtn.addEventListener(MouseEvent.CLICK, nextAnswer);
}
 
function nextAnswer(event:MouseEvent) : void {
 if(question_id == myList.excercise.length()) {
    trace('end test');
    return;
 }     
 if (answerTxt.text == myList.excercise[question_id].answer) {
    question_id++;
    questionTxt.text = myList.excercise[question_id].question;
 }
}


AlexTrin 19.04.2013 12:49

chamele0n, огромное спасибо, все так.

AlexTrin 17.05.2013 15:32

Пытаюсь вывести вопросы из списка случайным образом, что то не выходит.
Код AS3:

 if(question_id == myList.excercise.length()) {
    trace('end test');
    var randomIndex:int = Math.floor( Math.random() * (question_id-1) );
    return myList.excercise[randomIndex];
 }

Народ помогите.

Sync 17.05.2013 16:27

Код AS3:

question_id == myList.excercise.length()-1

попробуйте

AlexTrin 17.05.2013 16:31

Sync, непомогло

Sync 17.05.2013 16:43

чего у вас невыходит то? трейс проходит?

AlexTrin 17.05.2013 17:32

Трейс то проходит, а вот вопросы как шли по порядку так и идут, никакой рандомности не появилось.

Idon'tKnow 18.05.2013 01:01

Код AS3:

var randomIndex:int = Math.floor( Math.random() * myList.excercise.length);

Т.к округление идёт в меньшую сторону, то тут должно быть для 3х вопросов следующие промежутки:
1.) [0-1)
2.) (1-2]
3.) [2-3)

Если Вы вычитаете из длины единичку, то у Вас получаются вот такая область значений randomIndex:
[0; 1) - последний вопрос уже никогда не будет показан. Первые 2 должны появляться.

2).
Код AS3:

function nextAnswer(event:MouseEvent) : void

Код AS3:

return myList.excercise[randomIndex];

Не забыли поменять тип возвращаемых данных?

И вообще, куда он их вернет, если это приёмник? Я конечно не уверен, но по-моему приёмник не возвращает ничего, а просто реагирует на события, Вы же не можете присвоить значение какой-нибудь переменной - ссылку на этот приёмник. :)

P.S. В последнем абзаце не уверен.

Добавлено через 46 минут
Покопался, всё таки можно присваивать переменной возвращаемое значение переменной, но придется инициализировать вызов этого самого события. У Вас есть что-то, типа:↓ ?

Код AS3:

var secRect:Sprite;
var first:Sprite;
 
secRect = new Sprite();
secRect.graphics.beginFill(0x0000FF);
secRect.graphics.lineStyle(1);
secRect.graphics.drawRect(190, 200, 20, 20);
stage.addChild(secRect);
 
first = new Sprite();
first.graphics.lineStyle(1);
first.graphics.drawCircle(10, 20, 40);
stage.addChild(first);
 
first.addEventListener(MouseEvent.MOUSE_DOWN, firstListener);
secRect.addEventListener(MouseEvent.MOUSE_DOWN, secRectListener);
 
private function secRectListener(e:MouseEvent):void {
                                trace("secRect!");
                                //e.updateAfterEvent();
                }
 
private function firstListener(e:MouseEvent):void {
                                trace("first");
                                secRectListener(e); // вызов события.
                }

Буду рад услышать критику, если ошибаюсь в чём-либо. :)

AlexTrin 20.05.2013 12:52

А если вопроса не 3, а десятки или сотни, что тогда?
Не могу разобраться как добиться рандомности в таком случае.

AlexLucas 20.05.2013 13:09

Вы получили xml с вопросами/ответами, пропарсили его и перенесли в массив, потом случайным образом перемешали массив и уже после этого выводите вопросы по-одному.

Idon'tKnow 20.05.2013 18:18

Цитата:

Сообщение от Idon'tKnow (Сообщение 1133715)
Код AS3:

var randomIndex:int = Math.floor( Math.random() * myList.excercise.length);


Точно также добивается рандомность. Индекс вопроса = Округление по меньшему.(Колво вопросов * Рандом).
:)

AlexTrin 20.05.2013 18:30

Код AS3:

question_id == Math.floor( Math.random() * LANG.excercise.length()-1)

не получается

Idon'tKnow 20.05.2013 18:42

-1 не нужно делать. Представьте ситуацию, у Вас 3 вопроса, их индексы:
0, 1, 2. Если Рандом вернет 0,999, а количество вопросов = 3, то у Вас выйдет вот что:
Код AS3:

Math.floor(2,997 - 1);

=
Код AS3:

Math.floor(1,997);

А теперь что такое Math.floor? - Возвращает наименьшее значение числа или выражения, заданного параметром val. Наименьшее значение — это ближайшее целое число, которое не превышает или равняется заданному числу или выражению. (c адоб дат кам).

Т.е у Вас никогда последний элемент не вызовется, т.к 1, 997 округлится к 1. От 0 до 1 Вас будут выпадать 2 значения.

AlexTrin 20.05.2013 18:55

Работает только по порядку :
Код AS3:

if(question_id == LANG.excercise.length()) {
trace('end test');
return;

А рандомно не хочет:
Код AS3:

if(question_id == Math.floor( Math.random() * LANG.excercise.length)) {
trace('end test');
return;


Idon'tKnow 20.05.2013 18:58

Не уверен, но вроде как что-то типа такого должно быть:

Код AS3:

if(question_id == LANG.excercise.length -1) {
trace('end test');
return Math.floor( Math.random() * LANG.excercise.length)) ;
}

А вообще, если Вы вот этот код используете.

Код AS3:

function nextAnswer(event:MouseEvent) : void {
 if(question_id == myList.excercise.length()) {
    trace('end test');
    return;
 }     
 if (answerTxt.text == myList.excercise[question_id].answer) {
    question_id++;
    questionTxt.text = myList.excercise[question_id].question;
 }
}

То вот как должно быть, вроде.

Код AS3:

function nextAnswer(event:MouseEvent) : void {
 if(question_id == myList.excercise.length -1) {
    trace('end test');
    return;
    } 
question_id = Math.floor( Math.random() * myList.excercise.length);
 if (answerTxt.text == myList.excercise[question_id].answer) {
    question_id++;
    }
    questionTxt.text = myList.excercise[question_id].question;
}


AlexTrin 20.05.2013 19:02

Код AS3:

if(question_id == LANG.excercise.length -1) {
trace('end test');
return Math.floor( Math.random() * LANG.excercise.length) ;
}

Таким образом почему то идет все равно по порядку.

Idon'tKnow 20.05.2013 19:08

Цитата:

Сообщение от AlexTrin (Сообщение 1134045)
Код AS3:

if(question_id == LANG.excercise.length -1) {
trace('end test');
return Math.floor( Math.random() * LANG.excercise.length) ;
}

Таким образом почему то идет все равно по порядку.

Потому что этот код выдает Рандомный вариант только для последнего вопроса.

AlexTrin 20.05.2013 19:13

Код AS3:

function nextAnswer(event:MouseEvent) : void {
 if(question_id == myList.excercise.length -1) {
    trace('end test');
    return;
    } 
question_id = Math.floor( Math.random() * myList.excercise.length);
 if (answerTxt.text == myList.excercise[question_id].answer) {
    question_id++;
    }
    questionTxt.text = myList.excercise[question_id].question;
}

Этот метод зацикливает тест на 1 вопросе, постоянно только первый вопрос

in4core 20.05.2013 19:29

Зачем такой геморой , когда array.shuffle() - примеров полно в нете, сделайте тасовку в массиве, а про xml забудьте , нечего его постоянно дергать. Один раз достаточно все записать

Idon'tKnow 20.05.2013 19:34

Я так и не нашел, что у Вас questionTxt. Но ошибка вот тут, скорее всего.

Код AS3:

questionTxt.text = myList.excercise[question_id].question;

Т.к в Вашем коде, который Вы скинули изначально у Вас всего 1 значение excercise.

AlexTrin 20.05.2013 19:40

questionTxt, обычный динамический текст.

question_id:
Код AS3:

var question_id:uint = 0;

Данные XML:
Код:

<myList>
    <excercise>
        <question>2 x 2?</question>
        <answer>4</answer>
    </excercise>
</myList>

Добавлено через 21 час 44 минуты
Пробовал через array, тоже не получается
Код AS3:

 
var arr:Array = new Array();
 
if(var len:uint == myList.excercise.children().length()) {
                            trace('end test');
                    return;
                        }
                        if (answerTxt.text.toLowerCase() == myList.excercise[question_id].answer) {
                        for(question_id < len; question_id++;){
                                arr[question_id] = myList.excercise.children()[question_id];
                        }
                            questionTxt.text = myList.excercise[question_id].question;
}

Добавлено через 22 часа 55 минут
Допер короче, сделал так:


Код AS3:

     public class list extends MovieClip
    {
        var myFile:String;
        var xmlLoader:URLLoader;
        var myList:XML;
                var randomSelection:uint;
 
        public function list()
        {         
            myFile =  "myList.xml";
            loadXml();
 
        }
 
                public function randomMy(){
                                var n:uint;
                                var myArray = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18);
                                trace(myArray);
                                n = 3;
                                for (var i:Number = 0; i < n; i++) {
                                    randomSelection = Math.floor((Math.random() * myArray.length));
                                          //myArray.splice(randomSelection, 0);
                                }
                }
 
        function loadXml():void
        {
            xmlLoader = new URLLoader(new URLRequest(myFile));         
            xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded);
        }
        function xmlLoaded(e:Event):void
        {
            myList = new XML(e.target.data);
            myList.ignoreWhite = true;
 
 
            questionTxt.text = myList.excercise[randomSelection].question;
            checkBtn.addEventListener(MouseEvent.MOUSE_DOWN, checkAnswer);
 
        }
 
          function checkAnswer (e:MouseEvent):void {
                          if(randomSelection == myList.excercise.length()) {
                            trace('end test');
                            return;
                        } 
              if (answerTxt.text == myList.excercise[randomSelection].answer) {
                                    randomMy();
                                    questionTxt.text = myList.excercise[randomSelection].question;
                    trace ("correct");
 
 
            } else {
              trace ("wrong");
            }
        }
 
    }

Правда не понятно почему иногда при переходе на след вопрос, переходит на тот же что уже был, то есть повторяется часто независимо от того сколько вопросов, как это можно исправить?


Часовой пояс GMT +4, время: 05:44.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.