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

Sample24_01のメソッド
その三

残りのメソッドをここで説明しましょう。

目次

1. toForwardメソッド


ダンジョン内を前に移動します。
具体的には、direction の方向に従って、posX、posY を変更します。

toForwardメソッド
public boolean toForward(){
  Cell cell = getRotateCell(0, 0); // ← 1
  boolean pass = cell.getF()!=1; // ← 2
  if(pass){
    switch(direction){// ← 3
    case NORTH:
      posY++;
      break;
    case EAST:
      posX++;
      break;
    case SOUTH:
      posY--;
      break;
    case WEST:
      posX--;
      break;
    }

    displayFieldMsg = true; // ← 4
  }
  return pass;// ← 5
}

  1. 現在位置のマスの壁の位置を、進行方向に回転させて取得
  2. 現在位置のマスの進行方向の壁を評価
  3. 進行方向の壁が通過できる場合には、進行方向に移動
  4. 移動出来たら、フィールドメッセージの表示を許可する
  5. 移動で来たかどうかを真偽値で返します
displayFieldMsgって
なんスか?
そのマスにいると表示されるメッセージが
向きを変える度に表示されると
うざいだろ?
それで移動するまで
表示を制限してるのね。


2. messageメソッド


現在位置のマスに従った文字列を返します。

Cellクラスの仕様 メッセージ
画像をクリックして拡大してね。

messageメソッド
      private final static int FIELD_MSG  = 5;
      private boolean displayFieldMsg = true;

      public String message() {
        if(msgArray==null)return null;

        Cell cell = rotatePosCell(0, 0);
        int type = cell.getBit4(4); // ← 1

        if(type == 0)return null; // ← 2

        String msg = null;
        if(type == direction+1) { // ← 3
          //doorMsg
          int msgNo = cell.getBit4(5);
          msg = msgArray[msgNo];

        }else if(type == FIELD_MSG) { // ← 4
          //FieldMsg
          if(displayFieldMsg) { // ← 5
            int msgNo = cell.getBit4(5); // ← 6
            msg = msgArray[msgNo]; // ← 7
            displayFieldMsg = false; // ← 8
          }
        }
        return msg;
      }


  1. getBit4(4) でイベント番号を取得
  2. イベント番号「0」はイベントなし
  3. イベント番号が「direction+1」であれば方角の文字列を返します
  4. イベント番号が「FIELD_MSG」であればフィールドメッセージを返します
  5. メッセージの表示可否を確認します
  6. getBit4(5) でメッセージ番号を取得します
  7. メッセージ番号の文字列を返します
  8. 移動するまでフィールドメッセージの表示を制限します
メッセージの出し方は、ゲームの演出に合せて自由に設計するといいでしょう。



3. actionメソッド


現在位置のマスに従って、階段の昇り降りイベントを実行します。

Cellクラスの仕様 階段イベント
画像をクリックして拡大してね。

actionメソッド
  private final static int ACTION_UP  = 6;
  private final static int ACTION_DOWN= 7;
  private boolean displayFieldMsg = true;

  public boolean action() {
    Cell cell = rotatePosCell(0, 0);
    int type = cell.getBit4(4); // ← 1

    switch(type){
      case 0: // ← 2
          return false;
      case ACTION_DOWN: // ← 3
          if(displayFieldMsg) { // ← 4
              // ↓ 5
              Boolean yn
                = Scan.getBoolean("上り階段があります。 昇りますか?(Y/N): ");
              if(yn) {
                down(); // ← 6
              }
              displayFieldMsg = false;
              return true;
          }
          break;
      case ACTION_UP: // ← 7
          if(displayFieldMsg) { // ← 8
              // ↓ 9
              Boolean yn
                = Scan.getBoolean("下り階段があります。 降りますか?(Y/N): ");
              if(yn) {
                up(); // ← 10
              }
              displayFieldMsg = false;
              return true;
          }
          break;
      }
    return false;
  }

  private void up() {
    ++floor;
  }
  private void down() {
    --floor;
  }

  1. getBit4(4) でイベント番号を取得
  2. イベント番号「0」はイベントなし
  3. イベント番号が「ACTION_DOWN」の場合。
  4. メッセージの表示可否を確認します
  5. 「昇りますか?(Y/N):」と表示して入力待ち
  6. 入力結果が「true」であれば、down() します。
  7. イベント番号が「ACTION_UP」の場合。
  8. メッセージの表示可否を確認します
  9. 「降りますか?(Y/N):」と表示して入力待ち
  10. 入力結果が「true」であれば、up() します
階段を利用したかどうかを戻り値として返します。
基本的に switch文で
「昇るか?」「降りるか?」と
訊いているだけだ。
そうは言っても
読むの結構疲れますね。
SUN値削られる~。


お疲れ様でした。



© 2019 awasekagami