トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     MXで外部テキストを利用したランダムクイズの作成
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
miboo
Åê¹ÆNo.8545
投稿日時: 2004-6-24 11:00
新米
居住地:
投稿: 13
使用環境:
WinXP Flash MX2004 pro
MacOSX 10.3.4 Flash MX2004
MXで外部テキストを利用したランダムクイズの作成
はじめましてmibooと申します。
ランダムクイズの作成で行き詰ってしまったので
ぜひ、ご助言いただきたく投稿させていただきます。

まず、クイズの仕様ですが、全部で40問の3択クイズです。
一回の出題は10問です。
問題と3つの選択肢、答えは外部txtファイルに以下のように
記述しています。
questionArray=問題,選択肢A,選択肢B,選択肢C,正解,



問題,選択肢A,選択肢B,選択肢C,正解&endFlag=1
としてこれをquestion.txtとしています。

後日難易度別に作ろうと思っているのですが、
現在難易度が1つしかないので、
1フレーム目に

this.endFlag = 0;
if (this.difficult == 1) {
this.loadVariables( "question.txt" );
}

と記述し

3フレーム目で下記のように記述し初期化しています。

this.questionArray = this.questionArray.split(newline);
for (i=0; i<this.questionArray.length; i++) {
questionArray[i] = questionArray[i].split(",");
}
this.totalCorrect = 0;
this.totalCount = 0;

次に4フレーム目で配列からランダムに問題を拾い、
それぞれ配列から変数を拾うようにしています。
this.currentQuestion = Math.floor( Math.random() * this.questionArray.length );
this.question = questionArray[ this.currentQuestion ][ 0 ];
this.selectA = questionArray[ this.currentQuestion ][ 1 ];
this.selectB = questionArray[ this.currentQuestion ][ 2 ];
this.selectC = questionArray[ this.currentQuestion ][ 3 ];
this.correct = questionArray[ this.currentQuestion ][ 4 ];

正解、不正解の判定は下記のような記述をしております。
if (this.answer == this.correct) {
this.judgeIcon.gotoAndPlay("correct");
this.totalCorrect++;
if (this.totalCorrect == 1) {
this.count1.gotoAndPlay(2);
} else if (this.totalCorrect == 2) {
this.count2.gotoAndPlay(2);
} else if (this.totalCorrect == 3) {
this.count3.gotoAndPlay(2);
}else if (this.totalCorrect == 4) {
this.count4.gotoAndPlay(2);
}else if (this.totalCorrect == 5) {
this.count5.gotoAndPlay(2);
}else if (this.totalCorrect == 6) {
this.count6.gotoAndPlay(2);
}else if (this.totalCorrect == 7) {
this.count7.gotoAndPlay(2);
}else if (this.totalCorrect == 8) {
this.count8.gotoAndPlay(2);
}else if (this.totalCorrect == 9) {
this.count9.gotoAndPlay(2);
}else if (this.totalCorrect == 10) {
this.count10.gotoAndPlay(2);
}
} else {
this.judgeIcon.gotoAndPlay("incorrect");
}
this.totalCount++;
this.correctRatio = Math.round(this.totalCorrect/totalCount*1000)/10;
this.answer = "";
this.stop();

ここまでで、ランダムに読み込むことはできたのですが、同じ問題が出てしまうので同じ問題が出題されないようにしたいのですが、やり方として、問題それぞれに、ユニークナンバーを振り分け最初に10問一気にランダムで読みこんでしまい、その中には同じ番号が入らないようにするのが一番スマートかとおもうのですが、記述のしかたが思い浮かばず・・・・といったところで躓いております。


どなたか、ご助言、ご助力願えますでしょうか。
宜しくお願いいたします。



野中文雄
Åê¹ÆNo.8546
投稿日時: 2004-6-24 11:09
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: MXで外部テキストを利用したランダムクイズの作成
外部テキストファイルから読込んだ40の問題のデータを、(2次元)配列に作成することまではおできになっているということですね。
引用:
mibooさんは書きました:
まず、クイズの仕様ですが、全部で40問の3択クイズです。
一回の出題は10問です。
問題と3つの選択肢、答えは外部txtファイルに以下のように
記述しています。
questionArray=問題,選択肢A,選択肢B,選択肢C,正解,



問題,選択肢A,選択肢B,選択肢C,正解&endFlag=1
としてこれをquestion.txtとしています。
...
1フレーム目に
this.endFlag = 0;
// ...[中略]...
    this.loadVariables( "question.txt" );

と記述し

3フレーム目で下記のように記述し初期化しています。
this.questionArray = this.questionArray.split(newline);
for (i=0; i<this.questionArray.length; i++) {
	questionArray[i] = questionArray[i].split(",");
}

...
次に4フレーム目で配列からランダムに問題を拾い、
それぞれ配列から変数を拾うようにしています。
this.currentQuestion = Math.floor( Math.random() * this.questionArray.length );
this.question = questionArray[ this.currentQuestion ][ 0 ];

