Java プロコンゲーム 〜見た目の作成(SceneBuilderの使用)〜

今回からは、プロコンゲーム(プログラミングコンテスト向けゲーム)の作成を始めようと思います。

前回作成した、設計(UMLのユースケース図)より順番に作成して行きます。

1.バッチをダブルクリックする

「1.バッチをダブルクリックする」の部分に関しては、作成したプログラムを起動するためのバッチ。。。

Windowsの場合は、「〜.bat」でMacやLinuxの場合は「〜.sh」というファイルで作成したプログラム(JARファイル)を起動するものなので作成するのは
最後になります。

プレーヤ受付画面

早速、プレーヤ受付画面の作成を始めます。
そして、設計するのにはUMLの「クラス図」を使用します。
細かい書き方などは下のリンク先に記載しています。

  1. UML 世界を作る 〜RPGでの世界を作る場合〜
  2. UMLの書き方(読み方)〜概要とクラス図〜
  3. UMLツール Star UML〜ユースケース図を書いて見た〜
  4. UMLツール 〜Star UMLを使う〜

そして、作成したクラス図は下のようなものです。

起動するメインクラスは、ProconServerクラスです。
そして、このクラスはJavaFXのパッケージにあるjavafx.application.Applicationを継承して作成します。
ここで、上のクラスを継承して実装することにより、画面表示を行うための細かい処理(Xサーバーへのアクセス及び、描画処理)を自分で作成しなくてよくなります。

つまり、作成するアプリに集中できるわけです。
その代わり、このフレームワークの使用方法を理解する必要があります。「JavaFXの〜」にあるリンクからOracleのドキュメントページに遷移できます。

自分の作成した記事は以下になります。
初心者でもわかる。。。というより作って動かして。。。とやってみるのが一番なのでその手順と実装サンプル、動かしてみたときのイメージを記載しています。

  1. JavaFX チュートリアル〜今度こそ、初めてでも大丈夫:Label〜
  2. JavaFX チュートリアル〜今度こそ、初めてでも大丈夫2:Label〜
  3. JavaFX チュートリアル〜今度こそ、初めてでも大丈夫3:Button〜

本題: 受付画面作成

本題に入ります。今回作成するのは、プロコンゲーム(プロコンサーバー)のはじめの画面、プレーヤ受付画面を作成します。
と言っても、順序立ててやって行きます。

とりあえずの見た目を作る

兎にも角にも、入力する部品(ボタンなど)がないと動かすのも、受け付けるのも設計の通りにはいかないので、ここから始めます。
俗にいうモックの作成です。

そして、作成するのに使用するのはEclipseを使用しますのでプロジェクトの作成から入ります。

  1. プロジェクトエクスプローラーを右クリックします。
  2. JavaFXプロジェクトを作成します。
  3. プロジェクト名をつけます。使用するJDKは1.8です。JShellとか使用する予定がないので。。。

作成したプロジェクトは下のような感じです。

以前追加した、シーンビルダーというプラグインが入っているので、使用します。下は操作したときの動画です。今回作成するものではありませんので。。。

そして、作成したものは、下のような見た目です。

作成したときの動画は以下になります。途中で落ちましたが(笑)とりあえずは、使用するPCのスペックでメモリ不足(だと思う)により落ちる可能性があるので、File -> Save Asなどで時々保存すると良いと思います。

今回作成したのは、プレーヤーの受付部分を1行だけ作成しました。とりあえずはプレーヤー1人の受付を実装し、うまくいくのなら他ものもの同様に作成する。。。そんな感じで行こうと思います。

今回はここら辺で。。。
でわでわ。。。

関連ページ

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 4Boolean
  5. Java Basic Level 5If 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 9Training 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 〜テストスイートの作り方〜


Java プロコンゲーム 〜設計2画面の入力フロー〜

今回からは、プロコンゲーム(プログラミングコンテスト向けゲーム)の作成を始めようと思います。

今までに。テキストRPGを作成しようと色々と調査してきましたが、どうしても自然言語処理が必要になるため一時中止にしようと思います。
しかし、今までやったことは無駄にしません、RPG風に作成します。

設計2:受付処理

