Trash.java



/** ブロックの残骸Trashクラス */

public class Trash {

    /** セルの状態が空であることを表す数値 */

        public static final int EMPTY = 0;

    /** 表へのアクセスに失敗したことを表す数値 */

        public static final int ERROR = 0;

    /** Trashのサイズの上限 */

        protected int iMax, jMax;

    /** 現在のセルの状態を記憶した表 */

        protected int state[][];

    /** 以前のセルの状態を記憶した表 */

        protected int old_state[][];

    /** 表示が必要かどうかの表 */

        protected boolean toBeRepaint[][];

    /** コンストラクタ */

        Trash( int iMax, int jMax ) {

              this.iMax = iMax; this.jMax = jMax;
              state = new int[iMax][jMax];
              initTable( state );
              old_state = new int[iMax][jMax];
              initTable( old_state );
              toBeRepaint = new boolean[iMax][jMax];
              initTable( toBeRepaint );
        }

    /** 表の初期化をするメソッド */

        public void initTable( int table[][] ){

              for( int i=0; i<iMax; i++ )
                    for( int j=0; j<jMax; j++ )
                          table[i][j] = EMPTY;
        }

        public void initTable( boolean table[][] ){

              for( int i=0; i<iMax; i++ )
                    for( int j=0; j<jMax; j++ )
                          table[i][j] = false;
        }

    /** セルの状態の表を返すメソッド */

        public int[][] getStates(){

              return state;
        }

    /** 以前のセルの状態の表を返すメソッド */

        public int[][] getOldStates(){

              return old_state;
        }

    /** 再描画の表を返すメソッド */

        public boolean[][] getToBeRepaint(){

              return toBeRepaint;
        }

    /** 状態の表のコピーを行うメソッド */

        public void copyStates( int origin[][], int copy[][] ){

              for( int i=0; i<iMax; i++ )
                    for( int j=0; j<jMax; j++ )
                          copy[i][j] = origin[i][j];
        }

        public void copyStates( boolean origin[][], boolean copy[][] ){

              for( int i=0; i<iMax; i++ )
                    for( int j=0; j<jMax; j++ )
                          copy[i][j] = origin[i][j];
        }

    /** 状態の変更があったセルをリストアップするメソッド */

        public void checkRepaint(){

              for( int i=0; i<iMax; i++ )
                    for( int j=0; j<jMax; j++ )
                          if( state[i][j] != old_state[i][j] )
                                toBeRepaint[i][j] = true;
                          else
                                toBeRepaint[i][j] = false;
        }

    /** セルの状態を設定するメソッド */

        public void setCellState( int i, int j, int state ){

              if( i<0 || i>=iMax) return;
              if( j<0 || j>=jMax) return;
              this.state[i][j] = state;
        }

    /** セルの状態を返すメソッド */

        public int getCellState( int i, int j ){

              if( i<0 || i>=iMax) return ERROR;
              if( j<0 || j>=jMax) return ERROR;
              return state[i][j];
        }
}