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" 形式のコマンドもサポートします。
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; ?> |
<?php require_once 'Games/Chess/Standard.php'; $standard = new Games_Chess_Standard; $standard->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 で駒を動かすための基本的なメソッドは 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 で盤上の駒を動かす方法、 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'); // 駒を配置します ?> |
<?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 を返します。
このメソッドは、Forsyth-Edwards Notation (FEN) 形式で現在のゲームの状態を返します。FEN では、 持ち駒を表す方法がないことに注意しましょう。そのため、 現在進行中の Crazyhouse のゲームを完全に再現することはできません。
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 の場合は黒番です。