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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     クイズcsvの読み込みをカテゴリ別に変えたい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
werdan
Åê¹ÆNo.45602
投稿日時: 2010-8-30 10:39
新米
居住地:
投稿: 4
使用環境:
WinXP
flash cs3
使用言語AS3
クイズcsvの読み込みをカテゴリ別に変えたい
はじめまして、wedanと申します。
この度は稚拙ながらも学ばせて頂きたい所存ですので
どうぞ宜しくお願い致します。

質問です
私は現在CSV読み込みでのクイズを作成しております。
出題数は20問
クイズには4つ(FS、M1、M2、M3)のカテゴリと共通問題があり
それぞれを15問、5問の割合で引っ張ってくるように設定しておりました。

ここに新たに「SM」というカテゴリを加え、共通問題からは吸い上げをせず、全て「SM.CSV」から20問吸い上げるという設定にしたいと考えております。

現在これをif文で設定するやり方を考えているのですが
もっと簡単にswitchの中で設定するやり方はないものかと模索しております。

宜しくお願い致します

環境
flash cs3
AS3
WinXP

-----------------------------------------------------------
「QuizManager.as」

//出題問題を管理するクラス
//


package script.model
{
import flash.events.EventDispatcher
import flash.events.Event;
import script.model.QuizCollection;

public class QuizManager extends EventDispatcher
{

//quizCollectionから問題を出題するランクを決めるクラス
//共通問題出題数を決めるクラス

//出題問題
public var quiz:Array;
//問題集
public var quizCollection:QuizCollection;

private var targetQuestions;


//問題数
private var quizNum:int;

//共通問題数
private var commonNum:int=5;


public function QuizManager()
{
quiz=new Array()
quizCollection=new QuizCollection;
}

/* id:data[i][0],
rank:data[i][1],
question:data[i][2],
explanation:data[i][3],
choice1:data[i][4],

choice2:data[i][6],
choice3:data[i][8],
choice4:data[i][10],
correct:correct
*/


private function setQuestions()
{
for(var i=20;i<targetQuestions.length;i++)
{
quiz.push(targetQuestions[i])
}

shuffle(quiz)

var _common:Array=new Array()


if ( setQuestions == quizCollection.SM)
{
for(i=0;i<quizCollection.COMMON.data.length;i++)
{
_common.push(quizCollection.COMMON.data[i])
}
shuffle(_common)

for(i=0;i<commonNum;i++)
{
quiz.unshift(_common[i])
}
}

else
{
for(i=0;i<quizCollection.COMMON.data.length;i++)
{
_common.push(quizCollection.COMMON.data[i])
}
shuffle(_common)

for(i=0;i<commonNum;i++)
{
quiz.unshift(_common[i])
}
}



quiz=quiz.slice(0,quizNum)

for(var j=0;j<quizNum;j++)
{
quiz[j].order=j+1;
quiz[j].answer=new Object()
}
/* id:data[i][0],
rank:data[i][1],
question:data[i][2],
explanation:data[i][3],
choice1:data[i][4],
choice2:data[i][6],
choice3:data[i][8],
choice4:data[i][10],
correct:correct
order1-20
answer:1-4
*/

}



private function shuffle(value:*)
{
for(var i=0;i<value.length;i++)
{
var j:int=int(Math.random()*(i+1))
var temp:Object=value[j];
value[j]=value[i];
value[i]=temp;
}
return value;
}

public function setSkill(value)
{
switch(value)
{
case "FS" :
targetQuestions=quizCollection.FS.data;
break;

case "M1" :
targetQuestions=quizCollection.M1.data;
break;

case "M2" :
targetQuestions=quizCollection.M2.data;
break;

case "M3" :
targetQuestions=quizCollection.M3.data;
break;


case "SM" :
targetQuestions=quizCollection.SM.data;
break;

}
setQuestions()
}

public function set quizTotal(value:int)
{
quizNum=value;
}
public function setAnswer(value1:int,value2:String)
{
quiz[value1].answer=value2;
}

}
}
-----------------------------------------------------------
「QuizCollection.as」

