| 
					 
							
						
								
									  | 
								 
							 							 
							
						 
						
 
 | 
 | 
 
2015/4/3(Fri) 15:55:37|NO.68355 
ファイルからファイル名を読み取り 
同じグループからランダムに選択肢を表示するクイズゲームを作っているのですが
 
データ2Aを選んだ場合同じAのグループの中からランダムで二つを選んで表示するコードを書いているのですが 
どうコードに落とし込めばいいかわからず困っています 
考え方や具体的なソースがありましたらお願いします
 
          ↓2は種別番号 
ファイル名はjpgで鉄012.jpg 
          ↑01〜99 
例) 
データ3Aを選んだ場合 
データ1A 
データ4A 
例2) 
データ5Bを選んだ場合 
データ8B 
データ6B
 
;データ 
データ1A 
データ2A 
データ3A 
データ4A 
データ5B 
データ6B 
データ7B 
データ8B 
データ9C 
データ10C 
・ 
・ 
・
 
上手く説明できず申し訳ないですが、ファイル名の形式を変えた方がいい等ありましたらお願いします
  
	;chgdisp 1, 640, 480
	;bgscr 0, 640, 480, 4, 0, 0
	n = 0 ;問題番号
	picx = 200 : picy = 30 ;画像の位置
	font "MS Pゴシック", 30, 1
	randomize
	dir = "写真\\"	;パスの\を\\に変えるのを忘れずに
	chdir dir
	notesel list
	dirlist list,"*.jpg",1
	filenum = stat ;総ファイル数 dirlistのstatはファイルの総数を返す
	
repeat filenum	//シャッフル
	noteget filename,cnt
	notedel cnt
	noteadd filename,rnd(filenum),0
loop
	
	;種別番号
	dim syubetu,filenum
	sdim filemei,filenum
	
	listcopy = list	;シャッフル後のリスト
	
	
	;ファイル名 + 種別番号を保存していく0〜filenum
	repeat filenum
	noteget filename,n
	;ファイル名を種別番号と同様に配列に保存
	filemei.n = strmid(filename,0,strlen(filename)-7) ;拡張子等を削る
	;ファイル名から種別番号を取り出す
	;基盤は1 アルミ・ゴウキン・鉄は2・プラスチックは3
	temp1=strmid(filename,-1,5)
	temp2=strmid(temp1,0,1)
	syubetu.n = temp2
	
	
	n++
	loop
	
	n = 0 ;nを初期化して出題へ飛ぶ
	randomize
*出題
	
	color 255,255,255
	boxf
	pos 0,0
	color 0,0,0
	;左上の 1/17
	mes ""+n+"/"+filenum+"
	;画像を表示
	noteget filename,n
	celload filename,1
	pos picx,picy
	celput 1
	;選択肢を表示
	pos 100,300
	mes "これは何ですか?"
	mes filemei.n + " 種別番号" + syubetu.n
	if(syubetu.n == 1){
	mes "種別1の選択肢"
	
	}
	
	n++;次の問題へ進める
	pos 500,0
	button "次へ",*出題
	
 
 
 
  |    |   
  
 
 | 
 | 
 
2015/4/3(Fri) 16:04:24|NO.68358 
データはこんな感じになっており 
Aキバン01を選んだら同じ種別コード1のデータからランダムで二つを表示させたいのです 
 
;基盤 
Aキバン01 1 
Aキバン02 1 
Aキバン03 1 
Bキバン01 1 
Bキバン02 1 
Bキバン03 1 
Cキバン01 1 
Cキバン02 1 
Cキバン03 1 
 
;金属類 
ゴウキン01 2 
ゴウキン02 2 
鉄   01 2 
アルミ  01 2 
 
 |   
  
| 
 | 
 
2015/4/3(Fri) 19:56:49|NO.68364 
> データはこんな感じになっており
> Aキバン01を選んだら同じ種別コード1のデータからランダムで二つを表示させたいのです
ファイル名(FileList,FileMax)の順番はシャッフルしないで保存しておく。
  
Aキバン011.jpg
Aキバン021.jpg
Aキバン031.jpg
Bキバン011.jpg
Bキバン021.jpg
Bキバン031.jpg
Cキバン011.jpg
Cキバン021.jpg
Cキバン031.jpg
ゴウキン012.jpg
ゴウキン022.jpg
鉄012.jpg
アルミ012.jpg
 
dirlist命令のままで保存します。 
そして、QuizShuffle 配列には noteget で使う行番号をセットして、 
こちらをシャッフルします。
  
dim QuizShuffle,FileMax
;シャッフル配列の初期化
repeat FileMax
	QuizShuffle(cnt)=cnt
loop
;シャッフルの実行
repeat FileMax
	p=rnd(FileMax)
	n=QuizShuffle(p)
	QuizShuffle(p)=QuizShuffle(cnt):QuizShuffle(cnt)=n
loop
 
ファイル名を取り出すときは次のようにします。
  
;ファイル名
pos 0,0
repeat FileMax
	n=QuizShuffle(cnt)
	noteget FileName,n
	mes FileName
loop
 
続いて、種別番号、種別位置、種別個数を管理する QuizParam 配列を作成します。
  
dim  QuizParam,3,FileMax;パラメータ
sdim FileTitle,0,FileMax;タイトル名
;パラメータ配列にセット
repeat FileMax
	noteget FileName,cnt
	n=strlen(FileName)
	c=peek(FileName,n-5)-'0'
	if(t!=c):t=c:p=cnt:m=1
	FileTitle(cnt)=strmid(FileName,0,n-7)
	QuizParam(QUIZ_TYPE,cnt)=t
	QuizParam(QUIZ_POS,cnt)=p
	QuizParam(QUIZ_MAX,cnt)=m
	m++
