Javaでゲームを作ろう<アドベンチャーゲーム>完成

プログラム

本日の課題

アドベンチャーゲームを作ろう!!
アドベンチャーゲーム(画像表示機能付き)
1回目:構成を考えよう
2回目:メインメソッドの解説
3回目:ストーリーデータ、セーブデータの読み込みとセーブデータの書き込み
4回目:スタート画面を作ろう(テキストアドベンチャーと同じソースコードです)
5回目:ゲーム画面の表示部分を作成する
6回目:「story」配列からゲーム進行の情報を取り出し実行する。
完成品:説明が不要の方は、こちらからコードをコピーしてください。

ソースコード

package avgGame;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

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

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

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

// ストーリーデータの読み込み
private static void loadStory() {
try (BufferedReader br = new BufferedReader(new FileReader(“images/story2.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/save2.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/save2.csv”)) {
fw.write(String.valueOf(index));
} catch (IOException e) {
e.printStackTrace();
}
}

// スタート画面の表示
private static void showStartScreen() {
JFrame frame = new JFrame(“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(“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(null);

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

// 画像を表示するエリア
// 新しく追加されたコード
JLabel imageLabel = new JLabel(new ImageIcon(“images/” + story[index][9]));
imageLabel.setBounds(0, 0, 400, 400); // 画像の位置とサイズ
frame.add(imageLabel);

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

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

// 行動3のボタン
JButton action3Button = new JButton(story[index][3]);
// action2Button.setPreferredSize(new Dimension(WIDTH, 100));
action3Button.setBounds(400, 200, 240, 100); // 変更点
action3Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][7]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});
frame.add(action3Button);

// 行動4のボタン
JButton action4Button = new JButton(story[index][4]);
// action2Button.setPreferredSize(new Dimension(WIDTH, 100));
action4Button.setBounds(400, 300, 240, 100); // 変更点
action4Button.addActionListener(e -> {
int nextIndex = Integer.parseInt(story[index][8]);
saveData(nextIndex);
if (nextIndex == 999) {
frame.dispose();
showStartScreen();
} else {
updateGameScreen(frame, nextIndex);
}
});
frame.add(action4Button);

// 空白の行動1の場合はスタート画面に戻る
if (story[index][1].isEmpty()) {
action1Button.setText(“スタート画面に戻る”);
action1Button.addActionListener(e -> {
frame.dispose();
showStartScreen();
});
}

// 空白の行動2の場合はボタンを非表示にする
if (story[index][2].isEmpty()) {
action2Button.setVisible(false);
}

// 空白の行動3の場合はボタンを非表示にする
if (story[index][3].isEmpty()) {
action3Button.setVisible(false);
}

// 空白の行動4の場合はボタンを非表示にする
if (story[index][4].isEmpty()) {
action4Button.setVisible(false);
}

frame.revalidate(); // 変更点
frame.repaint(); // 変更点
frame.setVisible(true);
}
}

目次に戻る

スポンサーリンク

コメント

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