2016-07-06 11 views
1

ステージ上のxmlリストからランダム質問を表示しようとしています。ユーザーがオプションをクリックすると、別の質問に移動する必要がありますが、取得した質問はリストから削除して元に戻りません。 ランダム化部分は大丈夫ですが、リストから質問を削除する方法を理解することはできません。 ここに私が持っているセクションです。Flash AS3 xmlリストからランダムな項目を表示し、その項目をリストから削除して再利用しないようにする方法

function randomizeQuestion():void { 
    var numOfQuestions:Number = xmlData.item.length(); 
    var shuffledNumbers:Array = new Array(randomAns.length); 
    var randomPos:Number = 0; 

    //Randomizes selected question 
    currentQuestion = int(Math.random() * numOfQuestions); 

    //Randomizes answer numbers 
    for (var i:int = 0; i < shuffledNumbers.length; i++) 
    { 
     randomPos = int(Math.random() * randomAns.length); 
     shuffledNumbers[i] = randomAns.splice(randomPos, 1)[0]; 
    } 

    randomAns = shuffledNumbers; 

    correctAns = xmlData.item[currentQuestion].children().(hasOwnProperty("@correct")); 
} 

答えて

2

対象のすべての質問を保存できる別の配列をコードに追加します。質問が尋ねられると、その配列からそれを削除します。したがって、allQuestionsとqualifiedQuestionsの配列を1つずつ配列します。 allQuestionsは包括的なリストにすぎません。次に、移動したいすべての質問をeligibleQuestions配列にプッシュします。質問に答えが出されると、配列からスプライスされます。

2

読み込んでいるXMLファイルの例を共有することもできますが、以下の例を使用してみましょう。

<data> 
    <item> 
     <question></question> 
     <option1></option1> 
     <option2></option2> 
    </item> 
    <item> 
     <question></question> 
     <option1></option1> 
     <option2></option2> 
    </item> 
</data> 

あなたが持っているコードに基づいて、質問をランダム化するたびにあなたの関数が呼び出されていると仮定します。

ここでは、この関数の外にある<item>タグの数を保持する配列を作成して、いつでも値を削除できるようにしたいと考えています。

var numOfQuestions:Array = new Array();をグローバル変数として作成し、randomizeQuestions()関数を入力する前にループを使用して初期化することができます。

for(var i = 0; i < xmlData['item'].length(); i++) 
{ 
    numOfQuestions.push(i); 
} 

基本的に、この配列は、特定のアイテムを呼び出し、任意の方法で実際のXMLファイルを変更することなく、プログラムからそれを除去する方法として役立ちます。

あなたが使用して要素

numOfQuestions.splice(numOfQuestions.indexOf(valueToBeRemoved), 1);

を削除したい時はいつでもそして、これはあなたが削除して、配列からそれを削除したい要素の配列を検索します。

最後に、randomizeQuestionの機能を変更する必要があります。

  • currentQuestion = int(Math.random() * numOfQuestions.length); //since numOfQuestions is now an array instead of a Number
+0

私はいくつかの点でこのことを試していますが、どこかで何かが不足しているようです。私も@Nealからの提案を試みましたが、私はこれほどうまくいきませんから、私は先に進まないだけです。あなたの誰かが私に助けてくれる詳細を少しでも与えることができますか?私が初心者であることを覚えているので、私はおそらく何か正しいことをしていないでしょう。 – Don

+0

何が起こるかは、最初の質問だけを表示し、それ以上は表示しないということです。それはすべての質問を得ているようではありません。 – Don

+0

forループの2番目の部分を 'i

3

インデックスを取得しよう:

correctAnsIndex = xmlData.item[currentQuestion].children().(hasOwnProperty("@correct")).childIndex(); 

以上の要素であれば、最初のものを得るために:

correctAnsIndex = xmlData.item[currentQuestion].children().(hasOwnProperty("@correct"))[0].childIndex(); 

そして、ここのように、適切な場合には、削除に使用:

delete xmlData.item[correctAnsIndex]; 
+0

私はあなたの提案を@Nemiに実装しようとしてきましたが、私のコードはさまざまなtypeErrorsでバグが発生するため、おそらく間違っています。私はあなたに詳細を与える必要がありますか? – Don

+0

これがないとコードにエラーがありますか?あなたが使用したコードであなたの質問を更新できますか? – Nemi

関連する問題