loop
 
ここまでの処理で次のようになると思います。
  
QuizParam(No)=種別番号,種別位置,種別個数(パラメータ配列にセット時)
QuizParam( 0)=1,0,1
QuizParam( 1)=1,0,2
QuizParam( 2)=1,0,3
QuizParam( 3)=1,0,4
QuizParam( 4)=1,0,5
QuizParam( 5)=1,0,6
QuizParam( 6)=1,0,7
QuizParam( 7)=1,0,8
QuizParam( 8)=1,0,9
QuizParam( 9)=2,9,1
QuizParam(10)=2,9,2
QuizParam(11)=2,9,3
QuizParam(12)=2,9,4
 
続いて種別個数のセットを行います。
  
;種別個数のセット
t=0
repeat FileMax
	n=(FileMax-cnt-1)
	c=QuizParam(QUIZ_TYPE,n)
	if(t!=c):t=c:m=QuizParam(QUIZ_MAX,n)
	QuizParam(QUIZ_MAX,n)=m
loop
 
この処理で次のようになると思います。
  
QuizParam(No)=種別番号,種別位置,種別個数(種別個数のセット後)
QuizParam( 0)=1,0,9
QuizParam( 1)=1,0,9
QuizParam( 2)=1,0,9
QuizParam( 3)=1,0,9
QuizParam( 4)=1,0,9
QuizParam( 5)=1,0,9
QuizParam( 6)=1,0,9
QuizParam( 7)=1,0,9
QuizParam( 8)=1,0,9
QuizParam( 9)=2,9,4
QuizParam(10)=2,9,4
QuizParam(11)=2,9,4
QuizParam(12)=2,9,4
 
これで「Aキバン031.jpg」を選択すると「QuizParam(2)=1,0,9」のパラメータを見ると 
種別番号=1 
種別位置=0 
種別個数=9 
ですから noteget 命令で 0 から 9個分が同じ種別番号(1)だと分かります。 
あとは 0〜8 の行番号を QuizGroup 配列に読み込みシャッフルします。
  
;シャッフル配列の作成
dim QuizGroup,m
repeat m
	QuizGroup(cnt)=(cnt+p)
loop
;同グループのシャッフル
repeat m
	p=rnd(m)
	n=QuizGroup(p)
	QuizGroup(p)=QuizGroup(cnt):QuizGroup(cnt)=n
loop
;表示
mes "1."+FileTitle(QuizGroup(0))
mes "2."+FileTitle(QuizGroup(1))
 
これで QuizGroup 配列の QuizGroup(0)、QuizGroup(1) の2つを表示すれば良い。 
分かるでしょうか?
  
 
  |    |   
  
| 
 | 
 
2015/4/3(Fri) 19:57:17|NO.68365 
サンプル・ソースです。 
 
//------------------------------------------------------------------------------
// 科学太郎のサンプル for HSP(Ver.3.3.2)
//==============================================================================
// テーマ:クイズゲームで同じグループの中から選択肢を表示させたい
// 掲示板:http://hsp.tv/play/pforum.php?mode=all&num=68355
//------------------------------------------------------------------------------
//--------------------------------------
// 列挙定数
//--------------------------------------
#enum QUIZ_TYPE=0						;種別番号(1,2,…)
#enum QUIZ_POS							;種別位置(配列の添字)
#enum QUIZ_MAX							;種別個数(配列の個数)
//--------------------------------------
// メイン部
//--------------------------------------
*Init
	dim		QuizNo						;クイズ番号(出題する通し番号)
	dim		QuizShuffle,1				;シャッフル(出題するデータの通し番号)
	dim		QuizParam,3,1				;パラメータ(種別番号,種別位置,種別個数)
	sdim	FileTitle,0,1				;タイトル名(Aキバン)
*Load
	/*
	Path="写真\\"
	chdir Path
	notesel FileList
	dirlist FileList,"*.jpg",1
	FileMax=stat
	*/
	sdim FileList
	FileList+="Aキバン011.jpg\n"
	FileList+="Aキバン021.jpg\n"
	FileList+="Aキバン031.jpg\n"
	FileList+="Bキバン011.jpg\n"
	FileList+="Bキバン021.jpg\n"
	FileList+="Bキバン031.jpg\n"
	FileList+="Cキバン011.jpg\n"
	FileList+="Cキバン021.jpg\n"
	FileList+="Cキバン031.jpg\n"
	FileList+="ゴウキン012.jpg\n"
	FileList+="ゴウキン022.jpg\n"
	FileList+="鉄012.jpg\n"
	FileList+="アルミ012.jpg\n"
	notesel FileList
	FileMax=notemax
	MakeQuizParam
*Main
	randomize
	screen 0,640,480,SCREEN_NORMAL|SCREEN_FIXEDSIZE
	title "クイズゲームで同じグループの中から選択肢を表示させたい"
	objsize 120,30,30+7:pos 400,7
	button gosub "最初から始める",*PushStart
	button gosub "次の問題へ進む",*PushNext
	objsize ,,0
	gosub *PushStart
	stop
//--------------------------------------
// [最初から始める]ボタンの処理
//--------------------------------------
*PushStart
	QuizNo=0