参考にするアプリケーションはU-16プログラミングコンテストです。これと同様に以下のような手順でプレーヤの参加を受付ます。

  1. 画面を開き、ゲームに参加するプレーヤーの使用するポート番号と表示するIMGを画面上に表示する
  2. 参加するプレーヤーの人数が確定したらスタートボタンでゲームを開始する
  3. ゲームのマップを表示する
  4. プレーヤーの配置を行う
  5. タイマーを開始して制限ターン数を表示、カウントダウンする

まずは、Map描画

今回作成するマップはダンジョンRPGをイメージにしているので通行できない部分(迷路のような)、とか罠とか、アイディアはつきませんが、マップの難易度(レベル)を設けて、それぞれの難易度でマップの生成を行うような実装を考えております。

JavaFX

画面の表示処理にはJavaFXを使用しますので、基本的な書き方はこちらの記事を参考にしてください。
早速、JavaFXの実装に入ります。

Map作成

実装したコードでは下のように表示されました。
以前作成したコードをちょいといじって動かしました。

ポイントになるコードは下のように実装しました。

/**
 * Canvasに背景を描画する
 * @param vBox Canvasを追加する領域
 */
public void createBackGround(VBox vBox) {
    String lightGrass = "grass_light.png";
    String deepGrass = "grass_deep.png";
    String soilBasic = "soil_basic.png";
    GridPane grid = new GridPane();

    for (int j = 1; j < 5; j++) {
        for (int i = 1; i <= 5; i++) {
            grid.add(createImageLbl(lightGrass), j, i);
        }
    }

    vBox.getChildren().add(grid);
}

単純に5x5マスにイメージファイル(ラベル)を表示しているだけです。この要領でゲームのマップを作成しようと思います。
ここで、問題が1つあります。マップにより難易度、を設けるので、その難易度とマップの内容を関連付けるのにどのようなロジックで行うか?ここがポイントになります。

ちょいと頭をひねります。。。

UMLについて

以前に下のようなことを記事にしました。

  1. UML 世界を作る 〜RPGでの世界を作る場合〜
  2. UMLの書き方(読み方)〜概要とクラス図〜
  3. UMLツール Star UML〜ユースケース図を書いて見た〜
  4. UMLツール 〜Star UMLを使う〜

今回はここら辺で。。。
でわでわ。。。

関連ページ

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 4Boolean
  5. Java Basic Level 5If 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 9Training 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 〜テストスイートの作り方〜


Java プロコンゲーム 〜プログラミングコンテスト向けゲーム〜

今回からは、プロコンゲーム(プログラミングコンテスト向けゲーム)の作成を始めようと思います。

今までに。テキストRPGを作成しようと色々と調査してきましたが、どうしても自然言語処理が必要になるため一時中止にしようと思います。
しかし、今までやったことは無駄にしません、RPG風に作成します。

設計から

設計といえばUMLを使用します。
まずは、ゲームで実現したい動きのイメージを作成します。ここら辺を考えるのに時間がかかりました(笑)。

実現するイメージから入る

起業するにも、夢を実現するにも、まずは実現することを具体化します。
早い話が、以下のようなことです。

実際にどのような形でアプリ(事業 or 夢)を動かす(実現、収益を出す...etc)か?

そして、そのイメージを作るためにUMLが使えるので使用すると言うわけです。

ユースケース図

まずは、全体の流れとしてユースケース図を作成します。参考にするのは、「U-16プログラミングコンテスト」です。

自分のイメージとしては下のような形です。

以前に下のようなことを記事にしました。

  1. UML 世界を作る 〜RPGでの世界を作る場合〜
  2. UMLの書き方(読み方)〜概要とクラス図〜
  3. UMLツール Star UML〜ユースケース図を書いて見た〜
  4. UMLツール 〜Star UMLを使う〜

キーポイント

仮にも、プログラミングコンテストなので、教育的な要素が必要になります。と言うか。。。「ぶっこみたい」と思っています。

現状では以下のようなところが決まっています。

  1. プログラムを組んで動かすこと。
  2. 物事を実現するための順序を考えること

これだけです。。。

今後増えていくと思うのですが、それは次回以降に。。。

でわでわ。。。

関連ページ

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 4Boolean
  5. Java Basic Level 5If 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 9Training 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 〜テストスイートの作り方〜