package script.model
{
import flash.events.EventDispatcher
import flash.events.Event;
import script.model.CSVLoader;
import flash.net.URLRequest;

public class QuizCollection extends EventDispatcher
{

//呼び出されたランクの問題集を作成するクラス
//public var data:Array
public var M1:Object;
public var M2:Object;
public var M3:Object;
public var FS:Object;
public var SM:Object;
public var COMMON:Object;

public function QuizCollection(...args)
{
for(var i=0;i<args.length;i++)
{
switch(args[i])
{
case "FS" :
FS=new CSVLoader()
FS.load(new URLRequest("FS.csv"))
FS.addEventListener(Event.COMPLETE,csvLoaded)
break;

case "M1" :
M1=new CSVLoader()
M1.load(new URLRequest("M1.csv"))
M1.addEventListener(Event.COMPLETE,csvLoaded)
break;

case "M2" :
M2=new CSVLoader()
M2.load(new URLRequest("M2.csv"))
M2.addEventListener(Event.COMPLETE,csvLoaded)
break;

case "M3" :
M3=new CSVLoader()
M3.load(new URLRequest("M3.csv"))
M3.addEventListener(Event.COMPLETE, csvLoaded)
//trace("M3")
break;

default:
break;
}
}
COMMON=new CSVLoader()
COMMON.load(new URLRequest("共通.csv"))
COMMON.addEventListener(Event.COMPLETE,csvLoaded)

SM=new CSVLoader()
SM.load(new URLRequest("SM.csv"))
SM.addEventListener(Event.COMPLETE,csvLoaded)
}
//**.csvをロードして**にhashTableを保存

private function csvLoaded(event:Event)
{
var _data:Array=new Array()
var _temp:Object=new Object()
for(var i=0;i<event.target.data.length;i++)
{
var correct:Object;

if(event.target.data[i][4]=="1")
{
correct=1;
}
if(event.target.data[i][6]=="1")
{
correct=2;
}
if(event.target.data[i][8]=="1")
{
correct=3;
}
if(event.target.data[i][10]=="1")
{
correct=4;
}
_temp=
{
id:event.target.data[i][0],
question:event.target.data[i][1],
explanation:event.target.data[i][2],
choice1:event.target.data[i][3],
choice2:event.target.data[i][5],
choice3:event.target.data[i][7],
choice4:event.target.data[i][9],
correct:correct
}

_data.push(_temp.valueOf())
}
event.target.data=_data;
}
}
}

ひろゆき
Åê¹ÆNo.45603
投稿日時: 2010-8-30 12:45
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: クイズcsvの読み込みをカテゴリ別に変えたい
これだけ長いスクリプトであれば、もう少し整形された方がよろしいかと。
また、不要な部分は削除してもよろしいのでは?

[code][/code]で囲めば、次のように表示できます。

QuizManager.as
package script.model 
{
	import flash.events.EventDispatcher
	import flash.events.Event;
	import script.model.QuizCollection;

	//quizCollectionから問題を出題するランクを決めるクラス
	//共通問題出題数を決めるクラス
	public class QuizManager extends EventDispatcher
	{
		//出題問題
		public var quiz:Array;
		//問題集
		public var quizCollection:QuizCollection;
		private var targetQuestions;
		//問題数
		private var quizNum:int;
		//共通問題数 
		private var commonNum:int = 5;

		public function QuizManager()
		{
			quiz = new Array();
			quizCollection = new QuizCollection;
		}

		private function setQuestions()
		{
			for (var i = 20; i < targetQuestions.length; i++)
			{
				quiz.push(targetQuestions[i]);
			}
			shuffle(quiz);
			var _common:Array = new Array();
			if (setQuestions == quizCollection.SM) 
			{
				for (i = 0; i < quizCollection.COMMON.data.length; i++)
				{
					_common.push(quizCollection.COMMON.data[i]);
				}
				shuffle(_common);
				for (i = 0; i < commonNum; i++)
				{
					quiz.unshift(_common[i]);
				}
			}
			else 
			{
				for (i = 0; i < quizCollection.COMMON.data.length; i++)
				{
					_common.push(quizCollection.COMMON.data[i]);
				}
				shuffle(_common);
				for (i = 0; i < commonNum; i++)
				{
					quiz.unshift(_common[i]);
				}
			}
			quiz = quiz.slice(0,quizNum);
			for (var j = 0; j < quizNum; j++)
			{
				quiz[j].order = j+1;
				quiz[j].answer = new Object();
			}
		}
		private function shuffle(value:*)
		{
			for (var i = 0; i < value.length; i++)
			{
				var j:int = int(Math.random()*(i+1));
				var temp:Object = value[j];
				value[j] = value[i];
				value[i] = temp;
			}
			return value;
		}
		public function setSkill(value)
		{
			switch(value)
			{
				case "FS" :
					targetQuestions = quizCollection.FS.data;
					break;
				case "M1" :
					targetQuestions = quizCollection.M1.data;
					break;
				case "M2" :
					targetQuestions = quizCollection.M2.data;
					break;
				case "M3" :
					targetQuestions = quizCollection.M3.data;
					break;
				case "SM" :
					targetQuestions = quizCollection.SM.data;
					break;
			}
			setQuestions();
		}
		public function set quizTotal(value:int)
		{
			quizNum = value;
		}
		public function setAnswer(value1:int,value2:String)
		{
			quiz[value1].answer = value2;
		}

	}

}

