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();
}
}