UML 世界を作る 〜RPGでの世界を作る場合〜

現在(2020-03-15)自分で作成しているものになりますが、テキストRPGを作成しようとしています。Java言語を使用しています。

プログラム作成(アプリ作成)である程度の規模になった場合は、設計をしてからでないと収集がつかなくなります。
違う見方をすると「面白いもの」を作ろうとしたら「設計」が必要になるということです。

RPGの世界を作る

「RPGの世界」と言ってもいろんな意味があるので具体的に、小説や脚本を作るレベルでの「世界」を作ろうということです。

世界の定義

世界、小説を作る側からすると「プロット」というらしいです。漫画や、脚本でも同様らしいです。この情報は人から聞いたものなのでこのように記載しています。

どんな世界を描くか?

自分は「プログラマ」ではないので、人(作家など)がプロットを作ることを考えて、それをプログラマ的にアプローチしていきます。

どんな風に?

ズバリ、プロットを作る工程をシステム化します。これができたらかなりすごいことになると思いますが、理想通りにいかない想定です。
理由は、どうしても、「予測」する部分が発生するので、いわゆる人工知能(AI)処理が必要になるためです。

では、どうやるか?いわゆるフレームワークを作成する想定です。つまり、1つの(RPGで使用する)ストーリーを作成するための手順を作り、必要な情報(作成するストーリーのオリジナルな部分)を入力(作成)すれば、ストーリーとして使用できるレベルにまとめるツールとして作成するという意味です。手順としては以下の通りです。

  1. 物語を構成する項目を設定していきます。(キャラクター、世界(観)、文書のストーリー)
  2. 物語の世界を描くために、世界の始まり(創世神話)を作成する、必要なければこれを入力しない(NULL)に設定する
  3. 物語の世界に存在する世界を一覧します。(書き出します)
  4. 文書によるストーリー、キャラクターを作成します。

上記の内容を作成すると、自然と物語が作成できるというものです。
ぶっちゃけた話、フレームワークまで行きませんが、執筆する作品を部分的に作成していても、1つにまとめることが可能であろうと思っています。

できるかどうかはわかりません

しかし

文章作成のシロート目線からして、骨組みだけでもある程度の形になるのであれば、十二分に作品として作成することが可能になるはずです。
つまり、より多くの人のイメージや、想像した世界観を伝えやすい形にできるのではなかろうか?と考えています。

UMLを作る

結果から記載します。

上記の図が、クラス図になります。
ここの図には、クラス名とそれに対するプロパティ(世界には国がある)を表しています。世界のクラス図です。

具体的に、上のクラス図は文章に置き換えると下のようになります。

1. 世界には神話がある
2. 世界には国がある
3. 世界には自然がある

実際に世界にはもっとたくさんのものがあり、存在しています。しかし、これらを全部クラス図に落とし込むのは至難の技です、なので階層的に表現して行きます。

・世界→国→町
・自然→気候→地形(山、川など)

クラスで表現するもの(事)は上のように階層的に表現して行くと、1つの場所に描く内容が少なくて済みます。そして、それぞれ階層化、カプセル化するので一部を変更しても、他に影響がないように修正することができます。
これが「オブジェクト指向の良いところ」になります。

UML作成関連

UMLの書き方
UMLツール Star UML〜ユースケース図を書いて見た〜
UMLツール 〜Star UMLを使う〜

Java テキストRPG〜情報を揃える WikipediaAPI〜

WikipediaAPIを使用して自分の欲しい情報をまとめたいと思います。
他にもたくさんあるようです。
FaceBookAPIとか興味深いですね。参考サイトはこちらです。

WebAPIを使う

WebAPIを使用するということは、早い話が「ウェブサーバーで提供している情報を取得する」ということです。国のAPIとか、地域の。。。いわゆる「ビッグデータ」がこれに相当します。
このWebAPIを使用して取得した情報を元に自分で使用するための情報を揃えようという分けです。

とりあえずは、WebAPIを叩いてみないことには始まらないのでとりあえず叩きます。
コマンドは以下の通りです。参照するページはこちらです。
curl http://wikipedia.simpleapi.net/api?keyword="武器"

そして、パラメータは以下になります。

