以下の othello.OthelloPlayer
インターフェースを実装した
クラスを作るだけで OK です。
package othello; public interface OthelloPlayer { public void init(int color, boolean first, String param); public java.awt.Point nextHand(OthelloBoard board); }
ここで init()
は、新しいゲームを開始する前に呼ばれる初
期化用のメソッドです。引数は次のようになっています。
color
:このプレーヤーのコマの色。
OthelloBoard.BLACK
か OthelloBoard.WHITE
。
first
:このプレーヤーが先手かどうか。
param
:文字列の形で与えられたパラメータ。詳しくは後述
の「アプレットへの登録」で。
nextHand()
は、与えられた盤面から次の手を求めるメソッド
です。引数の board
が、現在の盤面です。打つべき位置を
java.awt.Point
型のオブジェクトで返します。x, y 座標とも 0〜
7 です。
打つ手がない(パス)のときは、呼び出し側で自動的に処理されるので、
nextHand()
で処理する必要はありません。打つ手があるときだけ、
このメソッドは呼ばれます。
盤面を表す OthelloBoard
クラスには、次のメソッドがありま
す。
int get(int x, int y);
これは、指定した位置に置かれているコマの色を調べます。x, y 座標とも 0〜
7 です。返る値は、色に応じて OthelloBoard.BLACK
か
OthelloBoard.WHITE
、そこに何も置かれていなければ、
OthelloBoard.EMPTY
を返します。
最低限これだけで思考ルーチンが作れないことはないですが、
OthelloBoard
クラスには思考ルーチンで使うのに便利なメソッド
がいくつか用意されています。代表的なものをあげると、
boolean canPut(int x, int y);
void countReversiblePieces(int x, int y, int color);
void put(int x, int y);
Object clone();
後の2つは、「仮に置いてみる」というような処理によく使います。
ちなみに OthelloPlayer#nextHand()
に渡される
OthelloBoard
オブジェクトはコピーなので、
put()
メソッドなどで内容を変更してしまっても構いません。
OthelloBoard
クラスのその他のメソッドに関しては、リファレンス を見てください。
作成した思考ルーチンをアプレットに登録するのは簡単です。
<APPLET code="othello/app/OthelloApplet.class" width=400 height=510 alt="" archive="othello.jar"> <PARAM name="player1" value="makise.othello.TekitouPlayer"> <PARAM name="player2" value="makise.othello.ManyReversePlayer"> <PARAM name="player3" value="makise.othello.SakiyomiPlayer"> </APPLET>
というふうに、PARAM タグを使って playerXX
と
いう名前のパラメータにクラス名を与えます。XX の部分は 1〜99
までが使用可能です。数が抜けていても問題ありません。小さい数値から、見つ
けた順に登録していきます。
各思考ルーチンには、パラメータを渡すことができます(アプレットのパラ メータではなくて)。同じ思考ルーチンに、パラメータを変えて少し違った動作 をさせたいときに使えます。
<PARAM name="player3" value="makise.othello.SakiyomiPlayer"> <PARAM name="player3param" value="2"> <PARAM name="player4" value="makise.othello.SakiyomiPlayer"> <PARAM name="player4param" value="3">
というふうに、playerXXparam
という名前のパラ
メータで値を渡します。このパラメータ(思考ルーチンのパラメータ)は、文字
列ならばなんでもよいです(ここでは "2"
と "3"
という文字列)。OthelloPlayer#init()
の3番目の引数として渡
されます。パラメータが指定されなかった場合には、init()
の第
3引数には null
が渡されます。
サンプルとして、置ける場所があれば置くという最も単純なルーチンの例を 載せます。
package makise.othello; import othello.*; import java.awt.Point; /* 置ける場所を見つけるとそこに置くという最も簡単なプレーヤー */ public class TekitouPlayer implements OthelloPlayer { private int myColor; public void init(int color, boolean first, String param) { myColor = color; } public Point nextHand(OthelloBoard board) { for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) { if (board.canPut(x, y, myColor)) return new Point(x, y); } } throw new RuntimeException("Not reachable"); } }
Thread.yeild();
を実行してください。そうしないとアプレッ
トの反応が異常に悪くなってしまいます。OthelloBoard
クラスや OthelloPlayer
インター
フェースに関する詳しい説明は、リファレンス
を見てください。