ActionScript 3读取equasion的文本文件,使用答案检查输入

时间:2012-06-18 01:54:58

标签: actionscript-3 text-processing

我正在为小孩子制作一个基于数学的教育性Flash游戏,我希望能够从文本文件中读取as3,在文本框中打印的问题,然后由用户输入并进行比较如果没有加载另一个问题供用户回答,也可以在该文件中回答用户是否输入了正确的答案。

我之前在Visual Basic中做过这样的事情,制作一个文本语言词典,文件中的单词用'='分隔,我告诉程序它们被那个字符分开,打印的程序将这两个单词分成单独的文本框,相互对齐。如:“lol = Laughing Out Loud”是其中一条线。

我希望能够在一行上有一个文本文件,例如“2x2 = 4”,然后游戏就可以将符号的左侧打印给用户,然后检查用户的输入标志右侧的内容,看到答案是正确的。

我希望这不会太混乱。我已经尝试将文件打印到文本框中,但我不确定如何使其仅打印问题,而不是整个文件,然后检查答案。

我是AS3和Flash的初学者,并承认这可能是我的技能水平的过度实验。 任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

当您想要开始使用Flash中更复杂的内容时,可能很难找到方法。正如Jordan建议的那样,xml是请求信息的最佳方式。你的xml文件看起来像这样:

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

(您可以将其复制并粘贴到记事本并将其另存为.xml)

在Flash动作脚本中,您需要一些项目才能解决此xml问题。我在一个名为“Main.as”的单独的actionscript文件中使用以下模板:

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;
            //totalNr = myList.excercise.length(); = the amount of excercises in your file
            //var str:string = myList.excercise[0].question;
            //trace (str) would give you the text of the question of the first excercise
        }
    }

}

修改 假设您在舞台上创建了一个文本框,并将其命名为 questionTxt 。要将问题添加到该文本框,您可以说:

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

在其下方,创建一个输入文本字段,学生可以在其中输入答案。称之为 answerTxt

同时创建一个复选按钮,以便他们在给出答案后按下它。称之为 checkBtn

您还需要一个函数来将其输入与xml中的答案进行比较。我将在下面提到它。

现在您将checkltner添加到checkBtn,如下所示:

checkBtn.addEventListener(MouseEvent.CLICK, checkAnswer)

检查答案的功能(方便地命名为 checkAnswer ):

function checkAnswer (event:MouseEvent) : void {
    if (answerTxt.text == myList.excercise[0].answer) {
        trace ("correct");
    } else {
        trace ("wrong");
    }
}

您将xml-data视为数组。第一个练习将被发现为myList.excercise [0] .question,第二个练习将是myList.excercise [1] .question等。

答案 1 :(得分:1)

你听说过xml吗?它非常适合你想要做的事情。至于加载,请使用URLLoader和URLRequest类。一旦加载,您将需要一个完整的处理程序来处理数据。我会在as3中使用Google xml来了解如何使用它。然后查看Adobe帮助停靠站以找出加载情况。自学是最好的学习方式所以我鼓励你尽量自己解决,但如果你有问题,请在这里问我们,或者我或其他人可以帮你弄清楚具体细节。

答案 2 :(得分:0)

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中管理了正确答案的挑战代码,如果正确,则紧接着下一个问题。 如何实现它无法达到。