PDA

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


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>



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 минут
Пробовал так, что то не выходит:

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


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

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
так чтоли ?

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
Пытаюсь вывести вопросы из списка случайным образом, что то не выходит.
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
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
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). function nextAnswer(event:MouseEvent) : void
return myList.excercise[randomIndex];
Не забыли поменять тип возвращаемых данных?

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

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

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

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
var randomIndex:int = Math.floor( Math.random() * myList.excercise.length);


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

AlexTrin
20.05.2013, 18:30
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, то у Вас выйдет вот что:
Math.floor(2,997 - 1); = Math.floor(1,997);

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

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

AlexTrin
20.05.2013, 18:55
Работает только по порядку :
if(question_id == LANG.excercise.length()) {
trace('end test');
return;

А рандомно не хочет:
if(question_id == Math.floor( Math.random() * LANG.excercise.length)) {
trace('end test');
return;

Idon'tKnow
20.05.2013, 18:58
Не уверен, но вроде как что-то типа такого должно быть:

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

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

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

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

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
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
if(question_id == LANG.excercise.length -1) {
trace('end test');
return Math.floor( Math.random() * LANG.excercise.length) ;
}

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

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

AlexTrin
20.05.2013, 19:13
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. Но ошибка вот тут, скорее всего.

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

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

AlexTrin
20.05.2013, 19:40
questionTxt, обычный динамический текст.

question_id:
var question_id:uint = 0;

Данные XML:
<myList>
<excercise>
<question>2 x 2?</question>
<answer>4</answer>
</excercise>
</myList>

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

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 минут
Допер короче, сделал так:


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

}

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