
【6日でできるJava入門】クイズ処理の流れ
これまで、ファイルの読み込みや可変長配列、乱数の使い方、キーボード入力処理について学んできました。ここでは、それらの知識を組み合わせて、都道府県名から県庁所在地を答えるクイズゲームの全体的な流れとプログラム例を解説します。全体像を理解することで、より実践的なJavaプログラミングスキルを身につけましょう。

1.クイズ処理の全体フロー
1.1. ゲーム開始時の準備
クイズを始める前に、必要な変数やデータ構造(スコア管理・都道府県と県庁所在地のリスト・ランダム数生成器など)を宣言・初期化します。
準備するもの | 目的 |
---|---|
int型のscore | 正解数(スコア)の記録 |
ArrayList | 都道府県名・県庁所在地のリスト |
Random | ランダムな出題や選択肢生成に利用 |
1.2. データファイルの読み込み
都道府県名と県庁所在地の組が記載されたテキストファイル(例: "prefectures.txt")を読み込み、リストに格納します。ファイルは1行につき「都道府県,県庁所在地」の形式です。
ファイル名:prefectures.txt
Eclipseの場合、プロジェクト直下にこのファイルを配置します。
北海道,札幌
青森県,青森
岩手県,盛岡
宮城県,仙台
秋田県,秋田
山形県,山形
福島県,福島
茨城県,水戸
栃木県,宇都宮
群馬県,前橋
埼玉県,さいたま
千葉県,千葉
東京都,東京
神奈川県,横浜
新潟県,新潟
富山県,富山
石川県,金沢
福井県,福井
山梨県,甲府
長野県,長野
岐阜県,岐阜
静岡県,静岡
愛知県,名古屋
三重県,津
滋賀県,大津
京都府,京都
大阪府,大阪
兵庫県,神戸
奈良県,奈良
和歌山県,和歌山
鳥取県,鳥取
島根県,松江
岡山県,岡山
広島県,広島
山口県,山口
徳島県,徳島
香川県,高松
愛媛県,松山
高知県,高知
福岡県,福岡
佐賀県,佐賀
長崎県,長崎
熊本県,熊本
大分県,大分
宮崎県,宮崎
鹿児島県,鹿児島
沖縄県,那覇
2.クイズの出題と回答処理
2.1. 問題作成と選択肢生成
- 出題:都道府県リストからランダムに1つ選び、問題として出します。
- 選択肢生成:正答(県庁所在地)1つ+他3つの誤答(他県の所在地)をランダムに選び、順番もランダムで並べます。
2.2. 回答受付とチェック
- 入力受付:プレイヤーからキーボードで1~4の番号を受け付けます。
- 判定:選択肢のうち正解かどうかを判定し、スコアを加算します。不正解なら正しい答えも表示します。
2.3. ゲームの終了と得点表示
- 10問出題したら、ゲームを終了し、最終スコアを表示します。
3.サンプルプログラム
都道府県名当てクイズの一例です。ファイル名「prefectures.txt」はカレントディレクトリに置いてください。
ファイル名: lesson24_1.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Random;
public class lesson24_1 {
public static void main(String[] args) throws Exception {
// スコア
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));
}
// 入力受付とチェック
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.実行例
1問目:次の都道府県の県庁所在地はどれ?
「長野県」
1:甲府
2:松山
3:長野
4:津
==> 3
正解です!
2問目:次の都道府県の県庁所在地はどれ?
「群馬県」
1:高知
2:前橋
3:松江
4:秋田
==> 2
正解です!
・・・
全10問終了!あなたの得点は 9 点です。
まとめ・注意点
- 配列の要素数管理やインデックスの対応に注意しましょう。
- ファイルのパスや文字コードにも注意(日本語を含む場合はUTF-8推奨)。
- 選択肢やデータが不足しないよう、出題回数・選択肢数とデータ数のバランスに気をつけてください。
この流れをもとに、県庁所在地当てクイズを自由に拡張したり、スコアランキングや難易度変更などの機能追加も試してみてください。