Takunojiのプログラミング・プレイグラウンド(遊び場)

Javaプログラミングを基本にして、ゲーム作成に必要なことの調査結果、やったら面白そうなことなどを記載します。プログラミングのススメ的なことも記載します。プログラミングで楽しく遊ぶために色々と記載して行きます。

Java Basic ミニゲーム作成 〜画面の状態〜

イントロダクション

前回、タイトル画面の作成、表示をやりました。テキストのみを使ったアプリなので画面と言っても文字のみです。

ステータス管理

ステータスといっても、画面の話です。

用途としては、ステータスによって表示するテンプレートを切り替えます。

今回は、画面の状態(ステータス)の管理Objectの作成と各画面での操作切り替えを行うための処理フローの作成をやります。

 

「必要な技術」

インターフェースの作り方

抽象クラスの作り方 // 上と同じページです

Mapの使い方

 

 

初めに、タイトル画面の表示を行い

「開始」「コンテニュー」をそれぞれ選択
できる様にします。

なので、タイトル画面の管理Object

はコマンドの入力を受けて
対象のコマンドを実行する形を
作成する必要があります。
詳細はコードを見ていただきたく。。。

PracticeJava1/Step3_3.java at master · ZenryokuService/PracticeJava1 · GitHub

今までやってきたものを繋げてやってます。

そして、実装内容に関して以下にまとめました。

Java Basic ミニゲーム作成 〜Step3_2〜 – PGボックス

Java Basic Map インターフェース

ここ最近、テキストRPGの作成を始めました。

 

必要になる技術としては以下の通り

標準入出力

ファイル読み込み

while文の書き方

クラスの書き方

 

始めのタイトル表示までです。

 

ここから、オブジェクト指向な部分に入って行きます。

 

今回は、マップの使い方について

Mapはキーと値をセットにして保存〜取得を行うためのインターフェースです

実体(クラス)はHashMapを使用しました

 

インターフェースは以下の様に作ります

public interface Hoge {

     public abstract void foo();

}

なので、実体がありません。

じゃ、実体はなに?

public class Foo implements Hoge{

    public void foo() {

         System.out.print(“Hoge”);

    }

}

上の様にインターフェースをimplementsしたクラスが実体になります。

abstractがついたメソッドの事を抽象メソッドと呼びimplementsしたクラスでは必ず処理を書かないとなりません。

エラーが発生します。

 

詳細な内容はこちらをご覧ください

 

実体クラスをインターフェースに代入しています。

 

でわでわ

<問題> 
Mapインターフェースを使用して登録(put)した
データ(文字列)を1行でコンソールに出力するプログラムを作成してください。

ヒント:ラムダ式を使用するといけます。

 

<関連ページ>

  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〜
 

Java Basic ミニゲーム作〜タイトル表示〜

前回、テキストRPGの作成に入りました。大まかな処理をメソッド単位で区切り入力を受け付けて、「bye」と入力したらアプリが終了するものでした。

 

今回は、リソース→テキストファイルを読み込み「タイトル」を表示します。

外部ファイルを読み込む理由は

プログラムの修正をせずに出力するものを変更できます。

つまり、プログラムを書く人と文字でのデザインをする人と分業することが出来ます。

 

この仕組みは、単純にタイトルを出力するときにファイルを読み込み出力するだけなので難しくありません。

ファイルの読み込み方法はこちらです

 http://zenryokuservice.com/wp/2018/05/27/javadoc-読解-〜-filesクラス-〜/

 

 

ゲーム作成に関してはこちら

http://zenryokuservice.com/wp/2018/05/25/java-basic-ミニゲーム作成-〜step3_1〜/

 

 

Java テキストRPG作成 〜タイトルを表示する〜

前回、RPGの作成をどの様にやるかを(仕様を)記載しました。
そして、実装してみましたが。。。

画面のステータスをどの様に管理するか?が課題になっております。

とりあえず、現状のソースをアップします。

github.com

メインメソッド〜クラス生成と少し長いクラスになってしまいました。
メインメソッドで使用するメソッドは「static」がついてます。

