今回は、入力〜戦闘を行い、次のターンへ進む処理を実装します。
前回は、以下の画面を表示するところまで実装しました。
作成したクラス一覧
・GameMain
・TextRpgGame
・Monster
・Player
・CheckeerUtils
1ターンの戦闘
1ターン分の戦闘を行うのに、「攻撃力、防御力」のパラメータが必要になります。
具体的には下のようなイメージです。
プレーヤー
HP: XX
MP: XX
攻撃力:XX
防御力:XX
こんな感じです。これは当然モンスターにも必要になります。
ここで、ちょっと注意というか、気がつく(実装したから気がついた)のが、PlayerクラスとMonsterクラスの実装が「ほぼ同じ」だということです。
PlayerクラスとMonsterクラスの違いはクラス名くらいなのです。
なので、このPayerクラスとMonsterクラスの同じような処理はまとめてしまいましょう!
クラスの処理をまとめる
まとめる方法は色々とありますが、今回は「スーパークラス(親クラス)」を使用します。
イメージは下のような感じです。
上のような図はUMLのクラス図と言います。
UMLに関しては他の記事に記載しているので。。。
今回は、実装の方を進めます。
上の図にあるように、Charactorクラスを作成します。
そして、PlayerとMonsterで同じ実装をしている部分をCharactorクラスに引っ越ししてしまいます。
具体的には下のような実装です(GetterとSetterは省略)
public class Charactor {
/** HP */
protected int hp;
/** MP */
protected int mp;
/** Level */
protected int level;
/** 攻撃力 */
protected int atack;
/** 防御力 */
protected int defence;
/** 武器 */
protected Wepons wepons;
/** 防具 */
protected Armors armor;
ちなみに、武器と防具はまた別にクラスを作成しました。
中身はまだ決まっていません。とりあえずは、武器なら攻撃力、防具なら防御力をフィールド(要素)として持っています。
そして、PlayerクラスとMonsterクラスには攻撃、防御のコマンドが必要になります。
しかし、これも共通するのでスーパークラスに作成します。
ここで「実装」という言葉を使わなかったのはわけがあります。
抽象メソッド
書き方はインターフェースの時と同じです。
public void XXXXX();
というように、メソッドの宣言のみを記述します。
具体的に下のように実装しました。
public abstract class Charactor {
/** HP */
protected int hp;
/** MP */
protected int mp;
/** Level */
protected int level;
/** 攻撃力 */
protected int atack;
/** 防御力 */
protected int defence;
/** 武器 */
protected Wepons wepons;
/** 防具 */
protected Armors armor;
/** 抽象メソッド: 攻撃 */
public abstract int attack();
/** 抽象メソッド: 防御 */
public abstract int diffence();
}
クラスを通常のクラスから抽象クラスへ変更:public class
からpublic abstract class
へ修正
そして、これを継承するクラスは、下のようにエラーが出ます。
抽象メソッドはオーバーライド
これを行わないと上のようにビルドエラーが出ます。
Javaのプログラミングルールみたいなものです。
逆にいうと、抽象メソッドは「必ずオーバーライドする」ことが約束されるので、「XXXクラス(インターフェース )を実装するクラスには△△△というメソッドが必ずある」ということになりますので、下のような実装が可能になります。
List listA = new ArrayList();
List listB = new LinkedList();
listA.add(オブジェクト1);
listB.add(オブジェクト2);
今回のPlayerクラスとMonsterクラスにも同じことが言えて、下のような実装が可能です。※多分使わないけど。。。
Charactor ch1 = new Player(10, 10);
Charactor ch2 = new Monster(5, 5);
ch1.attack();
ch2.attack();
こんな感じで動きました。
最終的なソースはこちらにあります。元のソースと比較している画面が見れます。
マルチスレッドについて
今まで、記載してないのですが、戦闘シーンのみはちょっと寂しいので拡張するということも考慮に入れてマルチスレッドに対応させています。というかLWJGLがすでに対応しているというか、そうのようにする必要があります。
実際LWJGLでは、ウィンドウに描画する(OpenGLの使用)処理があるのでマルチスレッドでの実装が必須です。
しかし、今回のマルチスレッドの実装は自前のものになってしまうので、サンプルの作成と起動確認を行ってみました。
メインにするスレッドとサブにするスレッドを「synchronized」修飾子をつけて区別をつける必要がありました。
サンプルコードは以下になります。
<実装コード(Github)>
・ThreadMain
・Thread1Cls
・Thread2Cls
<処理内容>
- メインメソッド(ThreadMain)から処理を起動
- 主軸(メイン)になるスレッド(Thread1Cls)と付随するスレッド(Thread2Cls)を起動
- 主軸(メイン)になるスレッド(Thread1Cls)で以下の処理を行う
- ”Thread1Cls: 処理を開始します"を表示
- 入力受付、入力値の表示
- 3秒待機(出力には「5秒」とあるが実装ミス)
- 付随するスレッド(Thread2Cls)で以下の処理を行う
- 3秒待機(出力には「5秒」とあるが実装ミス)
- ”Thread2Cls: 処理を開始します"を表示
- 入力受付、入力値の表示
でわでわ。。。
<!— BODY広告 —>
関連ページ
- Java はじめて 1 〜メインメソッド〜
- Java はじめて2 〜メソッドを呼び出す〜
- Java はじめて3 〜コメントの書き方〜
- Java はじめて4〜練習問題をやってみる〜
- Java はじめて5 〜変数について〜
- Java はじめて6 〜変数について2、byte, char, boolean型〜
- Java はじめて7 〜配列とは、配列の使い方〜
- Java はじめて8 〜booleanとif~
- Java はじめて 9 〜switch文〜
- Java はじめて 10 〜ループ処理A: for文1〜
- Java はじめて 11 〜ループ処理A: for文2 拡張for文〜
- Java はじめて12 〜ループ処理B: while文〜
- Java はじめて13 〜ループ処理C: do-while文〜
- Java はじめて14 〜クラスの作り方〜
- Java はじめて15 〜クラス型変数の使い方〜
- Java はじめて16 〜クラス設計から実装〜
- Java はじめて17 〜設計後の部品を実装する1〜
- Java はじめて18 〜設計後の部品を実装する2〜
- Java はじめて19 〜コンストラクタの役割を見る〜
- Java はじめて20 〜チェック処理クラスを作る〜
- Java はじめて21 〜オブジェクト指向的分析、アプリの拡張をする〜
- Java はじめて22 〜オブジェクト指向的分析、アプリ拡張の実装とテスト〜
- Java はじめて23 〜テスト駆動型開発を行う〜
- Java はじめて24 〜JUnitでのテスト駆動型開発1〜
- Java はじめて25 〜JUnitでのテスト駆動型開発2: テストケース作成〜
- Java はじめて26 〜JUnitでのテスト駆動型開発3: クラスの実装〜
- Java はじめて27 〜JUnitでのテスト駆動型開発4: 追加修正と実装〜
- Java はじめて28 〜JUnitでのテスト駆動型開発5: ファイル出力の実装〜
- Java はじめて29 〜JUnitでのテスト駆動型開発6: ファイル読み込みのテスト〜
- Java はじめて30 〜JUnitでのテスト駆動型開発7: テストクラスの実装方法〜
- Java はじめて31 〜JUnitでのテスト駆動型開発8: 処理をつなげたテスト〜
関連ページ一覧
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リポジトリからクローン〜
JavaFX関連ページ
- Eclipse SceneBuilderを追加する
- JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
- JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
- Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜
ステップアップ関連ページ一覧
- Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
- ステップアッププログラミング〜Java FxでHelloWorld解説〜
- Java StepUpPrograming〜JavaFX で四則計算〜
- Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
- Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
- Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
- Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
- Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine
JavaFX + ND4Jで機械学習準備
- JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
- JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
- Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜
オブジェクト指向関連ページ
- [オブジェクト指向の概念1〜OracleDocのチュートリアル1〜](https://zenryokuservice.com/wp/2019/10/301. /%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88%e6%8c%87%e5%90%91%e3%81%ae%e6%a6%82%e5%bf%b5-%e3%80%9coracledoc%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab%ef%bc%91/)
- オブジェクト指向の概念2〜クラスとは〜