//--------------------------------------
// [次の問題へ進む]ボタンの処理
//--------------------------------------
*PushNext
	if(QuizNo>=FileMax){
		dialog "全ての問題を出しました。\n終了しますか?",3,"確認"
		if(stat==6):end
		if(stat==7):goto *PushStart
	}
	redraw 0
	color $FF,$FF,$FF:boxf
	color $00,$00,$00:DispDebug2
	;パラメータの取り出し
	n=QuizShuffle(QuizNo)
	s=FileTitle(n)
	t=QuizParam(QUIZ_TYPE,n)
	p=QuizParam(QUIZ_POS,n)
	m=QuizParam(QUIZ_MAX,n)
	QuizNo++
	;問題文
	font MSGOTHIC,30,1
	pos 100,300
	mes "これは何ですか?"
	mes s+" 種別番号"+t
	;シャッフル配列の作成
	dim QuizGroup,m
	repeat m
		QuizGroup(cnt)=(cnt+p)
	loop
	;同グループのシャッフル
	repeat m
		p=rnd(m)
		n=QuizGroup(p)
		QuizGroup(p)=QuizGroup(cnt):QuizGroup(cnt)=n
	loop
	mes ""
#if(1)
	;同グループから2つ選択(タイトル名)
	mes "1."+FileTitle(QuizGroup(0))
	mes "2."+FileTitle(QuizGroup(1))
#else
	;同グループから2つ選択(ファイル名)
	noteget getLine,QuizGroup(0):mes "1."+getLine
	noteget getLine,QuizGroup(1):mes "2."+getLine
#endif
	redraw 1
	return
//--------------------------------------
// クイズ・パラメータの作成
//--------------------------------------
#deffunc MakeQuizParam
	dim		t							;作業変数(種別番号)
	dim		p							;作業変数(種別位置)
	dim		m							;作業変数(種別個数)
	dim		QuizShuffle,FileMax			;シャッフル(出題するデータの通し番号)
	dim		QuizParam,3,FileMax			;パラメータ(種別番号,種別位置,種別個数)
	sdim	FileTitle,0,FileMax			;タイトル名(Aキバン)
	;パラメータ配列にセット
	repeat FileMax
		noteget getLine,cnt
		n=strlen(getLine)
		c=peek(getLine,n-5)-'0'
		if(t!=c):t=c:p=cnt:m=1
		FileTitle(cnt)=strmid(getLine,0,n-7)
		QuizParam(QUIZ_TYPE,cnt)=t
		QuizParam(QUIZ_POS,cnt)=p
		QuizParam(QUIZ_MAX,cnt)=m
		m++
	loop
	;種別個数のセット
	t=0
	repeat FileMax
		n=(FileMax-cnt-1)
		c=QuizParam(QUIZ_TYPE,n)
		if(t!=c):t=c:m=QuizParam(QUIZ_MAX,n)
		QuizParam(QUIZ_MAX,n)=m
	loop
	;シャッフル配列の初期化
	repeat FileMax
		QuizShuffle(cnt)=cnt
	loop
	;シャッフルの実行
	repeat FileMax
		p=rnd(FileMax)
		n=QuizShuffle(p)
		QuizShuffle(p)=QuizShuffle(cnt):QuizShuffle(cnt)=n
	loop
	return
/*
QuizParam(No)=種別番号,種別位置,種別個数(パラメータ配列にセット時)
QuizParam( 0)=1,0,1
QuizParam( 1)=1,0,2
QuizParam( 2)=1,0,3
QuizParam( 3)=1,0,4
QuizParam( 4)=1,0,5
QuizParam( 5)=1,0,6
QuizParam( 6)=1,0,7
QuizParam( 7)=1,0,8
QuizParam( 8)=1,0,9
QuizParam( 9)=2,9,1
QuizParam(10)=2,9,2
QuizParam(11)=2,9,3
QuizParam(12)=2,9,4
↓    ↓    ↓   ↓
QuizParam(No)=種別番号,種別位置,種別個数(種別個数のセット後)
QuizParam( 0)=1,0,9
QuizParam( 1)=1,0,9
QuizParam( 2)=1,0,9
QuizParam( 3)=1,0,9
QuizParam( 4)=1,0,9
QuizParam( 5)=1,0,9
QuizParam( 6)=1,0,9
QuizParam( 7)=1,0,9
QuizParam( 8)=1,0,9
QuizParam( 9)=2,9,4
QuizParam(10)=2,9,4
QuizParam(11)=2,9,4
QuizParam(12)=2,9,4
*/
//--------------------------------------
// クイズ・パラメータを表示
//--------------------------------------
#deffunc DispDebug1
	font MSGOTHIC,14
	;クイズ・パラメータ
	pos 0,0
	repeat FileMax
		s=FileTitle(cnt)
		t=QuizParam(QUIZ_TYPE,cnt)
		p=QuizParam(QUIZ_POS,cnt)
		m=QuizParam(QUIZ_MAX,cnt)
		mes strf("No.%02d=%d,%d,%d,[%s]",cnt,t,p,m,s)
	loop
	;ファイル名
	pos 200,0
	repeat FileMax
		noteget getLine,cnt
		mes getLine
	loop
	return
//--------------------------------------
// クイズ・パラメータを表示
//--------------------------------------
#deffunc DispDebug2
	font MSGOTHIC,14
	;クイズ・パラメータ
	pos 7,7
	repeat FileMax
		n=QuizShuffle(cnt)
		s=FileTitle(n)
		t=QuizParam(QUIZ_TYPE,n)
		p=QuizParam(QUIZ_POS,n)
		m=QuizParam(QUIZ_MAX,n)
		if(cnt==QuizNo):c='>':else:c=' '
		mes strf("%cNo.%02d=%d,%d,%d,[%s]",c,n,t,p,m,s)
	loop
	;ファイル名
	pos 200,7
	repeat FileMax
		n=QuizShuffle(cnt)
		noteget getLine,n
		mes getLine
	loop
	return
