
【6日でできるJava入門】クイズゲームの改造①(チートモード搭載)
クイズゲームは学習にもエンターテイメントにも役立つ便利なアプリケーションですが、開発や動作確認の過程では“チートモード”が非常に有用です。
チートモードとは、正解をあらかじめ表示してしまう機能です。これにより、動作テストや答え合わせがスムーズに行えます。ここでは、既存の「県庁所在地クイズ」にチートモードを搭載し、その仕組みと実装方法、実際の動作を詳しく解説します。

1.チートモードの概要
1.1. チートモードとは
チートモードとは、通常隠されている「正解」をクイズの出題と同時に画面に表示する特別な動作モードです。
このモードを使うことで、
- プログラムの正しさの検証
- 学習効率の向上(すぐに答えを見られる)
- デバッグやプレイ時の確認作業
が容易になります。
| モード | 出題時の正解表示 | 主な用途 |
|---|---|---|
| 通常モード | ×(非表示) | 本番クイズ |
| チートモード | 〇(表示) | 動作確認、学習サポート |
1.2. チートモードでのクイズゲームの実行方法
今回のサンプルプログラムでは、「cheat」というキーワードをコマンドライン引数として指定すると、チートモードで動作します。
コマンドラインで実行する場合
引数が「cheat」ならチートモード、それ以外は通常モードで動作します。
# チートモード(正解を表示)
java Quiz_Game cheat
# 通常モード(正解は表示しない)
java Qiuiz_GameEclipseで実行する場合
メニューの「実行」→「実行構成」をクリックします。

「引数」のタブで、「プログラムの引数」に「cheat」と入力し、「実行」ボタンをクリックします。

実行結果例
1問目:次の都道府県の県庁所在地はどれ?
「三重県」
1:宇都宮
2:津
3:奈良
4:鹿児島
【チートモード】正解は「津」です。
==> 2
正解です!
2問目:次の都道府県の県庁所在地はどれ?
「奈良県」
1:秋田
2:奈良
3:福井
4:高知
【チートモード】正解は「奈良」です。
==> 2.チートモードの仕組み
2.1. コマンドライン引数で切り替え
プログラムのmainメソッドで、args配列を参照し、
args.length > 0かつargs[0].equals("cheat")ならチートモードON- それ以外はOFF
と判断します。
2.2. チートモード時の処理分岐
出題ごとに
- 通常モード:問題・選択肢のみ表示
- チートモード:加えて「正解は◯◯です」と表示
となるように、if (cheatMode)の分岐を挿入します。
| 判定条件 | 正解表示 | 実装箇所 |
|---|---|---|
| cheatMode==true | 〇 | 出題直後に表示 |
| cheatMode==false | × | 正解時・不正解時のみ表示 |
2.3. 実装ポイント解説
- コマンドライン引数を取得し、boolean型の
cheatModeで管理 - 問題出題直後に正解(正しい県庁所在地)を表示
- それ以外の処理は従来どおり
2.チートモード搭載プログラム
ファイル名: Quiz_Game.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Random;
public class Quiz_Game {
public static void main(String[] args) throws Exception {
// チートモード判定
boolean cheatMode = (args.length > 0 && args[0].equals("cheat"));
// スコア
int score = 0;
// 都道府県名と県庁所在地のリスト
ArrayList<String> prefectures = new ArrayList<String>();
ArrayList<String> capitals = new ArrayList<String>();
// ランダム生成器
Random rand = new Random();
// ファイルから読み込み
BufferedReader br = new BufferedReader(new FileReader("prefectures.txt"));
String line;
while ((line = br.readLine()) != null) {
int idx = line.indexOf(',');
prefectures.add(line.substring(0, idx));
capitals.add(line.substring(idx + 1));
}
br.close();
// 10問出題
for (int i = 1; i <= 10; i++) {
int qIdx = rand.nextInt(prefectures.size());
String questionPref = prefectures.remove(qIdx);
String correctAns = capitals.remove(qIdx);
// 選択肢リスト作成
ArrayList<String> choices = new ArrayList<String>();
ArrayList<String> backupCapitals = new ArrayList<String>(capitals); // 一時的バックアップ
// 他の3つを選択肢に追加
for (int j = 0; j < 3; j++) {
int cIdx = rand.nextInt(backupCapitals.size());
choices.add(backupCapitals.remove(cIdx));
}
// 正解の挿入位置をランダムで決める
int insertIdx = rand.nextInt(choices.size() + 1);
choices.add(insertIdx, correctAns);
// 問題・選択肢の表示
System.out.println(i + "問目:次の都道府県の県庁所在地はどれ?");
System.out.println("「" + questionPref + "」");
for (int j = 0; j < choices.size(); j++) {
System.out.println((j + 1) + ":" + choices.get(j));
}
// チートモード時は正解を表示
if (cheatMode) {
System.out.println("【チートモード】正解は「" + correctAns + "」です。");
}
// 入力受付とチェック
byte[] b = new byte[128];
int answer;
while (true) {
System.out.print("==> ");
System.in.read(b);
try {
answer = Integer.parseInt((new String(b)).trim().substring(0, 1));
if (answer >= 1 && answer <= 4) {
break;
} else {
System.out.println("1~4の数字で選んでください。");
}
} catch (Exception e) {
System.out.println("数字を入力してください。");
}
}
answer--;
// 判定
if (answer == insertIdx) {
score++;
System.out.println("正解です!");
} else {
System.out.println("不正解。正解は「" + correctAns + "」です。");
}
System.out.println();
}
// ゲーム終了
System.out.println("全10問終了!あなたの得点は " + score + " 点です。");
}
}4.都道府県・県庁所在地データ(prefectures.txt)
ファイル名: Quiz_Game.java
Eclipseでは、このファイルをプロジェクト直下に配置します。
北海道,札幌
青森県,青森
岩手県,盛岡
宮城県,仙台
秋田県,秋田
山形県,山形
福島県,福島
茨城県,水戸
栃木県,宇都宮
群馬県,前橋
埼玉県,さいたま
千葉県,千葉
東京都,東京
神奈川県,横浜
新潟県,新潟
富山県,富山
石川県,金沢
福井県,福井
山梨県,甲府
長野県,長野
岐阜県,岐阜
静岡県,静岡
愛知県,名古屋
三重県,津
滋賀県,大津
京都府,京都
大阪府,大阪
兵庫県,神戸
奈良県,奈良
和歌山県,和歌山
鳥取県,鳥取
島根県,松江
岡山県,岡山
広島県,広島
山口県,山口
徳島県,徳島
香川県,高松
愛媛県,松山
高知県,高知
福岡県,福岡
佐賀県,佐賀
長崎県,長崎
熊本県,熊本
大分県,大分
宮崎県,宮崎
鹿児島県,鹿児島
沖縄県,那覇まとめ
- チートモードは正解を表示してデバッグや学習効率を高める
- コマンドライン引数によるモード切替で柔軟に動作
- 既存プログラムに少しの工夫で便利な機能が追加できる
ぜひ自分でチートモードON/OFFを切り替え、動作を確認してください。
