やはり簡単なパズルゲームをサンプルにします。
その中に登場するクラスのうち、ゲームの開始や実行中の基本的な処理を
組み込んだ
クラス ActionBoard
があります。
/** ゲーム進行の骨組みを組み込んだActionBoardクラス */
abstract public class ActionBoard extends CellBoard implements Runnable {
/** 拡張クラスでゲームの内容を組み込むためのメソッド */
abstract public void dropSomething();
/** 拡張クラスでゲームの内容を組み込むためのメソッド */
abstract public void clearSomething();
:
:
:
この2つのメソッドは内容が定義されていません。
ただし、次のように他のメソッドの中で呼び出すことができます。
/** スレッドとして行われる処理 */
public void run() {
while( timer.isAlive() ) {
if( !startFlag ) { // ゲーム開始
startFlag = true;
restartGame();
}
else if( isGameOver() ) { // 再ゲーム開始
restartGame();
}
else{ // ゲーム進行中
switch( gameMode() ) {
case DROP_MODE:
dropSomething();
pause();
break;
case CLEAR_MODE:
clearSomething();
break;
}
}
}
}
上の記述はの意味を考えてみましょう。ActionBoardの run()では、
ゲーム進行中の間 dropSomething() か clearSomething() の処理が
実行されます。これらは「ブロックが落下中の処理」と
「ブロックを消去するための処理」と解釈できます。
この処理のパターンは、「テトリス」に似たゲームに共通するものです。
ただし、それらの詳細はまだ決められてはいません。
dropSomethin() と clearSomthing()の内容は、
ActionBoardを拡張したクラスの中で自由に定義することができます。
つまり、abstract なメソッドを導入することで、ゲームの基本的な処理の部分と、 ゲームの細かいルールの部分を分離することが可能になったわけです。 ActionBoardは、現在開発中のゲームだけでなく、他の良く似た種類のゲームの プログラムの中でも再利用することができるのです。