//------------------------------------------------------------------------------
// End of newSample000.hsp
//------------------------------------------------------------------------------
 
 
 
  |    |   
  
| 
 | 
 
2015/4/4(Sat) 20:50:05|NO.68379 
ファイルリストをシャッフルしてから答えを分類すれば 
リストの順番と分類された答えの順番は一致するので処理が簡単になる 
種別ごとの答え位置が必要なだけでやってる事は
 http://hsp.tv/play/pforum.php?mode=all&num=67648#67691
と同じ
  
	;chgdisp 1, 640, 480
	;bgscr 0, 640, 480, 4, 0, 0
	n = 0 ;問題番号
	picx = 200 : picy = 30 ;画像の位置
	font "MS Pゴシック", 30, 1
	randomize
/* 	
	dir = "写真\\"	;パスの\を\\に変えるのを忘れずに
	chdir dir
	notesel list
	dirlist list,"*.jpg",1
	filenum = stat ;総ファイル数 dirlistのstatはファイルの総数を返す
*/
 
notesel list
list={"
Aキバン011.jpg
Aキバン021.jpg
Aキバン031.jpg
Bキバン011.jpg
Bキバン021.jpg
Bキバン031.jpg
Cキバン011.jpg
Cキバン021.jpg
Cキバン031.jpg
ゴウキン012.jpg
ゴウキン022.jpg
鉄012.jpg
アルミ012.jpg
"}
filenum=notemax
	repeat filenum	//シャッフル
		noteget filename,cnt
		notedel cnt
		noteadd filename,rnd(filenum),0
	loop
	sdim ansType_list,64,1	//分類した答え用
	sdim fileType_list,1		//タイプID用
	repeat filenum	//分類
		noteget filename,cnt
		fType=int(strmid(filename,strlen(filename)-5,1))	//タイプID取り出し
		fileType_list(cnt)=fType		//タイプID
		ansType_list(fType)+strmid(filename,0,strlen(filename)-5)+"\n"	//分類した答え
	loop
	dim typans_index,length(ansType_list)	//種別ごとの正解位置を初期化
	n = 0 ;nを初期化して出題へ飛ぶ
*出題
	if n = filenum {dialog "問題終了":end}
	color 255,255,255
	boxf
	pos 0,0
	color 0,0,0
	;左上の 1/17
	mes ""+(n+1)+"/"+filenum+"
	;画像を表示
	notesel list	//note系を使うので
 	noteget filename,n
mes "テスト用にファイル名表示"
mes filename
/*
	celload filename,1
	pos picx,picy
	celput 1
*/
	fType=fileType_list(n)	//タイプID取り出し
	list_tmp=ansType_list(fType)	//種別された答えをコピー
	ans_index=typans_index(fType)	//種別の正解位置を取り出し
	notesel list_tmp	//note系を使うので
	repeat 3
		noteget answer(cnt),ans_index	//解答候補取り出し(answer(0)が正解)
		notedel ans_index		//取り出したのは削除
		ans_index=rnd(notemax)	//解答候補位置
	loop
	;選択肢を表示
	pos 100,300
	mes "これは何ですか?"
	mes answer + " 種別番号" + fType
	mes "種別"+(fType)+"の選択肢"
	
	location = rnd(3)+1 ;問題の位置をランダムに変える
	repeat 3
		dis_no=((cnt+location-1)\3)+1
		pos 30,300+60+dis_no*30
		color 255*(cnt=0),0,0	//テスト用に正解を赤で表示
		mes str(dis_no)+" , "+answer(cnt)
	loop
	
	typans_index(fType)++	//今回の種別の正解位置を進ませる
	n++;次の問題へ進める
	pos 500,0
	button "次へ",*出題
 
 
 
  |    |   
  
| 
 | 
 
2015/4/5(Sun) 02:46:18|NO.68387 
すでに十分なアイデアは出ていますが、 
別のアプローチの仕方を一つ示しておきます。 
写真フォルダの中に種別番号ごとのフォルダを作成してやれば、 
画像に種別番号を付ける必要がなくなります。 
方法は一つではありませんので、問題作成をすることも踏まえて、 
より良い方法をご検討ください。
  
randomize
	chdir "写真"					;写真フォルダに移動
	sdim list_dir,64 : dirlist list_dir,"*.*" : list_num=stat	;フォルダ一覧作成
	sdim list_file,64,list_num : dim file_num,list_num	;種別ごとの一覧作成とファイル数確認
	total_num=0					;合計ファイル数確認(問題作成に使用)
	repeat list_num
		stmp="" : notesel list_dir : noteget stmp,cnt
		chdir stmp				;種別ごとのフォルダに移動
		dirlist list_file(cnt),"*.*" : file_num(cnt)=stat	;一覧作成
		total_num+=file_num(cnt) : chdir ".."	;合計加算&上のフォルダに戻る
	loop
	
	dim q_id,total_num
	repeat 2
		c=cnt
		repeat total_num	;出題番号を0から順に代入、シャッフル
			if c=0{ q_id(cnt)=cnt }else{ r=rnd(cnt+1) : q_id(cnt)=q_id(r) : q_id(r)=cnt }
		loop
	loop
	now_cnt=0	;現在の出題数
*setup
	itmp=0 : q_code=0			;q_id(now_cnt)が問題の解答、q_codeは問題の種別番号
	repeat list_num
		itmp+=file_num(cnt) : if itmp>q_id(now_cnt){q_code=cnt : break}
	loop			;写真フォルダの一覧から該当種別番号のフォルダに移動
	stmp="" : notesel list_dir : noteget stmp,q_code : chdir stmp : code_name=stmp
	dim a_id,file_num(q_code)
	repeat 2
		c=cnt
		repeat file_num(q_code);取出番号を0から順に代入、シャッフル
			if c=0{ a_id(cnt)=cnt }else{ r=rnd(cnt+1) : a_id(cnt)=a_id(r) : a_id(r)=cnt }
		loop
	loop
	itmp=0			;chk_flg フォルダ内の問題位置確認
	repeat q_code : itmp+=file_num(cnt) : loop : chk_flg=q_id(now_cnt)-itmp
					;start_flg に最初の出題位置を代入
	repeat file_num(q_code) : if a_id(cnt)=chk_flg{start_flg=cnt} : loop
	cls
	repeat 3
		stmp="" : notesel list_file(q_code)
		noteget stmp,a_id((start_flg+cnt)\file_num(q_code))	;出題位置が最後に来たら初めに戻る
		celload stmp,1+cnt : pos cnt*200,300 : celput 1+cnt : if cnt=0{q_name=stmp}
	loop
	chdir ".."
	pos 0,0 : mes "問題No."+q_id(now_cnt) + "   出題ファイル名"+q_name
	mes "種別コードNo."+q_code+ "   種別コード名"+code_name
*main
	key=0 : stick key
	if key!0{		;今回は解答固定のため何か触れると次の問題へ移動、最後の問題で終了
		now_cnt+ : if now_cnt=total_num{dialog "終了" : end}else{goto *setup}
	}
	wait 1 : goto *main
 
 
 
  |    |   
  
| 
 | 
 
2015/4/5(Sun) 14:29:52|NO.68389 
こういう場合、データの管理方法から見直したほうがいいかと。 
私ならデータファイルは1つにしますね(自前のスクリプトかバイナリ)。 
そして、データは番号で管理して、それをランダムに選ぶだけ。 
1行1問のようなデータにしておけば、 
メモリノートパッドのインデックスをランダムに選択するような事もしやすい。 
 
必要な処理に都合のいいデータ管理方法を考えれば 
非常にシンプルにいけるはずですが。。 
 
 |   
  
| 
 | 
 
2015/4/5(Sun) 15:03:54|NO.68392 
例えばこんな感じに 
 
0,これはクイズの問題だよ!・・・・・・・(以下続く 
1,これは2つめのデータ。 
 
というファイル内容にして、プログラムの最初に番号(先頭の,まで)に 
対応した配列変数(例えば m(xx))に,以降のテキストを入れておいて、 
あとはその配列を m(rnd(xx)) のようにして選択するだけ。 
グループ分けは、先頭の番号を決めておけば管理しやすい。0〜は基盤 10〜は金属類 など。 
 
この程度の処理なら、配列に入れなくても必要なときに取り出すだけで良さそうですけどね。 
私なら答えの判定まで問題文が入ったテキストに書いて処理します。 
(Windowsならiniを利用する手もアリ) 
 
 |   
  
| 
 | 
 
2015/4/5(Sun) 16:41:46|NO.68397 
サンプル作ってみた。(1回書き込んだけどバグがあったから削除して再投稿…) 
まず、以下のような内容のテキストファイルを mondai.txt という名前で 
カレントに作ってください。
  
# これはコメントです
# /n  改行
# /s  ストップ(入力待ち)
# /e  メッセージの終わり
[mondai]
kiban0=基盤の問題A。/n答えは3だよ。/e
kiban0a=3
kiban1=基盤の問題B。/n答えは1だよ。/e
kiban1a=1
kiban2=基盤の問題C。/n正しい表記はどっち。/n1.ゲーム基盤/n2.ゲーム基板/e
kiban2a=2
kinzoku0=金属の問題A。/n答えは2だよ。/e
kinzoku0a=2
kinzoku1=金属の問題B。/n答えは3だよ。/e
kinzoku1a=3
kinzoku2=金属の問題C。/n答えは1だよ。/e
kinzoku2a=1
 
以下がHSPのサンプルコード(コピペして実行してね)。
  
#uselib "kernel32.dll"
#cfunc global GetPrivateProfileString "GetPrivateProfileStringA" sptr, sptr, sptr, sptr, sptr, sptr
#module mod_ini
// ファイル名をセット
#deffunc setinifile str tmp
	inifile=tmp
	return
// 読み出し
#defcfunc getini str sec, str key
	sdim i,$1000: ret=GetPrivateProfileString(sec, key, "", varptr(i), $1000, inifile)
	return i
#global
// 問題の書かれたファイルを指定
setinifile dir_cur+"\\mondai.txt"
// これが問題の流れ
a(0)="kiban"
a(1)="kiban"
a(2)="kinzoku"
a(3)="kinzoku"
a(4)="end"
mi=0
randomize	// 乱数初期化
*st
if a(mi)="end" { goto *exit }		// おわり
i=rnd(3)							// ランダムに選択する範囲
m=getini("mondai",a(mi)+i)			// 問題文を読み込む
n=getini("mondai",a(mi)+i+"a")		// 正解の番号を読み込む
mi++
bx=2: by=2			// 表示基準となる位置(文字数ぶん)
x1=bx: y1=by: i=0	// 初期値
cls 4: font "MS ゴシック",28,16: color 255,255,255
repeat
	tmp=strmid(m,i,2)						// 2バイト読み出し
	if tmp="/e" { break }					// 終わりなのでループから抜ける
	if tmp="/n" { tmp="": x1=bx: y1++ }		// 改行
	if tmp="/s" {							// SPACEが押されるまで待ち(今回は未使用)
		tmp="": repeat: getkey k,32: if k { break }: await 16: loop
	}
	if tmp!"" { pos x1*28,y1*32: mes tmp: x1++ } // テキスト表示(1文字ずつ)
	i=i+2                                        // 2バイト文字なので+2
	await 25
loop
color 0,255,255: pos bx*28,352: mes "答えの番号キーを押してください。"
onkey goto *hantei :onkey 1
repeat: await 16: loop	// onkeyによるキー入力待ち
*hantei
onkey 0
k=iparam-48: if k=n { mes "あたり!!" } else { mes "ハズレ。" }
wait 100
goto *st
*exit
mes "おしまい。"
stop
 
このサンプルでは同じ問題が出てしまうことがありますが 
そのへんは改良してみてね♪
  
 
  |    |   
  
| 
 | 
 
2015/4/8(Wed) 15:02:25|NO.68445 
頂いたソースコードを一つ一つ試して1日考えたのですがわからなかったので質問させて下さい 
科学太郎さんのサンプルですが、起動すると毎回出題が固定されていたのでシャッフルさせようと思い、次のコードを足してみましたが、上手くシャッフルできませんでした
  
//--------------------------------------
// メイン部
//--------------------------------------
*Init
	dim		QuizNo						;クイズ番号(出題する通し番号)
	dim		QuizShuffle,1				;シャッフル(出題するデータの通し番号)
	dim		QuizParam,3,1				;パラメータ(種別番号,種別位置,種別個数)
	sdim	FileTitle,0,1				;タイトル名(Aキバン)
*Load
	Path="写真\\"
	chdir Path
	notesel FileList
	dirlist FileList,"*.jpg",1
	FileMax=stat
	FileMax=notemax
	MakeQuizParam
	repeat filenum	//シャッフル
		noteget FileList,cnt
		notedel cnt
		noteadd FileList,rnd(FileMax),0
	loop
*Main
 
もうひとつ
 >No.03=1,0,5,[bキバン]が選択されると
残りの回答候補が2つ 
1.bキバン 
2.bキバンと3つとも同じ正解の回答が表示されてしまい、これだとクイズにならないので 
重複しないように自分なりに修正してみましたが反映されず・・・ 
どこを修正すればいいか分かりませんでした
 
暇人さんのサンプルスクリプトですが 
こちらも同じカテゴリから回答候補が表示されるのですが 
重複してしまい
 
例 
1,ゴウキン02 ← 
2,ゴウキン01 ← 
3,鉄01
 
重複させないよう次のようにしました…が、上手くいかず
 
元のソース
  
	repeat 3
		dis_no=((cnt+location-1)\3)+1
		pos 30,300+60+dis_no*30
		color 255*(cnt=0),0,0	//テスト用に正解を赤で表示
		mes str(dis_no)+" , "+answer(cnt)
	loop
 
自分で書いて重複しないよう書き直したソース
  
		dis_no=((0+location-1)\3)+1
		pos 30,300+60+dis_no*30
		color 255*(0=0),0,0	//テスト用に正解を赤で表示
		mes str(dis_no)+" , "+answer(0)
*furinaosi1
		dis_no=((1+location-1)\3)+1
		pos 30,300+60+dis_no*30
		if( strmid(answer(1), 0, 5) != strmid(answer(0), 0, 5) ){;answer(0)と同じでない時
		color 255*(1=0),0,0	//テスト用に正解を赤で表示
		mes str(dis_no)+" , "+answer(1)
	}else{;anser(0)と同じ時
		noteget answer(1),ans_index	//解答候補取り出し(answer(0)が正解)
		notedel ans_index		//取り出したのは削除
	goto *furinaosi1
		}
		
*furinaosi2
		dis_no=((2+location-1)\3)+1
		pos 30,300+60+dis_no*30
		;answer(2)がanswer(1)と同じでない時 & answer(2)がanswer(0)と同じでない時
		if( strmid(answer(2), 0, 5) != strmid(answer(1), 0, 5 ) && strmid(answer(2), 0, 5) != strmid(answer(0), 0, 5 ) ){
		color 255*(2=0),0,0	//テスト用に正解を赤で表示
		mes str(dis_no)+" , "+answer(2)
	}else{;answer(2)がanswer(1),answer(0)と一致した時
		noteget answer(2),ans_index	//解答候補取り出し(answer(0)が正解)
		notedel ans_index		//取り出したのは削除
	goto *furinaosi2
	}
 
どこをどう書きかえればいいかご教示お願いします 
1.起動時にシャッフルされる 
2.回答候補がダブらないようにする
 
よろしくお願いします
  
 
  |    |   
  
| 
 | 
 
2015/4/8(Wed) 15:59:27|NO.68447 
> 科学太郎さんのサンプルですが、起動すると毎回出題が固定されていたので…シャッフルできませんでした
固定されますか? 
「*Main」ラベルの直後にrandomize命令を実行してるのでrnd関数は違う値を返すはずですが…。
 > 2.bキバンと3つとも同じ正解の回答が表示されてしまい、これだとクイズにならないので
> 重複しないように自分なりに修正してみましたが反映されず・・・
回答を書くときに、この問題はどうなるのだろうと思いました。
  
Aキバン011.jpg
Aキバン021.jpg
Aキバン031.jpg
Bキバン011.jpg
Bキバン021.jpg
Bキバン031.jpg
Cキバン011.jpg
Cキバン021.jpg
Cキバン031.jpg
ゴウキン012.jpg
ゴウキン022.jpg
鉄012.jpg
アルミ012.jpg
 
このファイル名では情報が足りないので 
「Bキバン011.jpg」 
「Bキバン021.jpg」 
の2つは区別できません。 
内部処理では種別番号「1」は同じで「Bキバン01」と「Bキバン02」は違うデータとして扱ってます。 
これが同じ種類と考えて重複して欲しくないのならば、次のようにファイル名を変える必要がありますよ。
  
Aキバン0111.jpg
Aキバン0211.jpg
Aキバン0311.jpg
Bキバン0121.jpg
Bキバン0221.jpg
Bキバン0321.jpg
Cキバン0131.jpg
Cキバン0231.jpg
Cキバン0331.jpg
ゴウキン0142.jpg
ゴウキン0242.jpg
鉄0152.jpg
アルミ0162.jpg
 
分かるでしょうか? 
「Aキバン」、「Bキバン」、「Cキバン」を区別するための情報を1つ増やすわけです。 
これをもとにソースをすべて見直す必要がありますね。
  
//--------------------------------------
// 列挙定数
//--------------------------------------
#enum QUIZ_TYPE=0						;種別番号(1,2,…)
#enum QUIZ_GROUP						;種別グループ(1,2,…)
#enum QUIZ_POS							;種別位置(配列の添字)
#enum QUIZ_MAX							;種別個数(配列の個数)
 
とか
  
*Init
	dim		QuizNo						;クイズ番号(出題する通し番号)
	dim		QuizShuffle,1				;シャッフル(出題するデータの通し番号)
	dim		QuizParam,4,1				;パラメータ(種別番号,種別グループ,種別位置,種別個数)
	sdim	FileTitle,0,1				;タイトル名(Aキバン)
*Load
 
とか
  
	;パラメータの取り出し
	n=QuizShuffle(QuizNo)
	s=FileTitle(n)
	t=QuizParam(QUIZ_TYPE,n)
	g=QuizParam(QUIZ_GROUP,n)	;追加
	p=QuizParam(QUIZ_POS,n)
	m=QuizParam(QUIZ_MAX,n)
	QuizNo++
 
このほかにも「クイズ・パラメータの作成」命令を全面的に改良すべきですね。 
この命令の考え方は、最終的に「QuizParam」の内容を次のようにすることです。
  
QuizParam(No)=種別番号,種別グループ,種別位置,種別個数(種別個数のセット後)
QuizParam( 0)=1,1,0,3	;Aキバン0111.jpg
QuizParam( 1)=1,1,0,3	;Aキバン0211.jpg
QuizParam( 2)=1,1,0,3	;Aキバン0311.jpg
QuizParam( 3)=1,2,3,3	;Bキバン0121.jpg
QuizParam( 4)=1,2,3,3	;Bキバン0221.jpg
QuizParam( 5)=1,2,3,3	;Bキバン0321.jpg
QuizParam( 6)=1,3,6,3	;Cキバン0131.jpg
QuizParam( 7)=1,3,6,3	;Cキバン0231.jpg
QuizParam( 8)=1,3,6,3	;Cキバン0331.jpg
QuizParam( 9)=2,4,9,2	;ゴウキン0142.jpg
QuizParam(10)=2,4,9,2	;ゴウキン0242.jpg
QuizParam(11)=2,5,11,1	;鉄0152.jpg
QuizParam(12)=2,6,12,1	;アルミ0162.jpg
 
ここまでで疑問があります。 
種別番号「2」の「ゴウキン0142.jpg」と「ゴウキン0242.jpg」は同じグループ扱いで、 
「ゴウキン0242.jpg」と「アルミ0162.jpg」は別グループだけど表示したいのか?
 
ここの部分が良く分かりませんので、最終的に期待してる結果を教えて欲しい。 
どのデータを選択すると、どの2つのデータが表示すれば良いのだ。
 
こちらでは「Bキバン011.jpg」と「Bキバン021.jpg」は違うデータと考えて回答を出してます。 
つまり「Aキバン…」のどれかが選択されると「Bキバン???」と「Cキバン???」しか表示したくないのかね? 
この場合は、ファイル名の情報で種別グループなどを追加する必要があります。 
そうしないと「Aキバン???」と「Bキバン???」は区別できないし、 
「Bキバン01」と「Bキバン02」も重複させない処理は実現できないと思います。
 
もう一度、最終的に期待してる結果を教えて下さいな。 
なるべく具体的なデータで教えてくれると回答しやすくなるので 
最初の質問にある「データ1A」とか「データ2A」では分かりません。
  
 
  |    |   
  
| 
 | 
 
2015/4/8(Wed) 20:21:06|NO.68453 
同じ物の画像が数種類(違う角度からのとか)あって 
問題にはそれを使うが、答えは物の名前だから一つって事かな?
 
問題になるファイルと答えの位置がリンクできればやる事は同じ
 
分類する時に不要な答えを取り除いて 
答えの位置を配列のファイル位置に応じた場所に登録
  
	;chgdisp 1, 640, 480
	;bgscr 0, 640, 480, 4, 0, 0
	n = 0 ;問題番号
	picx = 200 : picy = 30 ;画像の位置
	font "MS Pゴシック", 30, 1
	randomize
/* 	
	dir = "写真\\"	;パスの\を\\に変えるのを忘れずに
	chdir dir
	notesel list
	dirlist list,"*.jpg",1
	filenum = stat ;総ファイル数 dirlistのstatはファイルの総数を返す
*/
 
notesel list
list={"
Aキバン011.jpg
Aキバン021.jpg
Aキバン031.jpg
Bキバン011.jpg
Bキバン021.jpg
Bキバン031.jpg
Cキバン011.jpg
Cキバン021.jpg
Cキバン031.jpg
ゴウキン012.jpg
ゴウキン022.jpg
鉄012.jpg
アルミ012.jpg
"}
filenum=notemax
	repeat filenum	//シャッフル
		noteget filename,cnt
		notedel cnt
		noteadd filename,rnd(filenum),0
	loop
	sdim ansType_list,64,1	//分類した答え用
	dim fileType_list,filenum		//タイプID用
	dim ansindex_list,filenum		//正解位置用
	repeat filenum	//分類
		noteget filename,cnt
		fType=int(strmid(filename,strlen(filename)-5,1))	//タイプID取り出し
		fileType_list(cnt)=fType		//タイプID
		ans_str=strmid(filename,0,strlen(filename)-7)
		split ansType_list(fType),"\n",ans_list	//種類に応じた答えを配列に分割して数も得る
		ans_max=stat-1	//"absd\n"を"\n"で分割すると2になるので一つ減らす
		ans_index=0
		repeat ans_max
			if ans_list(cnt) = ans_str {//既に同じ答えが登録されてる
				ans_index=cnt	//登録されてる位置
				break
			}
			ans_index++	//登録されていなければ増加
		loop
		if ans_index=ans_max {//種類に応じた答えの数と位置が同じなら未登録
			ansType_list(fType)+ans_str+"\n"	//種類別に答えを登録
		}
		ansindex_list(cnt)=ans_index	//ファイル位置に応じた答えの位置を登録
	loop
	split list,"\n",filename_list	//ファイル名を配列変数に分割(メイン中にnoteselの切替が必要なくなるので)
	notesel list_tmp	//note系を使うので
	n = 0 ;nを初期化して出題へ飛ぶ
*出題
	if n = filenum {dialog "問題終了":end}
	color 255,255,255
	boxf
	pos 0,0
	color 0,0,0
	;左上の 1/17
	mes ""+(n+1)+"/"+filenum+"
	;画像を表示
mes "テスト用にファイル名表示"
mes filename_list(n)
/*
	celload filename_list(n),1
	pos picx,picy
	celput 1
*/
	fType=fileType_list(n)	//タイプID取り出し
	list_tmp=ansType_list(fType)	//種別された答えをコピー
	
	ans_index=ansindex_list(n)	//種別の正解位置を取り出し
	repeat 3
		noteget answer(cnt),ans_index	//解答候補取り出し(answer(0)が正解)
		notedel ans_index		//取り出したのは削除
		if notemax {ans_index=rnd(notemax)}	//解答候補位置
	loop
	
	;選択肢を表示
	pos 100,300
	mes "これは何ですか?"
	mes answer + " 種別番号" + fType
	mes "種別"+(fType)+"の選択肢"
	location = rnd(3)+1 ;問題の位置をランダムに変える
	repeat 3
		dis_no=((cnt+location-1)\3)+1
		pos 30,300+60+dis_no*30
		color 255*(cnt=0),0,0	//テスト用に正解を赤で表示
		mes str(dis_no)+" , "+answer(cnt)
	loop
	
	n++;次の問題へ進める
	pos 500,0
	button "次へ",*出題
 
 
 
  |    |   
  
| 
 | 
 
2015/4/8(Wed) 20:51:20|NO.68454 
科学太郎さん、お忙しいところレスありがとうございます 
情報が少なすぎて申し訳ありませんでした 
 
例 
Aキバン011.jpg ← Aキバン011.jpgが解答の時は 
Aキバン021.jpg ← Aキバン021.jpgは表示しない 
Bキバン011.jpg ←同じ種別のBキバン011.jpgは表示できる 
Bキバン021.jpg ←既にBキバンが解答候補に挙がっている場合は表示しない 
Cキバン011.jpg ←同じ種別のCキバン011.jpgは表示できる 
Cキバン021.jpg ←既にCキバン011.jpgが解答候補にあがってる場合は表示しない 
 
>つまり「Aキバン…」のどれかが選択されると「Bキバン???」と「Cキバン???」しか表示したくないのかね? 
はい、Aキバンのどれかが選択された場合BキバンとCキバン種別番号1の中で 
重複しないように表示をさせたいです 
 
>種別番号「2」の「ゴウキン0142.jpg」と「ゴウキン0242.jpg」は同じグループ扱いで、 
>「ゴウキン0242.jpg」と「アルミ0162.jpg」は別グループだけど表示したいのか? 
ゴウキンとアルミは金属類なので種別番号が2で、 
 
ゴウキン012が解答の時は 
ゴウキン022は表示させない 
アルミ012は表示させたい 
アルミ022は既にアルミ012が表示されている場合表示させたくない 
鉄012は表示させたい 
鉄022は鉄012が表示されている場合表示させたくない、です 
 
説明が下手ですみませんがもう少しお願いします 
 
 |   
  
| 
 | 
 
2015/4/9(Thu) 10:56:34|NO.68472 
暇人さん 
これです!!思うように動作しました 
問題になるファイルと答えの位置がリンク、分類がわかりませんでした 
自分の言葉足らずな説明にも回答して下さった皆様天才すぎです!! 
ありがとうございました 
 
 |   
  
					 |