ダンジョン探索プログラム - 萌えJava超入門
最終章 超入門まとめ

サンプルコードの概要

Sample24_01クラスをざっくり見てみましょう

目次

1. Sample24_01の重要な変数


Sample24_01 は、インスタンス化して使うクラスです。
以下の4つの値をカプセル化しています。


Sample24_01の重要な変数
変数説明
private int floor;現在の階
private int posX;現在位置のX座標
private int posY;現在位置のY座標
private int direction;現在向いている方向

これらの値と、値を変更するためのアクセスメソッドが
Sample24_01の主なメンバとなります。



2. 地図の配列


int[][][] map3D は、地図の情報を保持しています。
Sample24_01のインスタンス化の際に引数として与えています。
そのあとは map3D に変更を加えることができません。

intの3次元配列で、要素一つがマップの1マスを示しています。
int変数1つに、東西南北の壁の種類と、発生するイベントの種類を保有します。(後述)

え!?
整数1つに
そんなにたくさん?

地図の配列
変数説明
private int[][][] map3D;intの3次元配列
[階][X座標][Y座標]

map3D
  int[][][] map3D = {
          {//1st floor
{0x1001,0x1010,0x1010,0x1100,0x1001,0x1000,0x1000,0x1110,0x1101,0x61101},
{0x0101,0x1011,0x1110,0x0101,0x0011,0x0010,0x0110,0x1001,0x0110,0x0101},
{0x0011,0x1000,0x1010,0x0020,0x1010,0x1000,0x1010,0x0100,0x1111,0x0101},
{0x1101,0x0101,0x1001,0x2100,0x1101,0x0101,0x61101,0x0011,0x521210,0x0112},
{0x0111,0x0101,0x0011,0x0110,0x0101,0x0101,0x0211,0xa41102,0x1111,0x1101},
{0x1001,0x0010,0x1100,0x1001,0x0100,0x0201,0x451112,0x0201,0x1012,0x0100},
{0x0101,0x1101,0x0101,0x0011,0x0110,0x0101,0x1011,0x0010,0x1100,0x0101},
{0x220201,0x0102,0x0101,0x1011,0x1010,0x0110,0x1011,0x1110,0x0101,0x0101},
{0x0101,0x0111,0x0011,0x1010,0x351110,0xb31021,0x1010,0x1010,0x0110,0x0101},
{0x0011,0x1010,0x1010,0x151110,0x71011,0xc52110,0x451011,0x1010,0x1010,0x0110}
          },
          {//2nd floor
{0x351101,0x1011,0x1100,0x1001,0x1010,0x1010,0x1100,0x1011,0x1110,0x71101},
{0x0011,0x1100,0x0111,0x0101,0x1001,0x1100,0x0011,0x1010,0x521200,0x0112},
{0x1111,0x0001,0x1010,0x0100,0x0001,0x0010,0x1010,0x1100,0x0101,0x1101},
{0x1011,0x0110,0x1111,0x0101,0x0111,0x1101,0x71101,0x0111,0x0101,0x0101},
{0x1101,0x1001,0x1200,0x0002,0x1010,0x0100,0x0211,0xa41102,0x0101,0x0101},
{0x0201,0x0012,0x0110,0x0111,0x1111,0x0011,0x1010,0x0110,0x0101,0x0111},
{0x0011,0x1100,0x951121,0x1101,0x651121,0x1001,0x1000,0x1010,0x0010,0x1100},
{0x1101,0x0011,0x2020,0x0000,0x2020,0x0000,0x0100,0x1011,0x1110,0x0101},
{0x0011,0x1100,0x852111,0x0101,0x752111,0x0001,0x0010,0x1010,0x1010,0x0100},
{0x1111,0x0011,0x1010,0x0010,0x1010,0x0110,0x1011,0x1010,0x1110,0x0111}
          }
  };

  Sample24_01 mapper = new Sample24_01(map3D, 0, 1, 0);



発展として、インスタンスを生成する際に与える配列を変えると、
いろいろなダンジョンを探索できますね。
配列をファイルからロードするような設計も考えられます。



