テキストアドベンチャーゲームを作る<Javaでゲームを作ろう>

プログラム

本日の課題

テキストアドベンチャーゲームを作る
アドベンチャーゲームブックのようなゲームの土台をを作りたいと思います。
・画面構成はスタート画面とゲーム画面の2画面になります。
・「story.csv」からストーリーデータを読み込む。
・「save.csv」からセーブデータを読み込む。
・「images」フォルダに「csv」ファイルを格納する。
・2択の選択に応じてスートリーの進行ができるようにします。
・GUIの作成には「swing」を使用します。
・ファイルの読み書きには「BufferedReader」と「FileWriter」を使用します。
・プロジェクトのプロジェクトディレクトリ構造は下記を参考にしてください。

用意するもの
・「start.jpg」640*480の画像ファイルを用意してください。
・「story.csv」を用意してください。
・「save.csv」を用意してください。
・「images」左記のリンクからcsvのサンプルをダウンロードできます。

ソースコード

public class Main {
// ストーリーデータとセーブデータ
private static String[][] story;
private static int saveIndex;

// 画面サイズ
private static final int WIDTH = 640;
private static final int HEIGHT = 480;

public static void main(String[] args) {
// ストーリーデータを読み込み
loadStory();
// セーブデータを読み込み
loadSaveData();
// スタート画面を表示
showStartScreen();
}

// ストーリーデータの読み込み
private static void loadStory() {
try (BufferedReader br = new BufferedReader(new FileReader(“images/story.csv”))) {
String line;
story = br.lines().map(l -> l.split(“,”)).toArray(String[][]::new);
} catch (IOException e) {
e.printStackTrace();
}
}

// セーブデータの読み込み
private static void loadSaveData() {
try (BufferedReader br = new BufferedReader(new FileReader(“images/save.csv”))) {
String line = br.readLine().trim();
// 不要な空白や非表示文字を削除
line = line.replaceAll(“[^\\d]”, “”);
saveIndex = Integer.parseInt(line);
// セーブデータが999の場合は0に変更
if (saveIndex == 999) {
saveIndex = 0;
saveData(0); // セーブデータを0に更新
}
} catch (IOException e) {
e.printStackTrace();
}
}

// セーブデータの書き込み
private static void saveData(int index) {
try (FileWriter fw = new FileWriter(“images/save.csv”)) {
fw.write(String.valueOf(index));
} catch (IOException e) {
e.printStackTrace();
}
}

// スタート画面の表示
private static void showStartScreen() {
JFrame frame = new JFrame(“Text Adventure Game”);
frame.setSize(WIDTH, HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);

JPanel panel = new JPanel();
panel.setLayout(null);

// スタート画面の画像を表示
JLabel background = new JLabel(new ImageIcon(“images/start.jpg”));
background.setBounds(0, 0, WIDTH, HEIGHT);
panel.add(background);

// 「開始」ボタン
JButton startButton = new JButton(“開始”);
startButton.setBounds(300, 200, 100, 50);
startButton.addActionListener(e -> {
frame.dispose();
showGameScreen(0);
});
panel.add(startButton);

// 「続き」ボタン
JButton continueButton = new JButton(“続き”);
continueButton.setBounds(300, 300, 100, 50);
continueButton.addActionListener(e -> {
frame.dispose();
showGameScreen(saveIndex);
});
panel.add(continueButton);

frame.add(panel);
frame.setVisible(true);
}

// ゲーム画面の表示
private static void showGameScreen(int index) {
JFrame frame = new JFrame(“Text Adventure Game”);
frame.setSize(WIDTH, HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
updateGameScreen(frame, index);
}

// ゲーム画面の更新
private static void updateGameScreen(JFrame frame, int index) {
frame.getContentPane().removeAll();
frame.setLayout(new BorderLayout());

// ストーリーの文章を表示するエリア
JTextArea storyArea = new JTextArea(story[index][0]);
storyArea.setEditable(false);
storyArea.setLineWrap(true);
storyArea.setWrapStyleWord(true);
storyArea.setPreferredSize(new Dimension(WIDTH, 280));
frame.add(storyArea, BorderLayout.NORTH);

// 行動1のボタン
JButton action1Button = new JButton(story[index][1]);
action1Button.setPreferredSize(new Dimension(WIDTH, 100));
action1Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][3]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});
frame.add(action1Button, BorderLayout.CENTER);

// 行動2のボタン
JButton action2Button = new JButton(story[index][2]);
action2Button.setPreferredSize(new Dimension(WIDTH, 100));
action2Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][4]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});
frame.add(action2Button, BorderLayout.SOUTH);

frame.pack();
frame.setVisible(true);
}
}

結果の画面


背景がザクなのはちょうど良い大きさの画像で一番最初に目に入ったからですw

解説

1回目:Mainメソッドを作る
2回目:loadStoryソッドを作る
3回目:loadSaveDataメソッド、saveDataメソッドを作る
4回目:showStartScreenメソッドを作る
5回目:showGameScreen と updateGameScreen メソッドを作る
目次に戻る

スポンサーリンク

コメント

タイトルとURLをコピーしました