以前私が掲示板でボソっと言っていたので作成しました。
いやクイズに関する質問が何度か来たので需要があるのかな、と…(^^;

私がクイズ用に作成したモジュールを掲示板に書き込んだのでソレを使いたいと思います。
その作成した命令のパラメータから説明しましょうか…(^^;
形としましては「quiz p1,p2,p3,p4」です。
p1にクイズに関する問題・解答セットの入った文字列型変数を指定します。
p2は出題する問題の解答群を入れておく文字列型配列変数を指定します。
p3はp1で指定したデータ内にある問題の何問目を使用するか数値で指定します。
p4は…今はまだ使用しません。後で説明しますので何も入れないでください(^^;
返り値statには解答内の正解番号が入ります。
返り値refstrには出題する問題を格納します。
#module "quiz"
#deffunc quiz val,val,int,int mref set,24 mref answers,57 mref alternative,2 mref edit,3 mref correct,64 mref result,65 sdim tmp,128 getstr result,set,0,',' if edit { strmid answer,set,strsize,128 repeat alternative ans.cnt=cnt loop } else { repeat wait 1 instr ichi,result,"。",0 if ichi<0 : break strmid tmp,result,ichi+2,128 strmid result,result,0,ichi result+="\n"+tmp loop strmid answer,set,strsize,128 dim chk,alternative dim ans,alternative repeat alternative chk.cnt=-1 ; チェック変数初期化 loop repeat alternative rnd tmp,alternative if chk.tmp=1 : continue cnt chk.tmp=1 ans.cnt=tmp ; 解答をバラバラにするための準備 loop } ichi=0 repeat alternative getstr tmpstr,answer,ichi,',' ichi+=strsize tmpnum=ans.cnt answers.tmpnum=tmpstr ; 順番に取り出した解答をバラバラにしたところに入れていく loop correct=ans ; 正解の番号 return
#global
それでは早速このモジュールを利用してクイズを作成していきます。
問題・解答の入れておく形としましては「問題,解答1(正解となる解答),解答2,解答3,…」です。
毎回このモジュールを書くのが面倒ですのでモジュールを別のファイルにしてインクルードしたいと思います。
モジュールだけを「quiz.as」という名で保存しておいてください(^^;
#include "quiz.as"
randomize
num=0 ; 現在何問目か
alternative=4 ; 何択か
sdim data,1024
sdim question,256
sdim answers,20,alternative
data = {"
2進数というのは0と1の2種類だけで表されます。さて「1101 1001」は10進数でいくつを表すでしょう?,217,18,155,20
CADの図形入力等に使用されるポインティングデバイスに分類される入力装置はどれでしょう?,タブレット,OCR,ライトペン,OMR
800*600ドットのディスプレイで1ドットにつき24ビットで表されています。画面をそのまま記憶するには約何Mバイト必要でしょう?,1.5,1.2,0.7,2
次に示す装置の中で一番アクセス時間の短いものはどれでしょう?,レジスタ,キャッシュメモリ,光磁気ディスク,主記憶装置
CPUの処理時間を細かく分割し実行可能な状態のタスクに割り当てる形態はどれでしょう?,タイムスライシング,スプーリング,スワッピング,オーバーレイ
直接アクセスできないファイル編成法は次のうちどれでしょう?,順編成,索引編成,直接編成,VSAM
"}
notesel data
notemax max ; 全何問か
dim chk,max ; 問題をランダムにするために必要な変数
dim number,max ; 問題番号をランダムにして入れておく
dim correct ; 何問正解したか
repeat max
rnd r,max
if chk.r=1 : continue cnt
chk.r=1
number.cnt=r
loop
title "クイズゲーム(情報処理編)"
*main
noteget question,number.num
quiz question,answers,alternative ; p4にはまだ何も入れない(入れても0だけ)
ans=stat ; 正解番号
color 255,255,255 : boxf : color
font "MS ゴシック",25,1
tmp=num+1
pos 10,20 : mes "第"+tmp+"問目"
font "MS ゴシック",14
pos 10,60 : mes refstr
font "MS ゴシック",16,1
pos 300,200 : mes "解答番号"
repeat alternative
tmp=cnt+1
pos 10,40*cnt+250 : mes ""+tmp+"."
pos 50,40*cnt+250 : mes answers.cnt
pos 300,40*cnt+250 : button ""+tmp,ok
loop
font "MS ゴシック",150,1
repeat 10
tmp=10-cnt
redraw 0
color 255,255,255 : boxf 400,250 : color 255
pos 450,250 : mes tmp
redraw
wait 100
loop
mistake=1 ; 10秒内に答えられなかったので間違い
*ok
color 255,255,255 : boxf 400,250 : color 255
clrobj
font "MS ゴシック",25,1
pos 320,40*ans+245 : mes "○"
if stat!=ans : pos 320,40*stat+245 : mes "×" : else : if mistake=0 : correct+
num+
mistake=0
wait 100
if max=num : goto *exit
goto *main
*exit
color 255,255,255 : boxf : color
font "MS ゴシック",20,1
pos 50,50 : mes "問題全て終了しました。お疲れ様でした。"
pos 100,200 : mes "あなたの成績"
color ,,255
font "MS ゴシック",40,1
pos 100,300 : mes "正解数"
pos 250,300 : mes correct
stop
はい、コレでクイズが完成しました(^^;
一応問題の順番と解答の順番をランダムにしてみました。
ランダムにするアルゴリズムはTIPS集のもの(文字列編No.11)を利用してします。
オマケ機能として解答に制限時間10秒を設けています。
後は(というか全部ですかね…)基本的なことばかりですので大丈夫ですね。
では、問題をファイルとして実行した時に読み込むようにでもしておきましょうか…。
#include "quiz.as" randomize num=0 alternative=4 sdim question,256 sdim answers,20,alternative exist "quiz.txt" if strsize<0 : dialog "問題ファイルが存在しません" : end sdim data,strsize bload "quiz.txt",data notesel data ; ココから同じ : (省略)
変更するところはたったコレだけです…。非常に簡単ですね。
せっかくですし、問題エディターでも作っておきますかね。
…というか最初からそのつもりでした…。あのモジュールでp4には何も入れないでと書いていた奴です(^^;
モジュールを問題エディターでも使用していますので…。
モジュールの説明をひとつ忘れていました…。
1行が1データで問題文に改行コード「\n」が入れられないため「。」が改行の合図となっています。
実際のゲームの方ではコレで改行させていますがエディターでは必要ないため、
…というかinputボックスでしているため改行コードがあると文字化けしてしまうのです。
ですので「。」を改行コードにするのを防ぐためにモジュールにp4を設けたのです。
ソレともうひとつゲームの方では解答がランダムになってしまいます。
しかしエディター側で解答の編集をする時にバラバラに表示されても仕方ありませんよね、むしろ邪魔です。
解答の1番が正解となる解答にしないといけないわけですから…。
#include "quiz.as"
#define ALTERNATIVE 4 ; 何択か sdim data,32000 sdim question,128 sdim answers,20,ALTERNATIVE sdim registration,150 title "問題作成ツール(^^;" objsize winx/2,25 pos 0,0 : button "読み込み",load pos winx/2,0 : button "保存",save objsize 100,25 pos 530,400 : button "新規登録",new pos 530,440 : button "登録変更",add objsize winx,25 pos 0,25 : listbox index,250,data pos 5,320 : mes "問題文" pos 5,350 : input question,winx-10 repeat ALTERNATIVE tmp=cnt+1 pos cnt*80+5,400 : mes "解答"+tmp pos cnt*80+5,430 : input answers.cnt,70 loop notesel data *main repeat if index!=index.1 : break wait 1 loop index.1=index noteget registration,index quiz registration,answers,ALTERNATIVE,1 objprm 5,refstr repeat ALTERNATIVE objprm 6+cnt,answers.cnt loop goto *main *load dialog "txt",16,"問題データ" if stat=0 : goto *main bload refstr,data objprm 4,data goto *main *save dialog "txt",17,"問題データ" if stat=0 : goto *main strlen len,data bsave refstr,data,len goto *main *new registration=question repeat ALTERNATIVE registration+=","+answers.cnt loop if data="" : noteadd registration,0 : else : noteadd registration,-1 objprm 4,data goto *main *add if index<0 : dialog"選択されていない為,最後に追加登録されます" registration=question repeat ALTERNATIVE registration+=","+answers.cnt loop noteadd registration,index,1 objprm 4,data goto *main
書いてから気づいたのですけど読み込み・保存するファイルは「quiz.txt」でないとダメなので
ロード・セーブボタンはあまりいみがありませんでしたね。
まぁゲーム側がいろんなファイル名に対応させればよいだけなのですけど…。
この章のスクリプトはクイズ本体・モジュール・クイズ作成ツールのセットです。どうぞ。
このクイズの土台を拡張してよいものでも作ってください。
それでは13章はコレで終了します。