keyword : キーワード。エイリアスとして、qも指定可能
output : 出力方式(xml,rss,json,html,javascript,php,tsvを指定可能。デフォルトはxml)
callback : 出力形式がJSONP時の名称を指定可能
lang : 現在未実装。現在は日本語(ja)のみ。
search : 現在未実装につき1のみ。(0.その特定キーワードのみを取り出す、1.前方一致、2.後方一致、3.前後方一致、4.FULLTEXT)

上のコマンドではパラメータに「武器」を設定しています。
出力内容は一部ですが、下に記載します。ちなみにXMLで取得しています。デフォルトがXMLでの取得になるようです。

<results>
<result>
    <language>ja</language>
    <id>401062</id>
    <url>http://wikipedia.simpleapi.net/ja/401062/</url>
    <title>武器等製造法</title>
    <body>武器等製造法(ぶきとうせいぞうほう、昭和28年8月1日法律第145号)は、日本の法律。最終改正は平成12年5月31日法律第91号。 武器の製造の事業の事業活動を調整することによつて、国民経済の健全な運行に寄与するとともに、武器及び猟銃等の製造、販売その他の取扱を規制することによつて、公共の安全を確保することを目的としている。 武器、猟銃等の製造(改造、修理も含む)については経済産業省の所管となる。 定義 この法律では「武器」「猟銃等」について以下のように定義している。 武器銃砲 銃砲弾 爆発物 爆発物を投下し、又は発射する機械器具 ロケット弾発射機 爆雷投射機 魚雷発射管 爆弾投下器 「銃砲」「銃砲弾」「爆発物」「爆発物投下機械器具」「爆発物発射機械器具」に類する機械器具 銃剣 火炎発射機 銃砲を搭載する構造を有する装甲車両であって、無限軌道装置により走行するもの 「銃砲」「銃砲弾」「爆発物」「爆発物投下機械器具」「爆発物発射機械器具」「これら類する機械器具」に使用される部品 銃砲の部品 銃身 拳銃の機関部体 拳銃の回転弾倉 拳銃のスライド 銃架 砲身 砲架 銃砲弾の部品 銃弾の弾丸 火薬類が入っていない信管 砲弾の弾体 薬莢 爆発物の部品 火薬類が入っていない信管 ロケット弾の弾体 手榴弾の弾体 地雷の外殻 爆雷の外殻 機雷の本体の外殻 魚雷の気室 爆弾の弾体猟銃等猟銃 捕鯨砲 銛銃 屠殺銃 空気銃 構成 第1章 - 総則(第1条~第2条) 第2章 - 武器(第3条~第16条) 第3章 - 猟銃等(第17条~第20条) 第4章 - 雑則(第21条~第30条) 第5章 - 罰則(第31条~第35条) 附則 資格 武器製造事業者 猟銃等製造事業者 関連項目 銃砲刀剣類所持等取締法 行政 外部リンク 武器等製造法全文。</body>
    <length>1393</length>
    <redirect>0</redirect>
    <strict>0</strict>
    <datetime>2015-06-11T21:33:58+09:00</datetime>
</result>
<result>
    <language>ja</language>
    <id>1970503</id>
    <url>http://wikipedia.simpleapi.net/ja/1970503/</url>
    <title>武器なき斗い</title>
    <body>『武器なき斗い』(ぶきなきたたかい)は、1960年(昭和35年)に大東映画が製作・配給した日本映画である。 概略 原作は、1959年に中央公論社から出版された西口克己の小説『山宣』である。山宣とは、右翼の凶刃に倒れた労働農民党の代議士・山本宣治のこと。映画化は、西口克己の講演会の後で、大阪市電の勤務者が映画化を提案したのを契機に企画され、製作資金の募金は大阪市交通局の労組、私鉄の労組、大阪総評傘下の労働者が呼びかけて、始まった。没後30周年を記念する映画として、関西在住の3000人が発起人になり、「山宣映画化実行委員会」を結成し、700万円のカンパが集められた。撮影にあたっては、延べ3700人にのぼるエキストラが動員された。 あらすじ 京都府宇治市の料亭花やしきの経営者夫婦のもとに生まれた山本宣治は、同志社大学の講師を務め、性教育の啓発や産児制限運動に関わっていた。やがて労働農民党の京都府連合会委員長となり、第1回普通選挙で当選して代議士となる。治安維持法改正に反対し、国会での質疑を準備している矢先、山本が泊まる東京の旅館に見知らぬ男が訪ねてくる。</body>
    <length>1387</length>
    <redirect>0</redirect>
    <strict>0</strict>
    <datetime>2016-04-23T14:35:07+09:00</datetime>
