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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0303
朝森久弥クイズゲームのシステムについて4解決


朝森久弥

リンク

2007/3/3(Sat) 16:17:26|NO.5983

始めまして。HSPでクイズゲームを製作中の朝森久弥と申します。
早速ですが、質問させて頂きます。
私のクイズゲームでは、数あるクイズの中からランダムに出題する形式を取っているのですが、
それに加えて、「一度正解したクイズを2度と出さないようにする」というルールを設けようと思っています。
それを実現するために、次のようなスクリプトを書きました。


*definition rightq_0=0 rightq_1=0 ;(中略) rightq_99=0 rightquiz=0 *quizselectpart randomize quizselect=rnd(100) if quizselect=0 : goto *q_0 if quizselect=1 : goto *q_1 ;(中略) if quizselect=99 : goto *q_99 *q_0 if rightq_0=1 : goto *quizselectpart nowquiz=0 wait 250 mes "日本で一番高い山は?" wait 100 button goto "富士山",*atari button goto "阿蘇山",*hazure button goto "叔父山",*hazure stop *q_1 if rightq_1=1 : goto *quizselectpart nowquiz=1 wait 250 mes "日本で一番長い川は?" wait 100 button goto "信濃川",*atari button goto "長良川",*hazure button goto "小川",*hazure stop ;(中略) *q_99 ;同上 *atari mes "正解!" wait 200 rightquiz=rightquiz+1 ;正解数カウント if rightquiz=100 : goto definition ;万一全て正解してしまった場合は初期化する if nowquiz=0 : rightq_0=1 if nowquiz=1 : rightq_1=1 ;(中略) if nowquiz=99 : rightq_99=1 goto *quizselectpart *hazure mes "残念、間違い!" wait 200 goto *quizselectpart

しかしこのスクリプトですと、どうしても長くなりすぎてしまいます。
(実際には1000問くらいを出題する予定ですので…)
*quizselectpartは仕方ないと思うのですが、*atariなどはもう少し短くできないかと思っています。
けれども短くするアイデアが思いつかず、色々検索しても分からなかったため、こうして質問させて頂きました。

もしよろしければどなたか、もっと短いスクリプトで同じ事を実現できるアイデアを、提供して頂けないでしょうか。

それでは、よろしくお願い致します。



この記事に返信する


アキス

リンク

2007/3/3(Sat) 18:09:20|NO.5986

どうやらクイズの内容をラベルのとび先にセットしていると言うことですか・・・・
こうゆう時はテキストファイルから読み取ってやる方が後で問題を増やしたりしやすいですよ。
5行や6行を一問にして

例 5行の場合(6行の場合は問題の内容を+1行すればいいと思います)
問題の内容
1の答え
2の答え
3の答え
正解の答え

ランダムに選ばせる場合、
notemax/行数
で問題単位で選び出すことが出来ます。
後は分かるでしょう


一度やった問題を出さないという事について
dim MONDAIFLAG,notemax/行数
問題の分配列の要素を作ってスイッチにします。
問題を選ぶときフラグをチェックして1のものはもうといたということになります。
つまり0の問題が出るまでループでrndを使って求めればいいのです。
問題が選ばれたらその問題のスイッチを1にすればいいはずです。

長文すみません



halapeco

リンク

2007/3/3(Sat) 19:21:46|NO.5987

こんにちは。
私も以前クイズゲームを作ったことがあるのでレスをつけさせていただきました。

クイズ問題はアキスさんがレスされているように、問題を別ファイルで作り読み込みました。

一度やった問題を出さないという点に関しては、重複のない乱数を必要な数だけ配列変数に
代入し呼び出すようにしました。

以前作者不詳で紹介されていたスクリプトですが。

randomize max=5;問題数 repeat max b=rnd(cnt+1) a(cnt)=a(b) a(b)=cnt loop foreach a mes a(cnt) loop

これで配列要素の0から順番に数字を取り出していけば重複なくランダムに問題が呼び出せると
思います。

では、どうぞがんばってください^^



KIMU

リンク

2007/3/4(Sun) 15:45:00|NO.6021

メモリノートパッドの機能を使って正解した問題を取り除く方法を使ってます。

defquiz_answer="" defquiz_answer+"日本で一番高い山は?\n" defquiz_answer+"富士山\n" ;回答 0番 defquiz_answer+"阿蘇山\n" defquiz_answer+"叔父山\n" defquiz_answer+";\n" ;問題の区切り(テキストファイルにした時に編集しやすいように) defquiz_answer+"日本で一番長い川は?\n信濃川\n長良川\n小川\n;\n" ;面倒だから一行で defquiz_answer+"intは何型?\n整数型\n実数型\n文字列型\n;\n" defquiz_answer+"a=1,2,3 の時 a(1)に入ってるのは?\n2\n1\n3\n;\n" defquiz_answer+"a=1,2,3 :b=2,1,0 の時 a(b(2))に入ってるのは?\n1\n0\n2\n;\n" answer_posy=32,64,96 ;回答ボタンの表示位置(answer_posy(0)が回答0番) *definition rightquiz=0 randomize quiz_answer=defquiz_answer ;問題文と回答を作業用バッファに代入 noteunsel notesel defquiz_answer quiz_max=noteinfo(0)/5 ;総問題数(quiz_max) quizcnt=0 pos 300,400:button goto "スタート",*quizselectpart stop *quizselectpart cls quizcnt++ :title str(quizcnt)+" 問目 正解数["+rightquiz+"/"+quiz_max+"]" wait 100 noteunsel notesel quiz_answer qmax=noteinfo(0)/5 ;作業用のバッファに残ってる問題数 quizselect=rnd(qmax)*5 ;選ばれた問題文の行インデックス answerselect=quizselect+1 ;正解回答の行インデックス noteget quiz,quizselect ;問題文取り出し mes quiz wait 100 repeat 3 ;回答の表示位置シャッフル _rnd=rnd(cnt+1) :tmp=answer_posy(cnt) :answer_posy(cnt)=answer_posy(_rnd) :answer_posy(_rnd)=tmp loop repeat 3 noteget answer,answerselect+cnt ;0番から回答を取り出し pos 32,answer_posy(cnt) :button goto answer,*atari_hazure ;シャッフルされた表示位置にボタンを作成 loop stop *atari_hazure answer_no=stat ;どのボタンが押されたか noteget answer,answerselect+answer_no ;押されたボタンに対応した回答を取り出す pos 32,answer_posy(answer_no) :mes "[ "+answer+" ]" ;そのボタンの位置に回答を表示 clrobj if answer_no=0 { ;0番の回答なら正解 mes "正解!" repeat 5 :notedel quizselect :loop ;正解した問題と回答(5行)を削除 rightquiz++ ;正解数カウント if rightquiz=quiz_max { title "全問正解" :goto *definition };万一全て正解してしまった場合は初期化する }else{ mes "残念、間違い!" } wait 200 goto *quizselectpart
>もしよろしければどなたか、もっと短いスクリプトで同じ事を実現できるアイデアを、提供して頂けないでしょうか。

配列変数を覚えられたら同じような使い方をする変数を
幾つも用意する必要が無くなって if文を羅列する
必要も無くなりますよ。

*q_1 if rightq_0=1 : goto *quizselectpart nowquiz=1 ;〜〜〜〜〜〜 if nowquiz=0 : rightq_0=1 if nowquiz=1 : rightq_1=1 ;〜〜〜〜〜〜
と言うのを

dim rightq_0_99,100 ;最初に確保(初期化) ;〜〜〜〜〜〜 *q_1 if rightq_0_99(1)=1 : goto *quizselectpart nowquiz=1 ;〜〜〜〜〜〜 rightq_0_99(nowquiz)=1 ;これ一行で全問分の if nowquiz=? : rightq_?=1 と同じ役割をする
こんな感じ



朝森久弥

リンク

2007/3/5(Mon) 10:36:17|NO.6041

アキスさん、halapecoさん、KIMUさん、懇切丁寧な回答ありがとうございます。

クイズをテキストファイルで読み込むという手法と、皆さんが提示してくださった「正解した問題を出さない」手法は、
いずれも学ぶところ、そして活用するところ大です。
おかげさまで引き続き、クイズゲーム製作を推進していけそうです。

本当に、ありがとうございました。



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