作って遊ぼうJava(8) アプレットのメインの処理は?

Small Basicで作った三目並べのメインの部分をJavaアプレットに移植しました。×と○を交互に打たせながら勝敗を判定する部分です。Small Basicのプログラムのメイン部はプログラムの冒頭にあります。同じJavaでも、Javaプログラムの場合は、mainというメソッドを持つクラスを作ってmainメソッドにプログラムのメイン部を置くことができます。一方Javaアプレットの場合は、mainというメソッドはなく、あるのは init、paint といったメソッドです。
アプレットでプログラムの流れを継続的に制御するには、スレッドという仕組みを使うのがよいでしょう。そこで今回はThreadクラスを継承Gameというクラスを作り、その中のrunというメソッドでプログラムのメインの処理を行うようにしました。Console18として公開します。
Photo
【図9 スレッドの呼び出し概略図】
今回ゲーム本体をスレッドにするに当り、これまでのクラス間の関係がすっきりしなくなると思いました。例えばSmall Basicのプログラムでは、ゲームのメインの中で次がどちらの番かを表すLEDランプをON/OFFしたり、クラスBoardで新しいゲームを開始する処理の中でゲームコンソールの勝敗の表示を非表示にしたり、どのサブルーチンからも全てのサブルーチンが見えているので、自由に呼び出しています。このような作りにすると、クラス間の依存関係が高まり、クラスを部品として使うときに制約となってひとつひとつのクラスが使いづらくなります。
つまり、クラス間の関係をなるべく持たせないことで、利用しやすいコード(プログラムソース)になります。また、コードの本質的な部分と修飾的な部分を分けておけば、別の修飾を実現しやすくなります。
このことを念頭に、クラスの関係を見直しました。具体的には、ゲーム盤を抽象化したBoardというクラスを、本質的なBoardとグラフィックスに関するBoardControlという2つのクラスに分けました。そして今回作ったGameというクラスはゲームの本質的な部分を扱うこととし、ゲームのグラフィックスとサウンドを抽象化したConsole(ゲームコンソールの意)というクラスとの関係を最小限にして、グラフィックスやサウンドを直接操作しないようにしました。ただ、グラフィックスを変更するタイミングを与える必要があるので、ゲームのコンストラクタ(クラスのオブジェクトを作るときに呼び出されるメソッド)にConsoleオブジェクトが与えられた場合は、そのオブジェクトに対する通知をするようにしました。
Console18
【図10 Console v1.8】
なお、今回はまだプレイヤーに関する部分はまだ実現していません。単純に左上から相互に打っていくようにしました。本来の動きと違うのですが、[REPLAY]ボタンを押すと盤面がクリアされ、[NEW]ボタンを押すとまた左上から相互に打たれます。
それから、今回はパッケージの名前を見直しました。私のイニシャルをとってnonkitをパッケージ名の頭に付けるようにしました。詳しくはリファレンスをご覧ください。
さて、次回はプレイヤーの部分を作り込んでいきます。まずは人同士の対戦ができるようにしたいと思います。
(つづく)

カテゴリーJava

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。