HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0403
ノダッシークイズゲームで同じグループの中から選択肢を表示させたい13解決


ノダッシー

リンク

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 "次へ",*出題



Taddi

リンク

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

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



ONION software Copyright 1997-2021(c) All rights reserved.