开发者

Permutation of Actionscript 3 Array

Greetings,

This is my first post and I hope someone out there can help. I am an educator and I designed a quiz using Actionscript 3 (Adobe Flash) that is to determine all the different ways a family can have three children.

I have two buttons that enter either the letter B (for boy) or G (for girl) into an input text field named text_entry. I then have a submit button named enter_btn that checks to see if the entry into the input text is correct. If the input is correct, the timeline moves to the next problem (frame labeled checkmark); if it is incorrect the timeline moves to the end of the quiz (frame 62).

The following code works well for any particular correct single entry (ie: BGB). I need to write code in which all eight correct variations must be entered, but they can be entered in any order (permutation):

ie: BBB,BBG,BGB,BGG,GBB,GBG,GGB,GGG; or

BGB,GGG,BBG,BBB,GGB,BGB,GGB,BGG; or

GGB,GGG,BBG,BBB,GGB,BGB,BGB,BGG; etc...

there are over 40,000 ways to enter these eight ways of having three children. Help!

baby_B.addEventListener(MouseEve开发者_如何学JAVAnt.CLICK, letterB);
function letterB(event:MouseEvent)
{
text_entry.appendText("B");
}

baby_G.addEventListener(MouseEvent.CLICK, letterG);
function letterG(event:MouseEvent)
{
text_entry.appendText("G");
}

enter_btn.addEventListener(MouseEvent.CLICK, check);
function check(event:MouseEvent):void {
var solution_S:Array=["BBB","BBG","BGB","BGG","GBB","GBG","GGB","GGG "];

if(solution_S.indexOf(text_entry.text)>=0)
{
gotoAndStop("checkmark");
}
else
{
gotoAndPlay(62);
}
}

If you know the correct code, please write it out for me. Thanks!


You will just need to keep a little bit of state to know what the user has entered so far. One possible way of doing that is to have a custom object/dictionary that you initialize outside all your functions, so that it is preserved during the transitions between frames/runs of the functions:

var solutionEntered:Object = {"BBB":false, "BBG":false, /*fill in rest */ };

Then in your function check you can perform an additional check, something like:

function check(event:MouseEvent):void {
    var solution_S:Array=["BBB","BBG","BGB","BGG","GBB","GBG","GGB","GGG "];
    if(solution_S.indexOf(text_entry.text)>=0) {
        // We know the user entered a valid solution, let's check if
        // then entered it before
        if(solutionEntered[text_entry.text]) {
            // yes they entered it before, do whatever you need to do
        } else {
            // no they haven't entered it, set the status as entered
            solutionEntered[text_entry.text] = true;
        }
        // continue rest of your function
     }
     // continue the rest of your function
 }

Note that this is not necessarily an optimal solution, but it keeps with the code style you already have.


Try this:

import flash.text.TextField;
import flash.events.MouseEvent;
import flash.display.Sprite;

var correctAnswers : Array = [ "BBB", "BBG", "BGB", "GBB", "BGG", "GGB", "GBG", "GGG" ];
var answersSoFar : Array;
var textField : TextField; //on stage
var submitButton : Sprite; //on stage
var correctAnswerCount : int;

//for testing
textField.text = "BBB,BBG,BGB,GBB,BGG,GGB,GBG,GGG"; 
//textField.text = "BGB,BBB,GGG,BBG,GBB,BGG,GGB,GBG,";
//textField.text = "BBB,BBG, BGB,GBB,BGG, GGB, GBG,   GGG";
//textField.text = "BBB,BBG,BGB,GBB,BGG,GGB,GBG"; 
//textField.text = "BBB,BBG,BGB,GBB,BGG,GGB,GBG,GGG,BBG"; 

submitButton.addEventListener( MouseEvent.CLICK, onSubmit );

function onSubmit( event : MouseEvent ) : void
{
    var answers : Array = getAnswersArray( textField.text );

    answersSoFar = [];
    correctAnswerCount = 0;

    for each ( var answer : String in answers ) 
        if ( answerIsCorrect( answer ) ) correctAnswerCount++;

    if ( correctAnswerCount == correctAnswers.length ) trace( "correct" );
    else trace( "incorrect" );
}

function getAnswersArray( string : String ) : Array
{
    string = removeInvalidCharacters( string );
    return string.split( "," );
}

function removeInvalidCharacters( string : String ) : String
{
    var result : String = "";

    for ( var i : int, len = string.length; i < len; i++ )
        if ( string.charAt( i ) == "B" || string.charAt( i ) == "G" || string.charAt( i ) == "," )
            result += string.charAt( i );

    return result;
}

function answerIsCorrect( answer : String ) : Boolean
{
    if ( answerIsADuplicate( answer ) ) return false;
    else answersSoFar.push( answer );

if ( answerIsInListOfCorrectAnswers( answer ) ) return true;
    return false;
}

function answerIsInListOfCorrectAnswers( answer : String ) : Boolean
{
    if ( correctAnswers.indexOf( answer ) == -1 ) return false;
    return true;
}

function answerIsADuplicate( answer : String ) : Boolean
{
    if ( answersSoFar.indexOf( answer ) == -1 ) return false;
    return true;
}


note that in the original code you pasted, you have an extra space in the last element of your correct answer list - "GGG " should be "GGG"

this works

baby_B.addEventListener(MouseEvent.CLICK, letterB);
function letterB(event:MouseEvent) {
    text_entry.appendText("B");
}

baby_G.addEventListener(MouseEvent.CLICK, letterG);
function letterG(event:MouseEvent) {
    text_entry.appendText("G");
}

var valid:Array = ["BBB","BBG","BGB","BGG","GBB","GBG","GGB","GGG"];

enter_btn.addEventListener(MouseEvent.CLICK, check);
function check(event:MouseEvent):void {
    var parts:Array = text_entry.text.split(/,\s*/g);  // split the text into component parts
    var dup:Array = valid.slice();  // copy the correct list
    while(parts.length){  // run through each answer component
        var part:String = parts.pop();  // grab the last one
        part = part.replace(/(^\s+|\s+$)/g, '');  // strip leading/trailing white space
        var pos:int = dup.indexOf(part);  // is it in the list of correct answers?
        if(pos != -1){  // if it is...
            dup.splice(pos, 1);  // then remove that answer from the list
        }
    }
    if(dup.length == 0) {  // if it's 0, they got all the correct answers
        gotoAndStop("checkmark");
    } else {  // otherwise, they didn't get one or more correct answers
        gotoAndPlay(62);
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