QuizCollection.as
package script.model
{
	import flash.events.EventDispatcher
	import flash.events.Event;
	import script.model.CSVLoader;
	import flash.net.URLRequest;

	//呼び出されたランクの問題集を作成するクラス
	public class QuizCollection extends EventDispatcher
	{
		//public var data:Array;
		public var M1:Object;
		public var M2:Object;
		public var M3:Object;
		public var FS:Object;
		public var SM:Object;
		public var COMMON:Object;

		public function QuizCollection(...args)
		{
			for (var i = 0; i < args.length; i++)
			{
				switch(args[i])
				{
					case "FS" :
						FS = new CSVLoader();
						FS.load(new URLRequest("FS.csv"));
						FS.addEventListener(Event.COMPLETE,csvLoaded);
						break;
					case "M1" :
						M1 = new CSVLoader();
						M1.load(new URLRequest("M1.csv"));
						M1.addEventListener(Event.COMPLETE,csvLoaded);
						break;
					case "M2" :
						M2 = new CSVLoader();
						M2.load(new URLRequest("M2.csv"));
						M2.addEventListener(Event.COMPLETE,csvLoaded);
						break;
					case "M3" :
						M3 = new CSVLoader();
						M3.load(new URLRequest("M3.csv"));
						M3.addEventListener(Event.COMPLETE, csvLoaded);
						break;
					default:
						break;
				}
			}
			COMMON = new CSVLoader();
			COMMON.load(new URLRequest("共通.csv"));
			COMMON.addEventListener(Event.COMPLETE,csvLoaded);
			SM = new CSVLoader();
			SM.load(new URLRequest("SM.csv"));
			SM.addEventListener(Event.COMPLETE,csvLoaded);
		}
		//**.csvをロードして**にhashTableを保存
		private function csvLoaded(event:Event)
		{
			var _data:Array = new Array();
			var _temp:Object = new Object();
			for (var i = 0; i < event.target.data.length; i++)
			{
				var correct:Object;
				if (event.target.data[i][4] == "1")
				{
					correct = 1;
				}
				if (event.target.data[i][6] == "1")
				{
					correct = 2;
				}
				if (event.target.data[i][8] == "1")
				{
					correct = 3;
				}
				if (event.target.data[i][10] == "1")
				{
					correct = 4;
				}
				_temp = 
				{	
					id:event.target.data[i][0],
					question:event.target.data[i][1],
					explanation:event.target.data[i][2],
					choice1:event.target.data[i][3],
					choice2:event.target.data[i][5],
					choice3:event.target.data[i][7],
					choice4:event.target.data[i][9],
					correct:correct
				}
				_data.push(_temp.valueOf());
			}
			event.target.data = _data;
		}

	}

}

この状態で、何が問題で、どう改善なさりたいのでしょう?


----------------
質問する際は、回答者に具体的な情報を与えてください。

werdan
Åê¹ÆNo.45604
投稿日時: 2010-8-30 13:58
新米
居住地:
投稿: 4
使用環境:
WinXP
flash cs3
使用言語AS3
Re: クイズcsvの読み込みをカテゴリ別に変えたい
ひろゆきさん
ご返信ありがとうございます

問題点は
QuizManager.asの中のif文で設定しているはずの
「SMのときはcommon.csvからは問題を取ってこない。SM.csvからのみ20問取ってくる」

がうまく設定出来てない事です。

なのでそこをごっそり削って
switchの中でそれぞれのCSV読み込み設定を行いたい所存です。

宜しくお願い致します。
werdan
Åê¹ÆNo.45626
投稿日時: 2010-9-3 11:34
新米
居住地:
投稿: 4
使用環境:
WinXP
flash cs3
使用言語AS3
Re: クイズcsvの読み込みをカテゴリ別に変えたい
ひろゆき様

再度ご説明させてください。