</result>
</results>

こんな感じで取得できます。しかし、XMLでの取得はできるものの欲しい部分の取得がうまくいきません。。。他ものを探すことにします。

しかし、ちょうど良いものが見つからず。。。
人文学オープンデータ共同利用センター等ものがありましたが、うーむ一歩踏み出せない感じです。

HTMLを取得

仕方ないので、HTMLを取得する方法に切り替えます。具体的には下のようなコマンドを叩くとHTMLを取得することができます。
この取得したものをプログラムで編集して必要なものを取得できるようにしようというものを考えます。
https://ja.wikipedia.org/wiki/%E6%AD%A6%E5%99%A8

Javaの出番

ここでJavaの出番になります。取得したデータを自分の使いやすいように、処理を行う必要があります。
しかし、どんなデータを取得するか?を決めないと実装も何もないです。。。
それでもとりあえずは実装してみました。
リスト形式(ULタグ)のテキストを取得します。ソースはGithubにアップしてあります。

public String execute() {
    String targetUrl = "https://ja.wikipedia.org/wiki/%E6%AD%A6%E5%99%A8";
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = null;
    try {
        builder = factory.newDocumentBuilder();
    } catch (ParserConfigurationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        URL urlCls = new URL(targetUrl);
        urlCls.openConnection();
        InputStream inp = (InputStream) urlCls.getContent();
        Document html = builder.parse(inp);
        NodeList nodes = html.getElementsByTagName("ul");
        for (int i = 0; i < nodes.getLength(); i++) {
            loopPrint(nodes.item(i).getChildNodes());
        }

    } catch(MalformedURLException e) {
        e.printStackTrace();
    } catch(IOException ie) {
        ie.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return "";
}

今回の実装では、Jsoupを使用せず、w3cのDOMオブジェクトを使用しました。
取得したHTMLの解析などを行うならJsoupを使用した方が良いです。。。

でわでわ。。。



Java オブジェクト指向 〜体系化の方法〜

体系化とオブジェクト指向

今回は、「体系化」に関して記載したいと思います。

物事や自分の描いたイメージをまとめて体系化すると学んだことなどをより広く、いろんな状況で使用することができると思います。

今までに「Java オブジェクト指向〜」と記事を書いてきました。

  1. UMLの書き方
  2. テキストRPGキャラクター作成(戦士)
  3. テキストRPG NPCを作る
  4. テキストRPG NPCを作る2
  5. テキストRPG PlayerCharactorを作る
  6. テキストRPG Bodyクラスを作る
  7. テキストRPGクラスを実装する(ハコのみ)

ここまでで、テキストRPGを作るための登場人物(クラス)が一覧されたような形になります。あやふやな言い方をしているのは、今後クラス(登場人物)が増える可能性があるからです。(多分増える(笑))

体系化の準備

とりあえず「体系化」に関して触れましたが、まずは「体系化」って何?というところから考えていきたいと思います。

体系化は、体系に接尾詞の化がついた言葉です。 体系とは、個々のものを秩序のもと統一した組織にした全体や、矛盾のないかたまりにしたものを意味します。 また、ビジネスでも使われる「知識の体系化」とは、それぞれの知識を関連づけてまとめることをいいます。

参考サイト

体系化は上記のような「概念」です。早い話が「まとめる」という意味になりますが、「まとめる」だけであればこの言葉を使用する意味がありません。
もう少し深く調べてみると。。。

体系化の手法というのがありました。
大まかに以下のような手順で行うようです。

 1)意見の記述化
 2)グループ化
 3)グループ間の関連整備
 4)シナリオ形成

調べていくと「UMLでいいんぢゃね?」と思いました。

体系化を行う

