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

Cellクラスの仕様

Cellクラスはダンジョンの1マスを表すクラスです。
Cellの値はint型の「value」 の一つです。
これ一つで東西南北の壁の種類と発生するイベントの種類を表します。


目次

1. 変数value


Cellクラスのインスタンス変数は int型の「value」だけです。

Cellクラスの値
private int value;

intのメモリ32bitを、4bit x 8コ の値として使います。
個々の値を取り出したり書き込んだりするには、ビット演算を用います。
4bitで表現可能な値は、0~15の16通りです。
壁の種類に16コも必要ありませんからこれで十分なんです。

4bitで表現可能な範囲は、16進数表記でちょうど 0~f なので、一桁で扱えて便利ですよ。


value は、小さな値を数多く載せるために
4bitごとに切り分けて使ってみた。
Cellクラスの仕様
画像をクリックして拡大してね。

byte型の配列とかじゃ
ダメなんスか?



それでもいいよ。
でもこれカッコイイだろ?




カッコイイって
どうゆうこと?


2. getBit4メソッド

getBit4メソッドは、valueの中から
引数に指定されたインデックスの 4bitをintで返します。

getBit4メソッド
  public int getBit4(int index){
      return value>>>(index*4) & 0xf;
  }

valueをインデックス分だけ右にシフト(>>>)して、不要な右側のbitを落とします。
  ご参照→ シフト演算子
続いて「& 0xf」 で不要な左側のbitを落としています。
  ご参照→ ビット論理演算子

上の「Cellクラスの仕様」の表で
「4bit No」の値をインデックスとして
与えるんだ。
ビット演算って使えるんですね。
飾りだと思ってました。
同感だわ。


3. rotateCellメソッド

rotateCellメソッドは、「北を上」ではなく、
「引数に指定された方向(direction)が上」になるよう回転した値を Cellインスタンスで返します。

rotateCellメソッド
  public Cell rotateCell(int direction){
      int r16 = value & 0xffff;//4BitNo 0~3を取得
      int l16 = value & 0xffff0000;//4BitNo 4~7を取得
      int part1 = r16<<(direction*4)& 0xffff;//前にシフト
      int part2 = r16>>>((4-direction)*4)& 0xffff;//後ろにシフト
      return new Cell(l16 | part1 | part2);//合体
  }

ん?
回転した値って
どうゆうこと?

あ~すまん。
これをみてくれ。
rotateCellメソッド 引数が北(direction == 0)

rotateCellメソッド 引数が東(direction == 1)

rotateCellメソッド 引数が南(direction == 2)

rotateCellメソッド 引数が西(direction == 3)

あ~。
地図アプリの「北固定」と
「地図の回転」ってこと?
引数に進行方向を与えれば
進行方向を上に回転できるっスね。
そうそう
それそれ。
戻り値もCellのインスタンスですから、getFメソッドで「北」ではなく進行方向の壁が得られます。



お疲れ様でした。



© 2019 awasekagami