GameBoard.java



import java.awt.Event;

/** ゲームのアプレットGameBoardクラス */

public class GameBoard extends ActionBoard {

    /** 落下するブロック */

        public Block block;

    /** ブロックの残骸 */

        public ClearableTrash trash;

    /** ゲームの終了を判定するメソッド */

        public boolean isGameOver(){

              if( state[0][3] != EMPTY_CELL && block.getY() == 0
                                            && block.getX() == 0 )
                    return true;
              else
                    return false;
        }

    /** ゲームを再スタートするメソッド */

        public void restartGame(){

              initCells();
              trash = new ClearableTrash( iMax, jMax );
              block = NewBlock();
              CheckBlock();
              repaint();
        }

    /** 乱数でブロックの色を指定して生成するメソッド */

        public Block NewBlock(){

              int t = (int)( Math.random() * (float)(NUM_COLORS-1) ) + 1;
              int m = (int)( Math.random() * (float)(NUM_COLORS-1) ) + 1;
              int b = (int)( Math.random() * (float)(NUM_COLORS-1) ) + 1;
              return new Block( t, m, b );
        }

    /** ゲームのモードを判定するメソッド */

        public int gameMode(){

              if( block == null ) return CLEAR_MODE;
              if( block.checkDrop() )
                    return DROP_MODE;
              else
                    return CLEAR_MODE;
        }

    /** ゲームの内容を組み込むメソッド */

        public void dropSomething() {

              DropBlock();
        }

    /** ゲームの内容を組み込むメソッド */

        public void clearSomething() {

              addCells();
              block = null;
              while( trash.clearCells() ) {
                    repaintTrash();
                    pause();
              }
              block = NewBlock();
              CheckBlock();
              repaintBlock();
        }

    /** ブロックの残骸を追加するメソッド */

        public void addCells() {

              int x = block.getX(); int y = block.getY();
              trash.setCellState( x, y, block.getTopState() );
              trash.setCellState( x, y+1, block.getMiddleState() );
              trash.setCellState( x, y+2, block.getBottomState() );
        }

    /** ブロックの残骸の再描画のメソッド */

        public void repaintTrash() {

              trash.copyStates( trash.getStates(), state );
              trash.copyStates( trash.getToBeRepaint(), toBeRepaint );
              repaint();
        }

    /** イベント処理を組み込むメソッド */

        public void action( int key ) {

              if( block == null )  return;
              switch( key ) {
                    case 'j':
                    case Event.DOWN:
                          DownColorOfBlock();
                          break;
                    case 'k':
                    case Event.UP:
                          UpColorOfBlock();
                          break;
                    case 'h':
                    case Event.LEFT:
                          ToLeftBlock();
                          break;
                    case 'l':
                    case Event.RIGHT:
                          ToRightBlock();
                          break;
                    case ' ':
                          DropBlock();
                          break;
                    default:
                          break;
              }
        }

    /** ブロックの状態の確認 */

        public void CheckBlock() {

              int x = block.getX();
              int y = block.getY();
          // 下に行けるか?
              if( y+3 >= jMax ) {      // ブロックが床まで到達
                    block.disableDrop();
                    block.disableToLeft();
                    block.disableToRight();
                    return;
              } else if( state[x][y+3]!=EMPTY_CELL ) {  // ブロックが山に到達
                    block.disableDrop();
                    block.disableToLeft();
                    block.disableToRight();
                    return;
              } else {
                    block.enableDrop();
              }

          // 左に行けるか?
              if( x<=0 ) {
                    block.disableToLeft();
              } else if(     state[x-1][y]!=EMPTY_CELL
                                || state[x-1][y+1]!=EMPTY_CELL
                                || state[x-1][y+2]!=EMPTY_CELL ) {
                    block.disableToLeft();
              } else {
                    block.enableToLeft();
              }

          // 右に行けるか?
              if( x+1>=iMax ) {
                    block.disableToRight();
              } else if( state[x+1][y]!=EMPTY_CELL
                          || state[x+1][y+1]!=EMPTY_CELL
                          || state[x+1][y+2]!=EMPTY_CELL ) {
                    block.disableToRight();
              } else {
                    block.enableToRight();
              }
        }

    /** ブロックの移動のメソッド(下へ) */

        public void DropBlock() {

              if( !block.checkDrop() ) return;
              block.drop();
              CheckBlock();
              repaintBlock();
        }

    /** ブロックの移動のメソッド(左へ) */

        public void ToLeftBlock() {

              if( !block.checkToLeft() ) return;
              block.toLeft();
              CheckBlock();
              repaintBlock();
        }

    /** ブロックの移動のメソッド(右へ) */

        public void ToRightBlock() {

              if( !block.checkToRight() ) return;
              block.toRight();
              CheckBlock();
              repaintBlock();
        }

    /** ブロックの色をずらす(下へ) */

        public void DownColorOfBlock() {

              block.downColors();
              repaintBlock();
        }

    /** ブロックの色をずらす(上へ) */

        public void UpColorOfBlock() {

              block.upColors();
              repaintBlock();
        }

    /** ブロックの再描画のメソッド */

        public void repaintBlock() {

              int x = block.getX();
              int y = block.getY();
              int old_x = block.getOldX();
              int old_y = block.getOldY();

              state[x][y] = block.getTopState();
              state[x][y+1] = block.getMiddleState();
              state[x][y+2] = block.getBottomState();

              if( x != old_x ) {
                    state[old_x][old_y] = EMPTY_CELL;
                    state[old_x][old_y+1] = EMPTY_CELL;
                    state[old_x][old_y+2] = EMPTY_CELL;
              }
              if( y != old_y ) {
                    state[old_x][old_y] = EMPTY_CELL;
              }
              toBeRepaint[x][y]=true;
              toBeRepaint[x][y+1]=true;
              toBeRepaint[x][y+2]=true;
              toBeRepaint[old_x][old_y]=true;
              toBeRepaint[old_x][old_y+1]=true;
              toBeRepaint[old_x][old_y+2]=true;
              repaint();
        }
}