RpgMainクラスのコンストラクターからメンバメソッドには「static」が
ついてません。

メインメソッドからstatic メソッド
init() => gameLoop() => terminated()を呼んでます。

メインメソッド内でゲームの概要部分の処理を行なっています。

今度は、メンバメソッドでゲームの表示、入力などの処理を実装しています。

現在、initでタイトル用のテキストファイルを読み「title.txt」
コンソールにタイトルを表示しています。

f:id:Takunoji:20180527215927p:plain

タイトルの表示までできたのですが、まぁ画面ステータスを
どの様に管理するか考え中です。

うーむどうしようか?

ちなみにファイルの読み込みは以下のページを参照してください。

JavaDoc 読解 〜 Filesクラス 〜 – PGボックス

 

<関連ページ>

  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〜
 

Java Basic ミニゲーム作成 〜Step3_1〜

前回は、コンソールに「bye」と入力すると終了する。シンプルなアプリを作りました。

 

今回は、このアプリを拡張してRPGに仕上げていきたいと思います。

 

まず、ストーリーとか考えないといけないのですが、ちょいと傍に置いておき…

自分の考えたもので失礼します。

 

<仕様>

1.タイトル画面が出る

2.スタート、コンテニューの選択

3.スタートを選択するとゲーム開始

 

まずはここまで、やろうと思います。

コンソールゲームなので、全部文字列で頑張ります。

<前提>

スマホ端末の一番小さいやつ

iPhone5sなどを想定して基準にする

画面サイズは半角文字が32文字分を

画面の範囲とする。

 

<用意するもの>

・タイトル画面用のテキストファイル

→文字列アートでタイトル画面を作成

・ゲームのイントロダクション(語り)

    用のテキストファイル

<基本設計>(外部設計とも言う)

1.リソースを読み込む(*.txt, *.properties)

2.ゲームループの作成

3.終了処理

 

<詳細設計>(本当はクラス図とか書く)

1.画面の状態管理オブジェクト作成

2.選択→決定の処理

3.イントロダクションの表示処理

 

まずはここまでやろうと思います。

<前提><用意するもの>はさておき…

<基本設計>から考えるとして

各処理をメソッドに割り当てます

1.リソース読み込み

2. 選択→文字入力で判定

3.ゲームのイントロダクション表示

 

以上の実装をやっていこうと思います。

 

そして、以前作ったゲームの流れのみ

を実装したものがあるのでそれを基盤

にしてやります。

※ソースは後からアップします

 

ゲームの流れは以下の順に処理します

1.init: リソース読み込み

          リソース管理Object

画面上に表示するタイトルやストーリー

をリソースとして管理します。

つまり、プログラムを修正せずに

タイトルやストーリーを修正できます

 

2. gameLoop: 入力〜ゲーム進行の処理

今回はタイトル画面での入力処理に

なります。

そして、ゲームの状態がタイトル→

ストーリーに変わりゲームを開始する

状態に変わります。

 

3.terminated: 終了処理”bye”と入力して

ゲームを終了します

 

まずはここまでやってみようと思います

 

<関連ページ>

  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〜
 

Java Basic ミニゲーム作成 〜ゲームサンプル(土台)〜

今迄やったことをまとめるのに

コンソールゲームを作ろうと思います。

 

お題はコンソールゲームです。

処理としては、

標準入力を無限ループして”bye”と

入力した時にアプリを終了する

というものです。

 

このアプリを基盤にして、コンソールゲームを作成します。

今回の実装は、単純に入力したものを「コマンド: XXXXX」と表示するものです。

ダウンロード〜実行までは下のページを参照してください。

Java Basic ミニゲーム作成 〜コンソールゲーム〜 – PGボックス

f:id:Takunoji:20180520133228p:plain

Macで実行した時のコンソール画面です。
ゲームアプリケーションでは、入力→表示
→次の入力と画面に表示させます。

中身としては上記の詳細ページに記載していますので
そちらを参照していただきたく。。。

