Java オブジェクト指向2 〜テキストRPG NPCを作る〜

以前、テキストRPGを作成する方向でJavaの基本に関して記載しました。
しかし、学習順序を、ちょいと飛ばしてしまったように思い。追記する次第です。

今までにやってきたものは下の方にある、関連ページに記載しております。
まとめると、ミニゲームを作成する中でJavaの基本を理解していこうというものです。ちなみに「基本」と言ってもいろんな意味があるので、詳細はオブジェクト(クラス)を組み合わせてどんなものを作っていくか?を考えるための基本というところです。

ここでいう基本は。。。

クラスを作成して、クラスとクラスの関連をどのように作り、どのような形で動かしたら良いか?

を考えるための基本になります。
作成途中になりますが、イメージとしては下のような感じです。そしてこのような「絵」のことをUMLを呼びます。全世界共通語ですので、言葉が通じなくてもこのUMLでの会話であれば全世界で通じる言語です。

参考に「デザインパターンなどを調べてみるのも1つです。このデザインパターンというのは現代ではすでに常識(JavaAPIで実装済)なので、意識して使用することは少ないかもしれません。

注意点

Javaでは、必ずメインメソッドから処理が走ります。なので、メインメソッドをどの様に作るか?というのが問題になりそうですので、サンプルとして下のコードを記載しておきます。

メインメソッド、表示処理、計算処理と役割を分割してクラスを作成しています。

サンプル

public static void main(String[] args) {
		Games gameLogic = new TextRpgLogic();
		TextRpgGameEngine engine  = new TextRpgGameEngine(gameLogic);

		try {
			engine.start();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("想定外のエラーで終了します。:" + e.getMessage());
			System.exit(-1);
		}
	}

RPGキャラクター

RPGと言ってもいろんなRPGがあるのですが、ここではテキストRPG(TRPG)を考えていこうと思います。具体的には下のようなキャラクター(職業?)がいます。

  1. 勇者
  2. 戦士
  3. 僧侶
  4. 魔法使い
  5. 商人
  6. 遊び人
  7. 賢者

テキストRPGは文言のみでストーリー、ゲームを進行していきます。絵がないので、UI(ユーザーインターフェース)は人間の「想像力」になります。世界最高のGPU(グラフィック・プロセッシング・ユニット)を使用したゲームということになります(笑)。

「RPGのキャラクター」と一言で言ってもイメージがぼやけてしまうので、考える(言葉の)範囲を絞っていきます。RPGの中の「ドラゴンクエスト」を土台にして考えます。

前回は、戦士を作成する方向で進んできたのですが。まだ中途半端なところなのでその続きをやります。

NPCを作る

NPC(NonPlayerCharactor:プレーヤーが操作しないキャラクター)を作成していきます。
上画像(UML)に示したように、戦士は基本的なコマンドとHP, MPなどがあるだけで全然「戦士」っぽくありません。さしずめ、プレーヤーが使用するキャラクターと言った感じでしかありません。
しかし、使用するコマンドは戦士のものでなくてはならないのでUMLはこのままです。

次は何を考えるか?

ちょっと「戦士」からは遠ざかってしまうのですが、プレイヤーが操作するキャラクターとゲームに登場するプレーヤーが操作しないキャラクターについて考えてみます。つまりは以下のことについて考えます。

プレーヤーが操作する→ PlayerCharactor
プレーヤーが操作しない(ラスボスや町人) → NoPlayerCharactor

TRPGの世界では「PC」とか「NPC」と呼ばれるものです。

ポイント

以下のことを考えてそれを各クラスにまとめます。

  1. PlayerCharactorクラスは、戦士だけではなく、勇者〜遊び人までに共通すること
  2. NoPlayerCharactorクラスは魔王や敵キャラ、町人などに共通すること

まずは「プレーヤー」が「操作」を行わないNPCを考えていきます。
NPCと言っても、範囲が結構広いので無難なところを攻めます。最低限必要なHPなどはPlayerクラスで定義しています。この他にどんなことを描きたいでしょうか?

自分のアイディアになりますが、下のように作成しようと思います。

NoPlayerCharactor

このクラス(NPC)は、基本的にテレビゲームならばPC(プログラム)が、TRPGであれば、GM(ゲームマスター)が操作します。なのでプレーヤーが操作するように「想定外の操作」というものを考えなくて良いので先にNPCから作成していきます。

NPCの役目

ストーリーを進めていくために、必要になるのがNPCです。主人公だけでは話が進みません(笑)
そして、時々、仲間に加わるNPCもいます。なのでPlayerであることには変わりなく、また操作できるか否かの違いがあるだけです。おおきな差ですけど。。。

しかし、ここで重要なのは「どのように表現するか?」なので「役目」に重きを置き表現することにします。つまり、詳細な部分は「他のクラスでラップしてしまう」方法でごまかします(笑)。後々にそのクラスも作成しますのでご安心ください。
ちなみに、イメージは下のようになります。

NPCは話の進行を支配する

上記の通りに、話を進める上で「はなす」などの操作でイベントの発生などを実行しない限り話が進まないのです。なので、以下のようにNPCを作成して見ました。

public class NoPlayerCharactor extends Player {
   /** ストーリーのイベントクラス */
   private StoryEvent event;
   /** 実際に話す内容 */
   private String[] talk;
   /** 話しかけられる */
   public String[] beTalked() {
      return talk;
   }
   /** イベントクラスへ様々な通知を行う */
   private void callEvent() {
   }
}

中途半端ですが。。。

このように、作成するモノ(クラス)をイメージして、クラスとして表現する事で「このクラスはどのように動けば良いか?」に対する答えが見えてくると思います。

この記事にある内容で設計を進めると話が大きくなりすぎるので、仕様を変えて下のようなアプローチで開発しようと思います。

  1. Java ミニゲーム ソース付き 〜RPGの戦闘シーンを作るin Console〜
  2. Java ミニゲーム ソース付き 〜RPGの戦闘シーンを作る2 in Console〜
  3. Java ミニゲーム ソース付き 〜ここまでのまとめ〜
  4. Java ミニゲーム ソース付き 〜コンソールゲームをJavaFXに組み込む〜
  5. Java ミニゲーム ソース付き 〜テスト駆動開発:文言出力部品を作る〜
  6. Java ミニゲーム ソース付き 〜コンソールアプリからGUIアプリへ〜

設計中に「いつまでたっても開発に手がつかない。。。」というような状況になったら開発内容を限定して、今回はこの部分だけ作る。というような形で実装して行くと、成果物を残せつつ、次のステップに繋がる形で作業を区切る事が出来ます。

でわでわ。。。

関連ページ

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 〜テストスイートの作り方〜

投稿者:

takunoji

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

コメントを残す