今回、既存のスクリプトの仕様を変更することになりました。
まず、問題集が"FS"、"M1"、"M2"、"M3"、"COMMON"のように5種類あります。
それぞれ.csvから読み込む形となっております。
ユーザ側で選べる問題の種類は"FS"、"M1"、"M2"、"M3"の4種類で、
選ばれた問題集から20問出題するようになっており、
そのうちの5問は"COMMON"の問題集から共通して必ず5問出題するような設定となっております。

この度の変更では"SM"という問題集が追加されることになりました。
そして、"SM"の問題が選ばれた際には"COMMON"からは選出されず、
"SM"からのみ、20問出題される というものです。

QuizCollection.as

package script.model
{
	import flash.events.EventDispatcher
	import flash.events.Event;
	import script.model.CSVLoader;
	import flash.net.URLRequest;

	public class QuizCollection extends EventDispatcher
	{
		//呼び出されたランクの問題集を作成するクラス
		//public var data:Array
		public var M1:Object;
		public var M2:Object;
		public var M3:Object;
		public var FS:Object;
		public var SM:Object;
		public var COMMON:Object;
		
		public function QuizCollection(...args)
		{
			for(var i=0;i<args.length;i++)
			{
				switch(args[i])
				{
					case "FS"	:
						FS=new CSVLoader()
						FS.load(new URLRequest("FS.csv"))
						FS.addEventListener(Event.COMPLETE, csvLoaded)
						
						COMMON=new CSVLoader()
						COMMON.load(new URLRequest("共通.csv"))
						COMMON.addEventListener(Event.COMPLETE,csvLoaded)
					break;
					
					case "M1"	:
						M1=new CSVLoader()
						M1.load(new URLRequest("M1.csv"))
						M1.addEventListener(Event.COMPLETE, csvLoaded)
						
						COMMON=new CSVLoader()
						COMMON.load(new URLRequest("共通.csv"))
						COMMON.addEventListener(Event.COMPLETE,csvLoaded)
					break;
					
					case "M2"	:
						M2=new CSVLoader()
						M2.load(new URLRequest("M2.csv"))
						M2.addEventListener(Event.COMPLETE, csvLoaded)
						
						COMMON=new CSVLoader()
						COMMON.load(new URLRequest("共通.csv"))
						COMMON.addEventListener(Event.COMPLETE,csvLoaded)						
					break;
					
					case "M3"	:
						M3=new CSVLoader()
						M3.load(new URLRequest("M3.csv"))
						M3.addEventListener(Event.COMPLETE, csvLoaded)
						
						COMMON=new CSVLoader()
						COMMON.load(new URLRequest("共通.csv"))
						COMMON.addEventListener(Event.COMPLETE,csvLoaded)
					break;
					
					case "SM"	:
						SM=new CSVLoader()
						SM.load(new URLRequest("SM.csv"))
						SM.addEventListener(Event.COMPLETE, csvLoaded)
					break;
					
					default:
					break;
				}
			}
		}
		//**.csvをロードして**にhashTableを保存
		private function csvLoaded(event:Event)
		{
			var _data:Array=new Array()
			var _temp:Object=new Object()
			for(var i=0;i<event.target.data.length;i++)
			{
				var correct:Object;
				
				if(event.target.data[i][4]=="1")
				{
					correct=1;
				}
				if(event.target.data[i][6]=="1")
				{
					correct=2;
				}
				if(event.target.data[i][8]=="1")
				{
					correct=3;
				}
				if(event.target.data[i][10]=="1")
				{
					correct=4;
				}
				
				_temp=
						{	
							id:event.target.data[i][0],
							question:event.target.data[i][1],
							explanation:event.target.data[i][2],
							choice1:event.target.data[i][3],
							choice2:event.target.data[i][5],
							choice3:event.target.data[i][7],
							choice4:event.target.data[i][9],
							correct:correct
						}
						
				_data.push(_temp.valueOf())
			}
			event.target.data=_data;
		}
	}
}


QuizManager.as