こんな感じで、簡単な処理を作成したところで、
実際にどんなゲームにしようか?を考えて実装して。。。
とやっていこうと思います。

今回は、ゲーム自体の処理を実装しました。
起動するJarファイルはこちらです。

文字化けしたものが表示されたら

ここからダウンロードしてください

https://github.com/ZenryokuService/PracticeJava1/tree/master/PracticeJava1/jars

このファイルをダウンロードして、実行できます。
Windowsの場合は、コマンドプロンプトから
ダウンロードしたディレクトリまで移動、以下のコマンドを叩く
>java -jar ./CmdRpg.jar

これで起動できるはずです。

 

関連ページ一覧

〜サンプルその1〜

  1. Java Basic Swing〜オブジェクト指向〜
  2. Java Basic Swing Level 2〜オブジェクト指向2
  3. サンプル実装〜コンソールゲーム〜
  4. Java Basic インターフェース・抽象クラスの作り方
  5. Java Basic クラスとは〜Step2_1
  6. Java Basic JUnit 〜テストスイートの作り方〜

〜サンプルその2〜

環境構築

  1. Java Install Eclipse〜開発ツールのインストール〜
  2. Eclipse Meven 開発手順〜プロジェクトの作成〜
  3. Java OpenCV 環境セットアップ(on Mac)
  4. Eclipse SceneBuilderを追加する
  5. JavaFX SceneBuilder EclipseSceneBuilder連携~

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連携~

Git

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

JavaFXでハローワールド〜OpenCVまで

  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〜

 

 

Java Basic インターフェース 〜Step2_3〜

前回はリストについてやりました。

今回は、インターフェースについてやります。

結論から言うと、作ってみるのが一番なので、3種類のデータクラスをリストで表示するプログラムを作ります。

 

 <プレイヤークラス一覧> ※

勇者クラス(プレイヤー:ユーザーが操作する)

モブキャラクラス(ノンプレイヤーキャラクタ)

モンスタークラス(ノンプレイヤーキャラクタ)

 

本当はクラスファイル1つにつき1クラスで作成するのが
Javaの標準的な実装ルールですが。
今回は、インナークラスを使用してみます。
public class Sample {
      private class InnerClass {

           // フィールド・メソッド

    }

    public String fieldStr;
    public void sampleMethod() { XXXXX };

}

上記の様に記述します。 
そして、Playerインターフェースを作成(インナーインターフェース?)
してInnerClassにimplementsします。日本語では「実装」と呼びます。

ブログなのでちゃんとコードが書けないため
詳細の方を参照してください。

※下の方にリンク貼りました

上記の様にインターフェース「Player」を使用して
勇者クラスを作成しています。
勇者クラスには「攻撃」と「防御」メソッドが実装されています。
この2つのメソッドは、インターフェース「Player」に
抽象メソッドとして「攻撃」「防御」が定義されていますが
インターフェースのメソッドには中身を書きません。
public interface Player {
     /** 攻撃 */
     public atack();
}
上の様に定義します。いつも記述している「{」「}」がありません。
これは実装(implements)するクラスで中身を書くために(だと思う)
その様な仕様になっています。(ビルドエラーになります。)

実際の使い方は詳細を参照して見てください。

Java Basic インターフェース 〜Step2_3 〜 – PGボックス


でわでわ

<問題1>
詳細ページにあるクラス、インナークラスを参考に
防御処理を実装してください。
ただしサンプルコードは防御処理をメインメソッドで
実行していません。

<関連ページ>

  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〜
 

Java Basic API リスト 〜Step2_2〜

前回はクラスと標準入出力についてやりました。

今回から、標準入出力で使用した Java

で提供されているクラス群→JavaAPIに関してやっていきます。

 ※リンクはJava8のものになります。

よく使うのでListについてやろうと思います。

 

java.util.Listがクラスのフルネームになります。これを完全修飾名、完全クラス名などと呼びます。

完全修飾名は今後やるDI(Dependency Injection)で使用するので頭の片隅に置いておいてください。

 

