Java ミニゲーム ソース付き 〜RPGの戦闘シーンを作る2 in Console〜

今回は、入力〜戦闘を行い、次のターンへ進む処理を実装します。

前回は、以下の画面を表示するところまで実装しました。

作成したクラス一覧
GameMain
TextRpgGame
Monster
Player
CheckeerUtils

1ターンの戦闘

1ターン分の戦闘を行うのに、「攻撃力、防御力」のパラメータが必要になります。
具体的には下のようなイメージです。

プレーヤー
HP: XX
MP: XX
攻撃力:XX
防御力:XX

こんな感じです。これは当然モンスターにも必要になります。

ここで、ちょっと注意というか、気がつく(実装したから気がついた)のが、PlayerクラスとMonsterクラスの実装が「ほぼ同じ」だということです。
PlayerクラスとMonsterクラスの違いはクラス名くらいなのです。
なので、このPayerクラスとMonsterクラスの同じような処理はまとめてしまいましょう!

クラスの処理をまとめる

まとめる方法は色々とありますが、今回は「スーパークラス(親クラス)」を使用します。
イメージは下のような感じです。

上のような図はUMLのクラス図と言います。
UMLに関しては他の記事に記載しているので。。。

  1. UMLツール 〜Star UMLを使う〜
  2. UMLツール Star 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

<処理内容>

  1. メインメソッド(ThreadMain)から処理を起動
  2. 主軸(メイン)になるスレッド(Thread1Cls)と付随するスレッド(Thread2Cls)を起動
  3. 主軸(メイン)になるスレッド(Thread1Cls)で以下の処理を行う
    • ”Thread1Cls: 処理を開始します"を表示
    • 入力受付、入力値の表示
    • 3秒待機(出力には「5秒」とあるが実装ミス)
  4. 付随するスレッド(Thread2Cls)で以下の処理を行う
    • 3秒待機(出力には「5秒」とあるが実装ミス)
    • ”Thread2Cls: 処理を開始します"を表示
    • 入力受付、入力値の表示

でわでわ。。。

<!— BODY広告 —>



関連ページ

関連ページ一覧

Eclipse セットアップ

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. TensorFlow C++環境〜EclipseCDTをインストール〜
  3. Setup OpenGL with JavaJOGLを使う準備 for Eclipse
  4. Eclipse Meven 開発手順〜プロジェクトの作成〜
  5. Java OpenCV 環境セットアップ(on Mac)
  6. Eclipse SceneBuilderを追加する
  7. JavaFX SceneBuilder EclipseSceneBuilder連携~

Java Basic一覧

  1. Java Basic Level 1 〜Hello Java〜
  2. Java Basic Level2 〜Arithmetic Calculate〜
  3. Java Basic Level3 〜About String class〜
  4. Java Basic Level 4〜Boolean〜
  5. Java Basic Level 5〜If Statement〜
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 〜Traning of If statement〜
  8. Java Basic Level8 〜How to use for statement〜
  9. Java Basic Level 8.5 〜Array〜
  10. Java Basic Level 9〜Training of for statement〜
  11. Java Basic Level 10 〜While statement 〜
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2〜
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1〜
  17. Java Basic JUnit 〜テストスイートの作り方〜

Git関連

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

JavaFX関連ページ

  1. Eclipse SceneBuilderを追加する
  2. JavaFX SceneBuilder 〜EclipseとSceneBuilder連携~
  3. JavaFX SceneBuilder〜ボタンにメソッドを割り当てるワンポイント〜
  4. Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

ステップアップ関連ページ一覧

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine

JavaFX + ND4Jで機械学習準備

  1. JavaFX + ND4J〜数学への挑戦1:ND4Jのインストール〜
  2. JavaFX + ND4J〜数学への挑戦2: 行列の計算〜
  3. Java + ND4J 〜数学への挑戦3: ベクトル(配列)の作成方法〜

オブジェクト指向関連ページ

  1. [オブジェクト指向の概念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. オブジェクト指向の概念2〜クラスとは〜

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す