自分なりの方法になってしまいますが、調べてみたところ以下のような手順になりました。

  1. 必要な情報を揃える(資料、ノートetc)
  2. 必要な情報をグループ化、カテゴリ分け
  3. カテゴリの一覧を作成する
  4. 各カテゴリ別に一度作成したグループの中身を再度振り分ける
  5. グループ(カテゴリ)間の関係を図にする
  6. 必要であれば、作成した図を説明するための文章を作る

上記のような方法になります。UML作る感じです(笑)
テキストRPGを作るために、以下の事柄を「体系化」しようと思います。

A. 世界の宗教
B. 世界の武器
C. 世界の武術
D. 世界の魔法(呪術)
<オプション>
E. 世界の建築
F. 世界の衣服

次回は、世界の宗教について、この宗教というのはいかがわしいものではなく、我々日本人が正月には初詣を行うといったような、文化レベルでの宗教になります。

でわでわ。。。



Java オブジェクト指向 〜テキストRPGクラスを実装する(ハコのみ)〜

前回作成したUMLを元に、クラスを実装します。

実際、クラスの関係を作成しただけで中身は決まっていません。
しかし、クラスの関係を作るのが先です。上のリンクにはUMLで作成した大まかなクラス関係図があります。
詳細に関して上のリンク先を見てもらえばわかると思います。

クラスを実装

UMLで示したように、Playerクラスが一番上のクラス(基底クラス)になります。なので下のような実装になります。ソースはGithubにコミットしてあるのでそちらを参照ください。
上のリンク先には、パッケージのルートが関連づけられています。
そして、Playerクラスがあります。

Playerクラス

このクラス(Player)は、ゲームのプレーヤー(PlayerCharactor)が操作するキャラクター、PCが操作するプレーヤー(NoPlayerCharactor)の親クラスになります。

このような形で「継承関係」を作ってやると色々と便利なのです。

Playerクラスには、PalyerCharactorとNoPlayerCharactorに共通する、つまりゲームに登場する全てのキャラクターに共通するもの(HP、MPなど)を定義します。(コードにします。)
しかし、現状では、全てに共通する部分のみが決まっているだけなので上の2クラスは未実装です。(中身がありません)

戦士クラス

戦士クラスは、PlayerCharactorであり、その中にある「戦士」という職業(役)を担うクラスです。
なので、操作ができる必要もありますが、ゲームをプレイする我々には「どんなキャラクターなの?」時になります。
なので、その部分を表現するための工夫として、戦士クラスではなく一番親のクラス(Player)に下のようなプロパティを実装しました。

/** 精神を表す */
protected Spirit sprit;
/** 肉体を表す */
protected Body body;
/** キャラクターの役職(王様etc...) */
protected Role role;

上の3つはクラスですが、「クラスにクラスをもたせてはいけない」というルールはないのでこれはこれで良いのです。UMLで書くと下のようになります。

PlayerCharactorクラスに定義していますが、よくよく考えたら、全てのプレーヤー(PlayerCharactorとNoPlayerCharactor)に必要な情報だと思ったのでPlayerクラスに移動しました。

オブジェクト指向の良いところ

上に記載したように、オブジェクトとして捉えるところに「オブジェクト指向」の良いところがあります。
間違って(やっていくうちに)自分で定義したものが、「不適切だと思ったら、変更しやすい」というところです。しかし、これを変更しづらく作ることもできます。
なので「プロパティ(フィールド変数)」をカプセル化してやります。
フィールド変数とGetter, Setterを使用する下のような実装にするということです。

/** 肉体を表す */
protected Body body;

/**
 * @return the body
 */
public Body getBody() {
    return body;
}
/**
 * @param body the body to set
 */
public void setBody(Body body) {
    this.body = body;
}

これは、手で実装すると面倒ですが、EclipseなどのIDEを使用してやるとクリック一発で実装できます。自動生成というやつです(笑)

関連ページ

UMLの書き方
UMLツール Star UML〜ユースケース図を書いて見た〜
UMLツール 〜Star UMLを使う〜

今日は、ここまでにしておきます。



Java オブジェクト指向5 〜テキストRPG Bodyクラスを作る〜

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

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

ここでいう基本は。。。

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

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

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

RPGキャラクター

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

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

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

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

前回は、PC(PlayerCharactor)を作成する方向で進んで、戦士を作成(中途半端ですが)できたので、詳細部に突入いたします、つまりBody(体)を作成します。

