思考ルーチンの作り方


思考ルーチンのクラス

以下の 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() は、新しいゲームを開始する前に呼ばれる初 期化用のメソッドです。引数は次のようになっています。

nextHand() は、与えられた盤面から次の手を求めるメソッド です。引数の board が、現在の盤面です。打つべき位置を java.awt.Point 型のオブジェクトで返します。x, y 座標とも 0〜 7 です。

打つ手がない(パス)のときは、呼び出し側で自動的に処理されるので、 nextHand() で処理する必要はありません。打つ手があるときだけ、 このメソッドは呼ばれます。

盤面へのアクセス

盤面を表す OthelloBoard クラスには、次のメソッドがありま す。

これは、指定した位置に置かれているコマの色を調べます。x, y 座標とも 0〜 7 です。返る値は、色に応じて OthelloBoard.BLACKOthelloBoard.WHITE、そこに何も置かれていなければ、 OthelloBoard.EMPTY を返します。

最低限これだけで思考ルーチンが作れないことはないですが、 OthelloBoard クラスには思考ルーチンで使うのに便利なメソッド がいくつか用意されています。代表的なものをあげると、

後の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");
  }
}

注意点

リファレンス

OthelloBoard クラスや OthelloPlayer インター フェースに関する詳しい説明は、リファレンス を見てください。