イントロダクション
RPGゲームの戦闘シーンを作成したいと思います。
イメージは、ファミコンのドラ◯エのように、「〜があらわれた!」で始まり、最後は「〜をたいじした。」と表示して終わる。そんなコンソールゲームを作成したいと思います。
テキストを主軸にした描画方法でのゲームです。下のようなイメージです。
戦闘シーンを作る理由
今回作成する「戦闘シーン」に関して、はじめに着手する理由を記載しておきます。
- 作ってしまえば、あとで使い回しが可能な部品(クラス)を作り、改修(カスタム)がしやすいように作る
- テキストのみのゲームをテスト的に実行してみる
- テキストベースなので、細かい描画処理がいらない
- オブジェクト指向プログラミングの練習になる ※1の内容がこれに当たります。
上記のような理由(と自分の趣味の関係)でテキストRPGゲーム風なプログラムを作成してみようと思います。
今までの流れ
以前、「じゃんけんゲーム」を作成しました。
・Java ミニゲーム ソース 〜じゃんけんゲーム in Console 〜
・Java ミニゲーム ソース 〜じゃんけんゲーム in Console 完成〜
ここまでで、「単純にクラスを作ってプログラムを起動する」ということを実践してみました。
次は、「クラスとクラスを組み合わせて何かを作る」という部分に着手します。
つまりは、作成するクラスにそれぞれの役割を与え、その役割を順番に呼び出して一つのプログラムを作成するというところです。
じゃんけんゲームで考えるならば。。。
下のような、大まかな役割分担を行います。
- プログラムを実行するクラス、JankenMainクラスを作成
- コンソール表示するクラス、ConsoleUtilクラスを作成
- じゃんけんの勝敗判定を行うクラス、JankenUtilクラスを作成
このように役割分担を行っておけば、JankenMainクラス(のメインメソッド)で下のような処理をすればじゃんけんゲームが作成できる。というわけです。しかし、これはサンプルなので、どのようなクラス分けが良いかは自分で考えてみてください。
処理の順番
- メインメソッドを起動する(JankenMain)
- ユーザーの入力(標準入力)を受け付ける(ConsoleUtil)
- CPUの手を取得する(乱数を使用して取得する)(JankenUtil)
- 勝敗判定を行う(JankenUtil)
- 結果を表示する(ConsoleUtil)
ここまで作成すれば、あとはじゃんけんゲームとして動かすことができます。
しかし、次のような疑問が出てきます。
- 想定外の入力があった場合どのように処理をするか?
- XX回勝負などを指定できるようにできないか?
など、想像力を膨らませただけ「疑問」や「改造したい!」という欲求が出てきます。
そのたびに、プログラムを組みなおしているのでは、手間が多すぎます。
そこで、「役割分担」の出番です。一番わかりやすい例として「入力チェック」を追加で実装する場合を考えてみます。
入力チェックを追加する
これは、簡単です。結論から行くと「チェック処理を作成し、JankenMainに3, 4行追加するだけです。」
具体的には、下のような形になります。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String input = scan.nextLine();
// この部分を追加
if (JankenUtil.checkInput(input)) {
System.out.println("想定外の入力です:" + input);
// プログラムの強制終了
System.exit(-1);
}
}
役割分担を行っていれば、「その役割のあるクラスに対象になる処理を作成し、あとは呼び出すだけでよい」という形に持っていくプログラムの作り方です。
クラスに役割を与える
例えですが、グループでカレーを作るとかの作業を行うとき。。。
以下のような役割分担をすると思います。
- 火を起こす人
- 食材を切る人
- カレーの具を煮る人
- その他。。。
このように、クラスにも役割を与えます。
処理の流れ(簡単設計)
今回作成するRPGゲーム(戦闘シーンのみ)は勇者(プレーヤー)とモンスター(たくのじ)が登場します。
そして、戦闘を行い、最後に勝者がわかるよう「〜をやっつけた」もしくは、「〜は倒れた」のような文言を表示する。
登場するクラスを考える
すぐに思いつくのは「プレーヤー」と「モンスター」です。
これらは、クラスにするとして、その他は何が必要でしょうか?
ますは、プログラムを起動するための「メインメソッド」
そして、ゲームとして動かすためのクラス、
今回は以前自分が学習したLWJGLのプログラムの組み方を参考にして作ります。
大まかに、ゲームを作るときの処理は以下の1〜4の処理をループしてゲームとしての動きを実現します。
- 初期処理(画像や、データの読み込みなど)
- 入力受付
- 画像やデータの更新
- 画面の再描画
よくよく考えてみると、ほとんどのゲームが「初期表示(再表示)」→「入力」→「再描画」となっていると思います。
プレーヤー側からしたら「データ更新」の部分は見えませんがね(笑)
作成するクラス一覧
上記の内容を踏まえ、以下のクラスを作成しました。
初期表示のみの実装ですが、Githubにアップロードしています。
- GameMain: ゲームを動かす、メインメソッドのクラスです
- TextRpgGame: メインメソッドから、呼ばれる、ゲームの内容を実装するクラスです。
- Player, Monster: プレーヤーとモンスターを表現するクラスです。主にデータを保持するクラスです。
- CheckerUtils: 入力チェックなどのチェック処理をまとめたクラスです。
上のようなクラスを作成しました。動作は下のような感じです。
コンソール表示なので。。。
作成したクラス一覧
・GameMain
・TextRpgGame
・Monster
・Player
・CheckeerUtils
余談:ソースの管理について
Githubを使うとソースのバージョン管理、つまりは、コミットした順序で、ソースの修正部分を管理できる代物です。
接続方法は下の動画で紹介しています。
関連ページ一覧
Eclipse セットアップ
- Java Install Eclipse〜開発ツールのインストール〜
- TensorFlow C++環境〜EclipseにCDTをインストール〜
- Setup OpenGL with Java〜JOGLを使う準備 for Eclipse〜
- Eclipse Meven 開発手順〜プロジェクトの作成〜
- Java OpenCV 環境セットアップ(on Mac)
- Eclipse SceneBuilderを追加する
- JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
Java Basic一覧
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 9〜Training of for statement〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜
- Java Basic JUnit 〜テストスイートの作り方〜
Git関連
- Java Git clone in Eclipse 〜サンプルの取得〜
- Eclipse Gitリポジトリの取得 〜GitからソースをPullしよう〜
- IntelliJ IDEA Git〜Gitリポジトリからクローン〜