3. メッセージの配列


msgArrayは、ダンジョン内で表示されるメッセージを保持しています。
msgArray は、setMsgArrayメソッドで与えます。
メッセージを使わないマップの場合は、なくても構いません。

メッセージの配列
変数説明
private String[] msgArray;Stringの配列

nullの場合は何も表示しない。
インデックス「0」は
デフォルトとして
nullとしているぞ。
メッセージ
  String[] msgs = {
    null,// ← 0
    "ゴールはこの裏です。",
    "準備中。",
    "よくぞお越しくださいました。",
    "またのお越しをお待ちしております。",
    "非常階段",
    "大安吉日にございます。",
    "どうぞお気遣いなく。",
    "警備は万全にございます。",
    "眠ってはなりませぬ。",
    "階段",
    "EXIT",
    "おめでとうございます。",// ← 12(0xc)
    null,
    null,
    null// ← 15(0xf)
  };

あの...、
このメッセージは
どなたが選定されたんスか?
ん?
私だがどうかしたか?



やっぱりね。

静乃さんのメッセージも楽しいですが、
実際にはドアの前に部屋の名前を表示したり、攻略のヒントなどを表示して
効果的な演出をするといいでしょう。




4. Sample24_01のインスタンス化

Sample24_01 のインスタンス化
  Sample24_01 mapper = new Sample24_01(map3D, 0, 1, 0);
  mapper.setMsgArray(msgs);

mainメソッドは、Sample24_01に配置されています。
mainメソッドの冒頭で、Sample24_01をインスタンス化して、map3Dと、msgArray を与えています。
Sample24_01のインスタンス「mapper」は、Sample24_01クラスのpublicなクラス変数です。
どこからでもアクセスできますから、入念なカプセル化が要求されますね。

ちなみに mainメソッド mapperフィールド とも、Sample24_01に配置する必要はありません。
書き換えてみても面白いと思います。




5. メインループ

Sample24_01をインスタンス化すると、すぐにメインループに入ります。

メインループ部分を抜粋
  while(in_map){

    Integer oi = Scan.getInteger("> ");  //---- 1.

    if(oi != null){  //---- 2.
        switch(oi){  //---- 3.
          case 8:
            boolean pass = mapper.toForward();
            if(!pass){
                System.out.println("ouch!");
            }
            break;
          case 6:
            mapper.toRight();
            break;
          case 2:
            mapper.lookBack();
            break;
          case 4:
            mapper.toLeft();
            break;
          case 5:
            Cell cell = mapper.rotatePosCell(0, 0);
            String WallString = cell.toWallString();
            System.out.println("\n"+WallString+"\n");
              break;
          case 0:
            System.exit(0);
            break;

        }
        System.out.println(mapper.getPos());  //---- 4.
        String msg = mapper.message();  //---- 5.
        if(msg != null){
          System.out.println(msg);
        }
        boolean action = mapper.action();  //---- 6.

        in_map = !mapper.isOut();  //---- 7.

        if(action) {  //---- 8.
          System.out.println(mapper.getPos());
        }
    }
 }  //---- 9.

ループ内の処理
  1. Scan.getInteger("> ") で入力待ち
  2. 入力値が不正な文字列の場合は再入力を求められます。
  3. switch文で入力値の評価と移動
  4. System.out.println(mapper.getPos()) で現在位置の表示
  5. 例: 1F ( 0, 1) NORTH
  6. mapper.message() メッセージのあるマスであれば表示
  7. mapper.action() アクションがあれば実行
  8. mapper.isOut() プログラムの終了条件に合致するか確認
  9. if(action){//処理}アクションによる現在位置の更新があれば再表示
  10. 最初に戻る
ループを抜けるとプログラムが終了します。



このwhileブロック一回転が
マップ内での一歩になる。



長いプログラムと思ったけど、
それほどでもないんスかね?
てまり!
騙されちゃダメよ!


お疲れ様でした。



© 2019 awasekagami