設問の配列がすでにできあがっているのでしたら、そのエレメントをランダムに並替えればよいと思います。
引用:
ここまでで、ランダムに読み込むことはできたのですが、同じ問題が出てしまうので同じ問題が出題されないようにしたいのですが、やり方として、問題それぞれに、ユニークナンバーを振り分け最初に10問一気にランダムで読みこんでしまい、その中には同じ番号が入らないようにするのが一番スマートかとおもうのですが、記述のしかたが思い浮かばず・・・・といったところで躓いております。


----------------
 

miboo
Åê¹ÆNo.8549
投稿日時: 2004-6-24 11:29
新米
居住地:
投稿: 13
使用環境:
WinXP Flash MX2004 pro
MacOSX 10.3.4 Flash MX2004
Re: MXで外部テキストを利用したランダムクイズの作成
野中様

すばやいご回答ありがとうございます!
早速下記を参考にしてチャレンジしてみます。
また躓いてしまったらご助言、ご助力いただければ幸いです。
それでは宜しくお願いいたします。
引用:

設問の配列がすでにできあがっているのでしたら、そのエレメントをランダムに並替えればよいと思います。
miboo
Åê¹ÆNo.8557
投稿日時: 2004-6-24 15:45
新米
居住地:
投稿: 13
使用環境:
WinXP Flash MX2004 pro
MacOSX 10.3.4 Flash MX2004
Re: MXで外部テキストを利用したランダムクイズの作成
mibooです。
お世話になります。

先ほど教えていただいたスクリプトを組み込む場合の
スクリプトの流れとして

配列を偏りなくランダムに並び替える

並び替えられた配列からランダムで問題を選択

という流れになると思い、

//偏りなくランダムに並び替え
function shuffleArray(questionArray) {
var i = questionArray.length;
while (i--) {
var j = Math.floor(Math.random()*(i+1));
var t = questionArray[i];
questionArray[i] = questionArray[j];
questionArray[j] = t;
}
}

//さらに問題のランダム表示
this.currentQuestion = Math.floor( Math.random() * this.questionArray.length );
this.question = questionArray[ this.currentQuestion ][ 0 ];




と上記ようにスクリプトを記述しましたが
やはり同じ問題が表示されてしまいました。

先ほどの仕様の説明で足りなかったと思われるのですが、

処理の流れとして

1)問題を定義
  ↓
2)判定
  ↓
3)正解、不正解のリアクションを別MCで表示
  ↓
4)10問正解の場合は全問正解へと抜ける
  それ以外は1)に戻る

という形です。(関係なかったらすみません。)

私の上記の考え方が間違っている可能性大ですので
ご助言、ご助力いただけないでしょうか。
宜しくお願いいたします。

野中文雄
Åê¹ÆNo.8558
投稿日時: 2004-6-24 16:14
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: MXで外部テキストを利用したランダムクイズの作成
「流れ」が違います。あたまをマルくする」必要がありますね。

当初試されていた方法は、カードでいえば、テーブルに置いたカードの山から、ランダムに1枚ずつ札を抜取るのと同じです。問題は、引いたカードを、また山に戻したことです。

カードゲームでは、1枚ずつランダムに抜いていくなどという、手間のかかる方法は採りません。最初にカードを(1)十分にシャッフルし、そのカードの(2)頭から順番に配ります。
引用:
mibooさんは書きました:
配列を偏りなくランダムに並び替える

並び替えられた配列からランダムで問題を選択

という流れになると思い、

私は「最初に運命を決める」方法と呼んでいます。


----------------
 

miboo
Åê¹ÆNo.8562
投稿日時: 2004-6-24 18:14
新米
居住地:
投稿: 13
使用環境:
WinXP Flash MX2004 pro
MacOSX 10.3.4 Flash MX2004
Re: MXで外部テキストを利用したランダムクイズの作成
mibooです。
お世話になります。

なるほど、最初に出題される問題を決めてしまい(運命を決める)それを頭から順に表示させればよいわけですね。
そこで下記の様に記述してみましたが、
問題が出力されませんでした。。。

//問題のシャッフル(同一問題がでないようにする)
function RandomArray(questionArray) {
var qResult = questionArray.concat();
var i = qResult.length;
while (i--) {
var question = Math.floor(Math.random()*(i+1));
var tmp = qResult[i];
qResult[i] = qResult[question];
qResult[question] = tmp;
}
return qResult;
}
//運命を決める
qt = RandomArray(questionArray);
this.currentQuestion = qt;
this.question = questionArray[ this.currentQuestion ][ 0 ];



ためしに出力をみてみたのですが、
解答欄の部分は
テキスト編集: Variable=_level0.selectA 可視=true テキスト = "
という風に出るのですが、問題部分はシンボルと表示されるだけで出力されていませんでした。

見当違いの方向に進んでしまっていたらもうしわけないです。
どうすればよいかアドバイスお願いいたします。

宜しくお願いいたします。



野中文雄
Åê¹ÆNo.8564
投稿日時: 2004-6-24 19:00
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: MXで外部テキストを利用したランダムクイズの作成
スクリプトの処理の内容は、「ActionScript辞書」などで確認されていますか?