そして、Listはインターフェースクラスです。これからやるポリモーフィズムの基礎となるモノですが普通のクラスを理解する方が先です(笑)

今は、よくわからんがリストクラスはListとして使用出来るんだな!って認識でおっけ🌟

詳細は下のページに記載します。

Java Basic API Listの使い方 〜Step2_2〜 – PGボックス

使い方は以下の様にやります。

List list = new ArrayList();

処理としては、ArrayListインスタンスを生成してList型の変数に代入してます。これは、ArrayListクラスの定義を見ればわかるのですがいちいち全クラス見てられないので、JavaDoc(Java APIの事)を利用します。

そこには、

「〜クラスを継承して〜」とか

「〜インターフェースを実装〜」など

書いてあります。

前回出てきた「親」に当たるのが

「〜を継承する」の部分です。

「〜実装する」はインターフェースを

implements している事を指します。

ここに関しては別個にやります。

 

そして、こっからがリストの扱いです。

以前扱った配列をラップ(クラスに)して便利にしたものです。

ArrayList<変数の型> list = new ArrayList<>();

list.add(変数);  // リストに追加

変数list.get(0); // リストから取得

の様に使います。

詳細は下のページにて…

Java Basic API Listの使い方 〜Step2_2〜 – PGボックス

でわでわ

 

<問題1>

 リストを使用して十二支の名前を表示するプログラムを作ってください。

ただし、ループを使用すること

【追伸】
開発環境のセットアップはこちらを参照ください。

Java 開発ツールのインストール – PGボックス

Java Basic クラスとは InputSreamReader 〜Step2_1〜

前回で基礎文法は大体理解しました。

今回はJavaのクラスについてやります

 

クラス(class)とは以下のものを親に持ったクラスです。

オブジェクト(Object)クラス、データ型は参照型です。→ つまりは「クラス」Objectクラスの子クラスという事。

具体的には、String, Integer, Double ...などの既に用意されているクラスや、自分で作ったHogeクラスなどは、書いてないけど、Objectクラスを継承しています。こういう時には「暗黙的にObjectクラスを継承している」なんて書き方をする本が多いように思います。

内訳としては、コンパイラがそのように解釈して実行するからです。なので、自作クラスには作っていないメソッド「equals(), getClass() ...」などのメソッドが使用可能です。クラスの中に実装した時は、オーバーライドする事になります。

詳細はこちらです。

Java Basic クラスとは InputSreamReader〜Step2_1〜 – PGボックス

<クラスの持っているもの>

・フィールド変数

・メソッド

Javaの場合は全てObjectクラスを

   親に持ちます。

 

「親」という言葉は気にしないで下さい

「よくわからんがとにかく親がObjectクラスなんだな!」って認識でOK🌟

初めに作成したクラスにはフィールドなんて書いてないよ?と疑問に思うかもしれませんが親クラスが持っています。

 ここも「よくわからんがとにかく親が持っているんだな!」って認識でOK🌟

 

写経して、動かして、理解して…このステップを踏む事で使いこなすまでの時間が短くなります。(多分…)

 

クラス→オブジェクト指向の考え方は

時間かけてゆっくり理解してください。

変に理解すると、プログラムがつまらなくなってしまうかも?

 

というわけで、こっからが本題になります。

まず、既に提供されている

クラスを使うとこから始めます。

java.*パッケージのクラスです。

具体的には、java.lang.*(java.langから下のクラス全部の意味)や、java.util.*など、有名というかよく使うクラスから見ていきます。そして、コンソール出力と入力→標準入力、出力は色々と遊べるのでここから見ていこうと思います。
 
まずは標準入力を受けてそれをコンソールに出力する
プログラムをみてみましょう。

f:id:Takunoji:20180514183704p:plain

実はこのプログラムはバグがあって
5文字までしか入力が受け付けられません。

f:id:Takunoji:20180514183813p:plain

緑色が入力した文字です。
1〜6まで入力したのに
コンソールには5までしか表示されません。

これは、上のプログラムでbyte[] moji = new byte[5];
と配列の数を固定しているためです。

