アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在、クイズを作っています。

外部のXMLファイルから問題を読み込み、それをランダムに5問出題させ、さらに重複させないようにしたいのですが、経験不足のため思うように出来ません。

flashファイル 
////////////////////////////////////
var a_xml:XML = new XML();
a_xml.onLoad = function()
{

var top:XMLNode = a_xml.firstChild;

for(i = 0; i<top.childNodes.length;i++){
var item:XMLNode = top.childNodes[i];
trace(item.attributes.name);

}
}
a_xml.ignoreWhite = true;
a_xml.load("xml/test.xml");

////////////////////////////////////

XMLファイル test.xml
////////////////////////////////////

<?xml version="1.0" encoding="UTF-8"?>
<items>

<item name="test1" value="0" />
<item name="test2" value="1" />
<item name="test3" value="2" />
<item name="test4" value="3" />
<item name="test5" value="4" />
<item name="test6" value="5" />

</items>

////////////////////////////////////

XMLファイルの読み込みは何とかできたのですが、ここからどうやってランダムに読み込むかが分かりません。

XML要素のnameをランダムで出題したい場合どうしたらいいのですか?

ここから先は、多分Math.randomを使うのだろうというレベルでしか分からないため、なんとかご教授お願いできませんか?

環境はwin,FlashMX2004です。

A 回答 (1件)

ランダムに5問を出題するルール(どのように出題するのか)がわかりませんが,


例えば,

 name_txt0 value_txt0
 name_txt1 value_txt1
 name_txt2 value_txt2
 name_txt3 value_txt3
 name_txt4 value_txt4

というインスタンス名を持つテキストフィールドを用意して,

 [test4  ] [3 ]
 [test1  ] [0 ]
 [test6  ] [5 ]
 [test3  ] [2 ]
 [test2  ] [1 ]

のようにランダムな表示をさせたいのでしたら,
次のような感じのスクリプトになると思います。
次のスクリプトはテキストフィールド自体もActionScriptで作成する例です。

------------------------------------------
// XMLインスタンス a_xml の作成
var a_xml:XML = new XML();

// ランダムな数を入れる配列の作成
var randomArr:Array = new Array();


// XML ロード時の動作を定義
a_xml.onLoad = function() {

// firstChild ノードを top とする
var top:XMLNode = a_xml.firstChild;
// topノードのノード数を len に代入しておく
var len:Number = top.childNodes.length;

//ランダム配列に 0, 1, 2, 3, …,len-1 を代入
for (var i:Number = 0; i<len; i++) {
randomArr[i] = i;
}

// 元の配列をランダムシャッフル
for (i=0; i<len; i++) {
// 0 以上 len-i 未満の整数の乱数を取得
var j:Number = Math.floor(Math.random()*(len-i));
// randomArr[len-1-i] と randomArr[j] を入れ替える
var k:Number = randomArr[len-1-i];
randomArr[len-1-i] = randomArr[j];
randomArr[j] = k;
}

// i = 0 ~ 4 でループ
for (i=0; i<5; i++) {

// --- ↓手動で作成する場合は以下不要↓ ---
// テキストフィールド name_txt0~5 を作成
_root.createTextField("neme_txt"+i, i, 10, i*30+10, 140, 20);
_root["neme_txt"+i].border = true;
// テキストフィールド value_txt0~5 を作成
_root.createTextField("value_txt"+i, i+5, 160, i*30+10, 20, 20);
_root["value_txt"+i].border = true;
// --- ↑手動で作成する場合は以上不要↑ ---

// top.childNodes[ランダム] ノードを item とする
var item:XMLNode = top.childNodes[randomArr[i]];

// name_txt0~5 にランダムな name 属性を表示
_root["neme_txt"+i].text = item.attributes.name;
// value_txt0~5 にランダムな value 属性を表示
_root["value_txt"+i].text = item.attributes.value;
}
};


// 余分な余白などを無視
a_xml.ignoreWhite = true;

// 外部XML ファイルのロード
a_xml.load("xml/test.xml");
------------------------------------------



「配列を偏りなくランダムに並替える」
http://www.fumiononaka.com/TechNotes/Flash/FN021 …

Google検索「配列アクセス演算子」
http://www.google.co.jp/search?hl=ja&q=%E9%85%8D …
    • good
    • 0
この回答へのお礼

返事遅れて申し訳ございません。丁寧な解説ありがとうございます。いろいろと試行錯誤しながら徐々に理解できております。参考になりました。

お礼日時:2008/02/03 23:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!