Bodyを作る

PlayerCharactorクラスのフィールド(プロパティ)にBodyクラスを定義しました。

Bodyクラスは、「体」を表し、装備する武器、防具を設定するためのクラスです。また、ステータス(強さ、体調)や精神を持っています。
「精神」に関しては、科学的な証明ができない認識なので下の格言に従い、Bodyクラスで保持することにしました。

健全なる精神は健全な肉体に宿る

具体的に、Bodyクラスは以下のプロパティを持っているとします。

  1. 頭(頭部につける装備をセットするスロット)
  2. 武器(武器装備用のスロット、両手を使用する武器を持った時は盾が装備できないなど判定した上で武器をセットできる)
  3. 補助武器(手で考えると聞き手の反対側、両手を使用しない時には盾を装備できる)
  4. 胴体(胴体、腹回りを示す。主に鎧などを装備するスロットとして使用する)
  5. あし(両足よう防具を装備するためのスロット)
  6. ステータス(体調、毒、病気、目くらましなど体調の状態を表す。また各職能の熟練度を表す。)
  7. 精神(霊などの実体を持たないキャラクターに関してはBody#isIntamgible=trueに設定する。
    また、神、上級悪魔など実体を持つ精神体はSprit#isEntity=trueに設定する。)

上のクラス図に「isIntagible」を追加しています。
英語の意味は「実体のない」ということなのですが、「実体がある」というフラグを持っているのもおかしいだろうと思い、このようなフラグを持つことにしました。
クラス図にすると下のようになります。

このような、設計部分で「どうあるべき?」というのを開発メンバーで議論できるととても面白いと思います。

とりあえずは

今回も、中途半端な感じですが、一旦ここで考えを止めます。
「中途半端」が続いていますが、これは世間でよくいう「アジャイル」とか「イテレーション開発」という開発方法です(現状は設計のみですが。。。)
最終的には「動かしてみないと話にならない」ということがあるので、「まずは動かす」ということを目標に作成しています。しかし、あまりにも的外れでは「設計」の意味がないので、「ある程度」→「中途半端な感じ」になっているわけです。

ちょっと言い訳臭かったですが。。。

次は何を考えるか?

次は、精神に関して考えます。精神は、みんな大好き「魔法、呪文、霊能力」という未知の領域に直結するものなので、工夫を凝らしていこうと思います。
それこそ、議論がしたいところです(笑)。
開発メンバー一人なので。。。(泣)

精神の定義

精神は、その人の性格、(心の)世界、自然(精霊や神など)とコンタクトを取るための「マナス」を持っている

こんな風に定義しても、性格〜マナスまで表現することができません(笑)
なので、工夫してみました。テキストRPGなので、ほぼ小説と同じように『「読者」に伝われば良い』というところに重きを置き。。。

  1. 「性格」→「信条」「信仰」「キャラクターの物語」
  2. 「(心の)世界」→「信条」「信仰」「キャラクターの物語」
  3. マナス」 → 考え中

上記のように表現し、ゲームのプレーヤーに想像してもらえるような情報を保持するようにしようと考えています。
そして、忘れてはいけないのが、魔法の類です。
これらのスキルを使用するためには、いろんな条件があると思いますが、それらの条件を満たす、もしくは満たしたことを示す「もの」を定義する必要があります。

「魔法の類」の定義について

精神に関してもそうですが、未知の領域なのでなんともし難いのですが、世の中は広いので「その類」の情報も(ネットに)落ちていました(笑)。

ここら辺に関しては、長くなってしまうのでこちらのページに記載しました。

そんなわけで、上のリンク先の情報(調査結果)を踏まえて「精神クラス」の定義をしていこうと思います。

今回も、中途半端ですが。。。
今回はここまでにしておきます。

でわでわ。。。

関連ページ

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 4Boolean
  5. Java Basic Level 5If 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 9Training 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 〜テストスイートの作り方〜

<ins class="adsbygoogle"
style="display:block"
data-ad-format="fluid"
data-ad-layout-key="-6t+ed+2i-1n-4w"
data-ad-client="ca-pub-7367785927150581"
data-ad-slot="3284986237">