以下の 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 インター
フェースに関する詳しい説明は、リファレンス
を見てください。