なので、入力した分だけの配列を用意しないといけません。
でも、入力した後に配列長を決定することはできないので。。。

じゃーどーするか?→InputSreamReaderを使用します。
Javaでは入力を受け取る処理が実装されていて自分で作らなくても
扱うことができます。標準入力の読み込みを行うためのクラス
それが「InputSreamReaderクラス」と「BufferedReaderクラス」です。

本当は、それ以外にも使用できますが。。。
ここではサンプルということで。。。

f:id:Takunoji:20180514194439p:plain

こんな感じで使用します。
java.ioパッケージはファイルの読み込みや出力も扱えます。
興味があれあばこちらをどうぞ

java.io (Java Platform SE 8)


でわでわ。。。

標準入力について補足

https://zenryokuservice.com/wp/2018/08/13/java-doc読解-〜system-in〜/

 

ミニゲームを作ってみた

https://zenryokuservice.com/wp/2018/05/20/java-basic-ミニゲーム作成-〜コンソールゲーム〜/


<問題1>
標準入力を受け取り、コンソールに出力する
プログラムを作成してください。

<問題2>
作成したクラスの構成を考えてイメージ
できれば「絵」にしてください。
【ヒント】
全てのクラスは「Objectクラス」を継承しています。
なので、
「Objectクラス」←「作成したクラス」となります。
そして作成したクラスにはフィールド変数がありますか?
メソッドは何がありますか?
というのを整理してみてください。

 

Java Basic try catch文 〜Step1_3_3〜

前回は、while文についてやりました。

今回はtry catch文についてやります

まず、try catch文ってなに?

って話ですが…一言で言うと

エラーハンドリング用の書き方です。

 

じゃ、エラーハンドリングって?

それは「このケースはエラーにしよう」

と決めた時、想定しない値が入った時

など色々ありますが、下に例を示します

(例)

ゲームを起動する時にインターネットに繋がらない時、この時はゲームを起動する事は出来ないのでエラーですよとユーザーに伝えてあげる必要があります。

プログラム的には…

ゲーム起動時にインターネットへアクセスを試みるがアクセスできない場合

この時に JavaはExceptionクラスもしくはErrorクラスを「投げて」来ます。

 

この「投げる」というのは後でやります

「throw」文の書き方から日本語ではこの様な呼び方になっています。

 

なので

try {

    //Excetionが投げられる可能性のある

    //処理

} catch (Exception e) {

    //エラーの時の処理(ハンドル)

}

の様に書きます。

上の例では「Exceptionクラス」をキャッチしています。
このクラスは、日本語では「例外クラス」と呼ばれ
想定外の事が起こった時に使用します。
詳細に関しては以下のページを参照してください。

Java Basic try catch文 〜Step1_3_3〜 – PGボックス

具体的には標準入力や外部のネットワークに接続する時
DBへアクセスする時など色々ありますが
「想定外の事象が起こり得る時」にこのクラスを使用します。
実際にはコードを描いてみるとわかりますが

例えば
標準入力を行う時に(起動した後にコンソールから入力)
実装する時に下のような書き方をしたとします。
byte[] b = new byte[5];
System.in.read(b);
System.out.println("入力したのは[" + new String(b) + "]ですね");
この時に赤字の部分では、標準入力からの入力を受けるとき
想定外の事象が起こり得ます。
それは、JavaAPIですでに実装されていて
「IOException」というクラスが投げられるように
処理が記載されています。
詳細は下のページに記載してます。

Java Basic try catch文 〜Step1_3_3〜 – PGボックス

細かい話は詳細部分で記載いたします。

<問題1>
上の例を参考にして、標準入力からの入力を
コンソールに出力するプログラムを作成してください。

<問題2>
標準入力からの例外(Exception)と入力の値により
投げられる例外を別々に定義して
それぞれの例外が投げられた時に別の文言を
コンソールに出力するプログラムを作成してください。
例:
System.in.reaf(inputByte);
String input = new String(inputByte);
// 入力の判定を行いエラー時は
throw new Exception("入力違反です");


でわでわ