package script.model 
{
	import flash.events.EventDispatcher
	import flash.events.Event;
	import script.model.QuizCollection;
	
	public class QuizManager extends EventDispatcher
	{
		//quizCollectionから問題を出題するランクを決めるクラス
		//共通問題出題数を決めるクラス
		
		//出題問題
		public var quiz:Array;
		//問題集
		public var quizCollection:QuizCollection;
		
		private var targetQuestions;
		
		//問題数
		private var quizNum:int;
		
		//共通問題数
		private var commonNum:int=5;
		
		public function QuizManager()
		{
			quiz=new Array()
			quizCollection=new QuizCollection;
		}
		private function setQuestions()
		{
			for(var i=0;i<targetQuestions.length;i++)
			{
				quiz.push(targetQuestions[i])
			}

			shuffle(quiz)
			
			var _common:Array=new Array()
			
			for(i=0;i<quizCollection.COMMON.data.length;i++)
			{
				_common.push(quizCollection.COMMON.data[i])
			}
			shuffle(_common)
			
			for(i=0;i<commonNum;i++)
			{
				quiz.unshift(_common[i])
			}
			
			quiz=quiz.slice(0,quizNum)

			for(var j=0;j<quizNum;j++)
			{
				quiz[j].order=j+1;
				quiz[j].answer=new Object()
			}
		}

		private function shuffle(value:*)
		{
			for(var i=0;i<value.length;i++)
			{
				var j:int=int(Math.random()*(i+1))
				var temp:Object=value[j];
				value[j]=value[i];
				value[i]=temp;
			}
			return value;
		}
		
		public function setSkill(value)
		{
			switch(value)
			{
				case	"FS"	:
				targetQuestions=quizCollection.FS.data;
				break;
				
				case	"M1"	:
				targetQuestions=quizCollection.M1.data;
				break;
				
				case	"M2"	:
				targetQuestions=quizCollection.M2.data;
				break;
				
				case	"M3"	:
				targetQuestions=quizCollection.M3.data;
				break;
				
				case	"SM"	:
				targetQuestions=quizCollection.SM.data;
				break;
				
				default:
				break;
			}
			setQuestions()
		}
				
		public function set quizTotal(value:int)
		{
			quizNum=value;
		}
		public function setAnswer(value1:int,value2:String)
		{
			quiz[value1].answer=value2;
		}
	}
}


QuizCollection.as の中のswitch文にて、SM以外の問題が選ばれた場合にのみ
COMMONのcsvを読み込むように書いてみました。

でも、やはり"SM"の場合でもCOMMONは読み込まれてしまいます。

どこが問題なのでしょうか?

また、別の方法を考えているときに、QuizManager.asの中の

var _common:Array=new Array()
			
for(i=0;i<quizCollection.COMMON.data.length;i++)
	{
		_common.push(quizCollection.COMMON.data[i])
	}
	shuffle(_common)
	
	for(i=0;i<commonNum;i++)
	{
		quiz.unshift(_common[i])
	}

この部分をifで出し分けられたら と思い、試行錯誤しておりましたが、
そもそも"SM"という値が入る変数を見つけられないでいるので、
そちらもうまくいきませんでした。

プログラム自体が初心者のため、大変初歩的な質問かとは思いますが
何卒ご教授いただけませんでしょうか。

宜しくお願いします。
野中文雄
Åê¹ÆNo.45629
投稿日時: 2010-9-3 12:34
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: クイズcsvの読み込みをカテゴリ別に変えたい
ひろゆきさんご指名なのかもしれませんが……。本当に回答が得たいのでしたら、問題を単純化すべきです。個人的には、冗長なスクリプトを解析してお答えする時間も意欲も残念ながらありません。→【 問題を切分けない
引用:
werdanさんは書きました:
ひろゆき様

再度ご説明させてください。

今回、既存のスクリプトの仕様を変更することになりました。


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

ひろゆき
Åê¹ÆNo.45630
投稿日時: 2010-9-3 12:54
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: クイズcsvの読み込みをカテゴリ別に変えたい
指名されても、忙しいので無理!

もっと早い段階で、情報を整理するなり、第三者が検証しやすいようにflaファイル等々用意するなりしていれば、
対応できたかもしれませんが、残念ながら、多忙モードに突入したため、
まどろっこしいことに構ってられません。
# CSVLoader.asについては全く説明がありませんし、
# csvは回答者が用意せねばならないのでしょうか?

空いた時間に見て差し上げても、構いませんが、
それなりのファイルをご用意していただく必要があるでしょう。


----------------
質問する際は、回答者に具体的な情報を与えてください。

werdan
Åê¹ÆNo.45631
投稿日時: 2010-9-3 12:57
新米
居住地:
投稿: 4
使用環境:
WinXP
flash cs3
使用言語AS3
Re: クイズcsvの読み込みをカテゴリ別に変えたい
野中文雄様 ひろゆき様

ご返信いただき、ありがとうございます。
よくわかりました。
大変失礼な形で質問を投げかけたと痛感しております。
失礼致しました。

問題を単純化し、疑問部分のみを載せ質問させていただきます。

また宜しくお願い致します。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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