Games_Chess とは?
Games_Chess は、チェスを検証したり
プレイしたりするための基本的なインターフェイスを提供します。
Games_Chess は、チェスの主要なルールをすべて扱うことができます。
チェック・チェックメイト・ステイルメイト・基本的な引き分けパターン
(ビショップ+キング 対 キングなど)・50 手ルール・アンパッサン・
キャスリング・ポーンが最初だけ 2 マス進めること
などをサポートしています。
さらに、Games_Chess は Forsyth-Edwards Notation (FEN)
を使用して盤を準備したり Standard Algebraic Notation (SAN)
形式で棋譜を出力することができます。
また、妥当な SAN 形式をパースすることができます (たとえば Qa3xf3
のようなあいまいな形式でも可能です) し、単純な
"move the piece on a3 to h3" 形式のコマンドもサポートします。
Games_Chess の使い方は?
The Games_Chess パッケージにはデモ用のファイルが含まれています。
構文をハイライトさせたソースが
ここ
で見られます。
Games_Chess パッケージには三種類のドライバが含まれます。
ひとつは標準的なチェスをプレイするためのもので、他のふたつは
Internet Chess Club (ICC)
で人気の変則版をプレイするためのものです。
-
Crazyhouse。
Crazyhouse は、
敵から取った駒を自分の駒として使用することができます。
これは、激しいやり取りが行われる非常に戦術的なゲームです。
-
Loser's Chess。
Loser's chess はチェッカーと似ています。駒が取れる場合は必ず取らなければなりません。
このため、動きがある程度限定されてしまうため、
結果としてゲームが高速に進みます。
Games_Chess の基本的な使い方は単純です。
三種類のドライバを初期化するサンプルスクリプトを示します。
<?php
require_once 'Games/Chess/Standard.php';
require_once 'Games/Chess/Crazyhouse.php';
require_once 'Games/Chess/Losers.php';
$standard = new Games_Chess_Standard;
$crazyhouse = new Games_Chess_Crazyhouse;
$losers = new Games_Chess_Losers;
?>
デフォルトでは、Games_Chess ドライバは何もない盤を作成します。
駒を初期位置に並べるには、このコードを使用します。
<?php
require_once 'Games/Chess/Standard.php';
$standard = new Games_Chess_Standard;
$standard->resetGame();
?>
FEN
記法で指定した配置で駒を置きたい場合は、FEN 文字列を
resetGame() に渡します。
<?php
require_once 'Games/Chess/Standard.php';
$standard = new Games_Chess_Standard;
$standard->resetGame('rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2');
?>
Games_Chess で駒を動かす方法
Games_Chess で駒を動かすための基本的なメソッドは
moveSAN
と moveSquare
です。これらのメソッドは、どちらも TRUE あるいはエラー時に
PEAR_Error クラスを返します。
そこで、返り値の扱いかたは次のようになります。
<?php
require_once 'Games/Chess/Standard.php';
$standard = new Games_Chess_Standard;
$err = $standard->moveSAN('Nf9');
if ($standard->isError($err)) {
echo $err->getMessage();
die;
}
?>
Games_Chess->isError() を使用していることに注意しましょう。
これにより、必要なときにのみ PEAR_Error
を読み込むことになり、効率がよくなります。効率が大した問題ではない場合は
(問題になるのは、一秒間に数千ページを処理するようなサイトくらいでしょう)、
PEAR_Error コールバックを使うほうが簡単です。
これについては次の例で説明します。
以下の例では、Games_Chess で盤上の駒を動かす方法、
Crazyhouse で新たな駒を配置する方法を示します。
<?php
require_once 'PEAR.php'; // PEAR_Error クラス用
function showerror($err)
{
echo $err->getMessage();
exit;
}
require_once 'Games/Chess/Standard.php';
require_once 'Games/Chess/Crazyhouse.php';
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'showerror');
$standard = new Games_Chess_Standard;
$crazyhouse = new Games_Chess_Crazyhouse;
$standard->resetGame();
$crazyhouse->resetGame();
$standard->moveSAN('e4'); // moveSquare を使用するのなら 'e2' to 'e4'
$standard->moveSquare('d7', 'd5'); // moveSAN を使用するのなら 'd5'
$standard->moveSAN('exd5');
$crazyhouse->moveSquare('e2', 'e4'); // 上の moveSAN() と同じ
$crazyhouse->moveSAN('d5'); // 上の moveSquare と同じ
$crazyhouse->moveSAN('exd5');
$crazyhouse->moveSAN('Qxd5');
$crazyhouse->moveSAN('P@d7'); // 駒を配置します
?>
ポーンが成る場合は、moveSquare()
で駒の型を指定しなければなりません。
Q はクイーン、
R はルーク、B はビショップ、
そして N はナイトを表します。
<?php
require_once 'PEAR.php'; // PEAR_Error クラス用
function showerror($err)
{
echo $err->getMessage();
exit;
}
require_once 'Games/Chess/Crazyhouse.php';
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'showerror');
$crazyhouse = new Games_Chess_Crazyhouse;
$crazyhouse->resetGame();
$crazyhouse->moveSAN('e4');
$crazyhouse->moveSAN('d5');
$crazyhouse->moveSAN('exd5');
$crazyhouse->moveSAN('Qxd5');
$crazyhouse->moveSAN('d3');
$crazyhouse->moveSAN('Kd7');
$crazyhouse->moveSAN('d4');
$crazyhouse->moveSAN('Ke6');
$crazyhouse->moveSAN('P@d7');
$crazyhouse->moveSAN('Qd6');
// $crazyhouse->moveSAN('d8=Q'); // 通常の方法
$crazyhouse->moveSquare('d7', 'd8', 'Q'); // moveSquare を使用する方法
// ポーンをクイーンに成らせます
?>
進行中のゲームの情報の取得
現在までの駒の動きや現在の FEN、持ち駒の一覧 (Crazyhouse のみ)
などの必要な情報を取得したり、
ゲームが終了したかどうかを調べたりといったことを行うには、
以下のいずれかのメソッドを使用します。
-
gameOver()。
このメソッドを使用して、ゲームが終了したかどうかを調べます。
白が勝った (チェックメイト) 場合に W、
黒が勝った (チェックメイト) 場合に B、
引き分けの場合に D、
そしてゲームがまだ進行中の場合に false を返します。
-
renderFen()。
このメソッドは、Forsyth-Edwards Notation (FEN)
形式で現在のゲームの状態を返します。FEN では、
持ち駒を表す方法がないことに注意しましょう。そのため、
現在進行中の Crazyhouse のゲームを完全に再現することはできません。
-
toArray()。
Standard ドライバおよび Loser's chess ドライバでは、
これは代数的なマスの位置 (a1 から h8)
にその内容を対応させた連想配列を返します。その位置に何も駒がない場合は、
礼装配列の値はそのマスの名前になり (たとえば a1
に対応する値は a1 となります)、
それ以外の場合は駒の名前が値となります。駒の名前は
P、R、
N、B、Q あるいは
K のいずれかです。
駒の色が白の場合は P のように大文字で表し、
黒の場合は p のように小文字で表します。
Crazyhouse ドライバでは、これは 2 つのキー
board および captured
を持つ連想配列を返します。board
の値は、先の段落で説明した
Standard/Loser's chess ドライバの場合の返り値と同じ内容です。
captured の中には、このような形式の配列が含まれます。
<?php
$captured =
array(
'W' =>
array(
'P' => 6, // 白は、黒のポーンを 6 個取っています
'R' => 0,
'N' => 0,
'B' => 0,
'Q' => 0,
),
'B' =>
array(
'P' => 4, // 黒は、白のポーンを 4 個取っています
'R' => 0,
'N' => 0,
'B' => 0,
'Q' => 0,
),
);
?>
最初の要素が白か黒か (W および B) を表し、
その配下の要素が各種類の持ち駒の数を表します。
上の例では、白はあと 6 回ポーンを打つことができます。
また、黒はあと 4 回ポーンを打つことができます。
-
toMove()。
このメソッドは、次がどちらの番なのかを返します。
W の場合は白番、B
の場合は黒番です。