|
 |
|
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
暇人さん
これです!!思うように動作しました
問題になるファイルと答えの位置がリンク、分類がわかりませんでした
自分の言葉足らずな説明にも回答して下さった皆様天才すぎです!!
ありがとうございました
|
|