ランダムに並替える関数は、先のポストで試された処理と比べて、ステートメントが2行追加されています。どちらを使用しても、同じ結果は得られます。けれど、具体的なスクリプトは異なってきますので、必ず意味は確認してください。
引用:
mibooさんは書きました:
そこで下記の様に記述してみましたが、
問題が出力されませんでした。。。
//問題のシャッフル(同一問題がでないようにする)
function RandomArray(questionArray) {
    var qResult = questionArray.concat();
    var i = qResult.length;
    while (i--) {
        var question = Math.floor(Math.random()*(i+1));
        var tmp = qResult[i];
        qResult[i] = qResult[question];
        qResult[question] = tmp;
    }
    return qResult;
}
//運命を決める
qt = RandomArray(questionArray);
trace(qt);  //【処理結果を確認!!】
this.currentQuestion = qt;
this.question = questionArray[ this.currentQuestion ][ 0 ];


----------------
 

miboo
Åê¹ÆNo.8569
投稿日時: 2004-6-25 1:18
新米
居住地:
投稿: 13
使用環境:
WinXP Flash MX2004 pro
MacOSX 10.3.4 Flash MX2004
Re: MXで外部テキストを利用したランダムクイズの作成
mibooです。
おせわになります。

野中様
あれから色々友人の力をかりたりして試行錯誤しまして、なんとかうごきました
ムービーの流れとして正解する度に毎回ランダムで読み込んでいたものを
運命を決めておくという意味をもう一度とらえ直して変えてみました。
クイズの質問にユニークIDを振り、問題定義の前の段階で参考に教えてた頂いた
運命を決めておくスクリプトでランダムな配列を読み出し、重複がないように
しました。また、それを頭から順に出題するようにカウントベースでループするようにしました。スクリプトとしては下記の様になってます。

問題定義の前段階として運命を決めてます。

function xRandomArray(lArray) {
var lResult = lArray.concat();
var i = lResult.length;
while (i--) {
var nPos = Math.floor(Math.random()*(i+1));
var temp = lResult[i];
lResult[i] = lResult[nPos];
lResult[nPos] = temp;
}
return lResult;
}
a0 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39"];
a = xRandomArray(a0);
//配列をランダムに並び替え
var qArray = [];
var k = 10;
for (i=0; i<k; i++) {
ax = a[i];
ay = questionArray[ax];
qArray.push(ay);
}
trace(qArray);

その後次のフレームでカウントごとに頭から表示させるようにしました。

this.question = qArray[this.totalCount][0];
this.selectA = qArray[this.totalCount][1];
this.selectB = qArray[this.totalCount][2];
this.selectC = qArray[this.totalCount][3];
this.correct = qArray[this.totalCount][4];

非常に有効なアドバイスを頂き本当にありがとうございました。
無事動くようになり、一安心です。


野中文雄
Åê¹ÆNo.8570
投稿日時: 2004-6-25 1:57
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: MXで外部テキストを利用したランダムクイズの作成
直接出題の配列を並替えてはダメなのでしょうか?
引用:
mibooさんは書きました:
クイズの質問にユニークIDを振り、問題定義の前の段階で参考に教えてた頂いた
運命を決めておくスクリプトでランダムな配列を読み出し、重複がないように
しました。また、それを頭から順に出題するようにカウントベースでループするようにしました。スクリプトとしては下記の様になってます。

function xRandomArray(lArray) {
	var lResult = lArray.concat();
	var i = lResult.length;
	while (i--) {
		var nPos = Math.floor(Math.random()*(i+1));
		var temp = lResult[i];
		lResult[i] = lResult[nPos];
		lResult[nPos] = temp;
	}
	return lResult;
}
/*
a0 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39"];
*/
// a = xRandomArray(a0);
qArray = xRandomArray(questionArray);
//配列をランダムに並び替え
/*
var qArray = [];
var k = 10;
for (i=0; i<k; i++) {
	ax = a[i];
	ay = questionArray[ax];
	qArray.push(ay);
}
*/
trace(qArray);

引用:
その後次のフレームでカウントごとに頭から表示させるようにしました。
this.question = qArray[this.totalCount][0];
this.selectA = qArray[this.totalCount][1];
this.selectB = qArray[this.totalCount][2];
this.selectC = qArray[this.totalCount][3];
this.correct = qArray[this.totalCount][4];


----------------
 

miboo
Åê¹ÆNo.8823
投稿日時: 2004-7-2 21:14
新米
居住地:
投稿: 13
使用環境:
WinXP Flash MX2004 pro
MacOSX 10.3.4 Flash MX2004
Re: MXで外部テキストを利用したランダムクイズの作成
野中様

返事が遅くなってしまい申し訳ありませんでした。
動作確認ができたので安心していました。

野中様のご提案で同様に動作しました。
シンプルな記述だったので、□い頭を○くするというのはあーなるほど、こういうことかと感動しております!

これからも色々とアクションスクリプトに挑戦していきますので、今後とも宜しくお願いいたします。

ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops