ランダム出題のクイズを作りたいのですが…

BigBright

ユーザー
ゲーム内でクイズ専用のマップを作り、中に入ると自動的にクイズが始まるように作っています。
変数やスイッチを使いながらいろいろ試しているのですが、うまく作れません。
アドバイスを頂けないでしょうか。
求めている仕様は以下の通りです。

①マップに入るとクイズが始まる。
②無数にあるクイズのうち、5個が出題される。
③5個出題された時点で終了、景品をもらい、マップ外に出る。
④マップ外に出るとクイズの出題履歴がリセットされ、部屋に入ると再びランダムでクイズが出題される。
⑤クイズの追加・編集が容易にできる(これは作成者側の都合ですが…)。

ストーリーは出来てきたのですが、システム回りがあともう一歩です。
拙作の手助けをしていただければと思いますので、どうぞよろしくお願いいたします。
 
拙作、『平成といふ時代』というゲームのシステムと似ていると思ったので、書き込みします。

条件分岐と変数を使用します。
『クイズ出題』とした変数を作成。
これをクイズの出題数と同じ数の間でランダムに『代入』します。
あとは『条件分岐』にて、
変数:クイズ出題=1のとき:問題1
変数:クイズ出題=2のとき:問題2
と増やしていくだけです。

クイズを増やした時は最初のランダム数を増やせば良いだけなので、それほど手間にはなりません。
条件分岐で一問一問ツクっていくのは、とても面倒ですが、ご参考下さい。
 

munokura

ユーザー
シンプルな形としてはこんな感じではないでしょうか?
コード:
◆変数の操作:#0001 V1 = 乱数 1..5
◆条件分岐:V1 = 1
  ◆文章:なし, なし, ウィンドウ, 下
  :  :クイズ1
  ◆選択肢の表示:はい, いいえ (ウィンドウ, 右, #1, #2)
  :はいのとき
    ◆
  :いいえのとき
    ◆
  :分岐終了
  ◆
:分岐終了
◆条件分岐:V1 = 2
  ◆文章:なし, なし, ウィンドウ, 下
  :  :クイズ2
  ◆選択肢の表示:はい, いいえ (ウィンドウ, 右, #1, #2)
  :はいのとき
    ◆
  :いいえのとき
    ◆
  :分岐終了
  ◆
:分岐終了
◆条件分岐:V1 = 3
  ◆文章:なし, なし, ウィンドウ, 下
  :  :クイズ3
  ◆選択肢の表示:はい, いいえ (ウィンドウ, 右, #1, #2)
  :はいのとき
    ◆
  :いいえのとき
    ◆
  :分岐終了
  ◆
:分岐終了
◆条件分岐:V1 = 4
  ◆文章:なし, なし, ウィンドウ, 下
  :  :クイズ4
  ◆選択肢の表示:はい, いいえ (ウィンドウ, 右, #1, #2)
  :はいのとき
    ◆
  :いいえのとき
    ◆
  :分岐終了
  ◆
:分岐終了
◆条件分岐:V1 = 5
  ◆文章:なし, なし, ウィンドウ, 下
  :  :クイズ5
  ◆選択肢の表示:はい, いいえ (ウィンドウ, 右, #1, #2)
  :はいのとき
    ◆
  :いいえのとき
    ◆
  :分岐終了
  ◆
:分岐終了
◆場所移動:MAP001 (8,6) (向き: 下)
SS01.png
 
ワタベさん、munokuraさんのイベントの組み方に同意します。

一点注意が必要なのは「5個出題」ということで
「『全問題から完全ランダムで5問』とした時、同じ変数で5回繰り返すと同一問題が2度出題されることがある」点でしょうか。
なので「1問目は問題1~5のうちからどれか→2問目は問題6~10のうちからどれか→3問目は問題11~15のうちどれか」とした方が
作りやすい感じはします。この場合、後からの問題の追加が若干面倒になる可能性もありますが…。
※「ユニバーサル・ツクール・ジャパン」のアリヒコットさんのアトラクション「クイズゲート」が確かこの仕様でした。
 

munokura

ユーザー
夢幻台氏のおっしゃる懸念は自分も感じていました。
下記を使うと、5個のクイズだけだとしても、重複なく呼ぶことが簡単にできます。

▼Hz Random List(ひず様作) - HzRandomList.js
重複の無いランダム値を作成するプラグイン

しかし、最も基本的な変数にランダム値を入れるイベントを組めるようになってからでなければ、使うのは難しいでしょうね。
 
ちょっとプログラミングをしてみました。Arrayクラスのメソッドが、優秀すぎるから悪いんです(笑)
JavaScript:
const quizCount = 20;
const questionCount = 10;
const startVariableId = 21;
const quizIds = new Array(quizCount).fill(0).map( (x,index) => index + 1);
const shuffledQuizIds = quizIds.sort( (a,b) => Math.random() - 0.5);
const questionIds = shuffledQuizIds.slice(0,questionCount);
questionIds.forEach( (quizId,index) => {
  $gameVariables.setValue(startVariableId + index,quizId);
});
これを「スクリプト」に貼り付けます。

それぞれ何をしているかというと
const quizCount = 20;
総問題数を設定します。

const questionCount = 10;
出題する問題数を設定します。

const startVariableId = 21;
問題のIDを代入する変数のスタート地点です。

const quizIds = new Array(quizCount).fill(0).map( (x,index) => index + 1);
1から総問題数までの数字から構成される配列を作ります。

const shuffledQuizIds = quizIds.sort( (a,b) => Math.random() - 0.5);
問題をシャッフルします。

const questionIds = shuffledQuizIds.slice(0,questionCount);
配列を出題数の分だけ切り取ります。

questionIds.forEach( (quizId,index) => {
$gameVariables.setValue(startVariableId + index,quizId);
});
ツクールの変数に、出題するクイズのIDを代入します。

これでクイズの出題をランダムにできるはずです。
そして、1問ごとに出題するクイズを表す変数に代入していけばいいと思います。
 

BigBright

ユーザー
拙作、『平成といふ時代』というゲームのシステムと似ていると思ったので、書き込みします。

条件分岐と変数を使用します。
『クイズ出題』とした変数を作成。
これをクイズの出題数と同じ数の間でランダムに『代入』します。
あとは『条件分岐』にて、
変数:クイズ出題=1のとき:問題1
変数:クイズ出題=2のとき:問題2
と増やしていくだけです。

クイズを増やした時は最初のランダム数を増やせば良いだけなので、それほど手間にはなりません。
条件分岐で一問一問ツクっていくのは、とても面倒ですが、ご参考下さい。

ワタベ様

ご返答ありがとうございます。
プレイさせていただきましたが、甲子園の問題だけわからず29/30点でした。癒されました…。

…というのは置いておいて、イメージしているクイズの形で、とても参考になりました。
こちらは各年代ごとにイベントを作成して各年代から1つ出題されるように組まれているようですね。
条件分岐を使った形も使ってみます。ありがとうございます。
 

BigBright

ユーザー
夢幻台氏のおっしゃる懸念は自分も感じていました。
下記を使うと、5個のクイズだけだとしても、重複なく呼ぶことが簡単にできます。

▼Hz Random List(ひず様作) - HzRandomList.js
重複の無いランダム値を作成するプラグイン

しかし、最も基本的な変数にランダム値を入れるイベントを組めるようになってからでなければ、使うのは難しいでしょうね。

munokura様

ご返信ありがとうございます。
こちらのプラグインを使用して変数を2種類組み合わせたら、理想のものができました。
作成が大きく進みそうです。

ありがとうございました。
 

BigBright

ユーザー
ワタベさん、munokuraさんのイベントの組み方に同意します。

一点注意が必要なのは「5個出題」ということで
「『全問題から完全ランダムで5問』とした時、同じ変数で5回繰り返すと同一問題が2度出題されることがある」点でしょうか。
なので「1問目は問題1~5のうちからどれか→2問目は問題6~10のうちからどれか→3問目は問題11~15のうちどれか」とした方が
作りやすい感じはします。この場合、後からの問題の追加が若干面倒になる可能性もありますが…。
※「ユニバーサル・ツクール・ジャパン」のアリヒコットさんのアトラクション「クイズゲート」が確かこの仕様でした。

夢幻台様

ご返信ありがとうございます。
一番の悩みどころはおっしゃったように、「『全問題から完全ランダムで5問』とした時、同じ変数で5回繰り返すと同一問題が2度出題されることがある」という点でした。
1~5、6~10…というようにイベントを組んでみましたが、管理がしにくくて断念してしまいました。

munokuraさんの「重複しないランダム値を作成するプラグイン」で、全問題からランダムに任意の個数を出題できるようになりました。

ありがとうございました。
 

BigBright

ユーザー
ちょっとプログラミングをしてみました。Arrayクラスのメソッドが、優秀すぎるから悪いんです(笑)
JavaScript:
const quizCount = 20;
const questionCount = 10;
const startVariableId = 21;
const quizIds = new Array(quizCount).fill(0).map( (x,index) => index + 1);
const shuffledQuizIds = quizIds.sort( (a,b) => Math.random() - 0.5);
const questionIds = shuffledQuizIds.slice(0,questionCount);
questionIds.forEach( (quizId,index) => {
  $gameVariables.setValue(startVariableId + index,quizId);
});
これを「スクリプト」に貼り付けます。

それぞれ何をしているかというと
const quizCount = 20;
総問題数を設定します。

const questionCount = 10;
出題する問題数を設定します。

const startVariableId = 21;
問題のIDを代入する変数のスタート地点です。

const quizIds = new Array(quizCount).fill(0).map( (x,index) => index + 1);
1から総問題数までの数字から構成される配列を作ります。

const shuffledQuizIds = quizIds.sort( (a,b) => Math.random() - 0.5);
問題をシャッフルします。

const questionIds = shuffledQuizIds.slice(0,questionCount);
配列を出題数の分だけ切り取ります。

questionIds.forEach( (quizId,index) => {
$gameVariables.setValue(startVariableId + index,quizId);
});
ツクールの変数に、出題するクイズのIDを代入します。

これでクイズの出題をランダムにできるはずです。
そして、1問ごとに出題するクイズを表す変数に代入していけばいいと思います。

シトラス様

ご返信ありがとうございます。
まだまだ初心者なもので、自分の能力が追いついておらず、理解するに至りませんでした…。
せっかく情報提供していただいたのに、申し訳ないです。
これから勉強していく中で、理解できるようにしていきたいと思います。

ありがとうございました。
 
トップ