5

ビットボードシステムでチェス盤を作りたいです。12個のビットボードから始めて、テーブル(チェス盤)を表示したいのですが、ループ/反復中にピースを描画する必要があります。

すべてのビット値をループするにはどうすればよいですか?私は次のようなことを考えていました:for(i = 0; i <64; i ++)テーブルの描画/配列の構築/空の正方形の描画

これらは、ゲームを開始するための私の価値観です。

    function init_game($whitePlayer,$blackPlayer)
{
    $WhitePawns     = '0000000000000000000000000000000000000000000000001111111100000000';
    $WhiteKnights   = '0000000000000000000000000000000000000000000000000000000001000010';
    $WhiteBishops   = '0000000000000000000000000000000000000000000000000000000000100100';
    $WhiteRooks     = '0000000000000000000000000000000000000000000000000000000010000001';
    $WhiteQueens    = '0000000000000000000000000000000000000000000000000000000000010000';
    $WhiteKing      = '0000000000000000000000000000000000000000000000000000000000001000';

    $BlackPawns     = '0000000011111111000000000000000000000000000000000000000000000000';
    $BlackKnights   = '0100001000000000000000000000000000000000000000000000000001000010';
    $BlackBishops   = '0010010000000000000000000000000000000000000000000000000000100100';
    $BlackRooks     = '1000000100000000000000000000000000000000000000000000000000000000';
    $BlackQueens    = '0000100000000000000000000000000000000000000000000000000000000000';
    $BlackKing      = '0001000000000000000000000000000000000000000000000000000000000000';

    $WhitePieces = $WhitePawns|$WhiteKnights|$WhiteBishops|$WhiteRooks|$WhiteQueens|$WhiteKing;
    $BlackPieces = $BlackPawns|$BlackKnights|$BlackBishops|$BlackRooks|$BlackQueens|$BlackKing;
}

一部の人々は私に尋ねました:なぜビットボードアプローチ?回答:ビットボードについて

チェス、チェッカー、オセロなどのボードゲームでよく使用されるビットボードは、ビットセットデータ構造の特殊化であり、各ビットはゲームの位置または状態を表し、大量計算での速度やメモリまたはディスクの使用を最適化するように設計されています。同じビットボード内のビットは、ゲームのルールで相互に関連しており、一緒に使用するとゲームの位置を形成することがよくあります。他のビットボードは、位置に関するクエリを変換または回答するためのマスクとして一般的に使用されます。「ゲーム」は、情報が構造化された形式で密に詰め込まれ、個々のユニットまたはピースがどのように関連するかに影響を与える「ルール」を備えたゲームのようなシステムです。

4

2 に答える 2

2

まず、PHPのバージョンが64ビット整数をサポートしているかどうかを確認する必要があります。サポートしていないと、奇妙な結果になります。

とにかく走れ:

echo PHP_INT_MAX;

結果がそうであれば9223372036854775807、それは機能するはずです。

文字列を使用し$string | $stringていて、上記のような形式で実行すると、基数10の整数としてキャストされるため、結果は希望どおりにならないでしょう。PHP 5.4以降0b000では、表記法を使用できます。PHPのバージョンが低い場合は、16進数または10進数の形式で保持する必要があります。DBなどに値を格納していて、値を文字列として受け取る場合、または上記の形式で保持したい場合は、intVal($value, 2)最初にを使用して適切にキャストする必要があります。

値を反復処理するには、for(提案したように)ループだけを使用できます。

$value = intVal($WhitePieces,2);
for ($i = 0 ; $i < 64 ; ++$i) {
    if ((pow(2,$i) & $value)) {
        // draw piece
    }
}
于 2012-11-26T22:40:55.653 に答える
1

あなたはビット値を持っていません、あなたは文字列を持っています。そして、文字列は難しいはずです。

どのようにループしますか?配列とforeachを使用します。

64ビット値をどのように使用しますか?PHP 5.4と2進数の形式を使用します:0b00001111 => 16-あるいは、整数値を16進数または10進数で表現します。これは、ルールが何世紀にもわたって知られているため、変更されないゲームセットアップルーチンでは完全に問題ありません。

コードを実行するには64ビットシステムを使用する必要があることに注意してください。そうしないと、PHPは64ビット整数をサポートできず、実際の動作に応じて、浮動小数点値として扱うか、32ビット値に短縮します。

このため、ソリューションにビットフィールドを使用しないことをお勧めします。彼らはもっとアセンブラーのようにプログラムするのは素晴らしいアイデアのように思えますが、あなたはアセンブラーを書いているのではなく、おそらく他のものと比較して最適ではないパフォーマンスでこのアプローチの代償を払うでしょう。

于 2012-11-26T22:13:06.160 に答える