5

我想通过位板系统构建一个棋盘。从 12 个位板开始,我想显示一个表格(棋盘),在循环/迭代期间必须绘制一块。

我如何遍历所有位值?我在想类似的东西: for(i=0;i<64;i++) draw table / build array / draw empty square

这些是我开始游戏的价值观:

    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;
}

有人问我:为什么要使用bitboard?答:关于位板

位板,通常用于国际象棋、跳棋和黑白棋等棋盘游戏,是位集数据结构的一种特殊形式,其中每个位代表一个游戏位置或状态,旨在优化速度和/或内存或磁盘在大规模计算中的使用。同一个位板上的位在游戏规则中相互关联,当放在一起时通常会形成一个游戏位置。其他位板通常用作掩码来转换或回答有关位置的查询。“游戏”可以是任何类似游戏的系统,其中信息以结构化形式紧密包装,“规则”影响各个单元或部分如何关联。

4

2 回答 2

2

首先你必须检查你的 PHP 版本是否支持 64 位整数,否则你会得到奇怪的结果。

赶紧跑:

echo PHP_INT_MAX;

如果结果是9223372036854775807那么它应该工作。

您正在使用字符串,我$string | $string想当您按照上面的方式进行操作时,它将被转换为以 10 为底的整数,因此结果不会是您想要的。自 PHP 5.4 起,您可以使用0b000符号,对于较低的 PHP 版本,您需要将其保持为十六进制或以 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 和二进制数字格式:0b00001111 => 16 - 或者将整数值表示为十六进制或十进制,这对于不会改变的游戏设置例程来说应该是完全可以的,因为这些规则是众所周知的几个世纪。

请记住,您必须使用 64 位系统来执行您的代码,否则 PHP 将无法支持 64 位整数,并且将它们视为浮点值,或者将它们缩短为 32 位值,具体取决于您实际执行的操作。

由于这一切,我建议不要在解决方案中使用位域。编写更像汇编程序的程序似乎是一个好主意,但是您不是在编写汇编程序,并且与其他任何方法相比,可能会以非最佳性能为这种方法付费。

于 2012-11-26T22:13:06.160 回答