Takunojiの日記

自分が勉強したプログラム技術メモ

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

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

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

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)*データ型は参照型です

詳細はこちらです。

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

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

・フィールド変数

・メソッド

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

   親に持ちます。

 

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

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

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

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

 

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

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

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

 

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

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

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

java.*パッケージのクラスです。
 
まずは標準入力を受けてそれをコンソールに出力する
プログラムをみてみましょう。

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)


でわでわ。。。

<問題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("入力違反です");


でわでわ