C# - 使用哪种数据结构 - 操纵和存储180位的国际象棋位置?

M_I*_*ees 2 c# chess bit-manipulation bitwise-operators

我正在制作一个国际象棋应用程序,需要创建一本开放书,一个可能包含数百万个动作和位置的文件.我们有64平方米,其中一些已被占用,而有些是空的.让我们用以下比特表示我们的作品(使用霍夫曼编码技术).

              White          Black
-Empty        0

-Pawn         110           100

-Rook         11111         11110

-Knight       10110         10101

-Bishop       10100         11100

-Queen        111010        111011

-King         101110        101111
Run Code Online (Sandbox Code Playgroud)

在初始位置,我们有32个不同的部分被占用,32个是空的.为了提高效率,我必须将位置存储在连续位中.片段位将按顺序放置在位数组中,从a1平方开始,然后是a2平方,... a8,然后是b1,b2 ... b8平方等等.

因此,对于起始位置,这相当于32 x 1 + 16 x 3 + 12 x 5 + 4 x 6 = 164位.

另外还有一些额外的16位用于不同的游戏情况,例如是否启用了castling,以及定义了enpassant square(如果适用).所以我需要大约180位(或23字节= 184位)来存储棋盘的单个位置.

现在的问题是我必须执行一些按位操作,因此想要知道该方案如何在我的代码中操作它以及如何存储在文件中.意味着我应该使用哪种数据结构.例如,最大长度(数据类型)将仅包含4个字节= 64位.我想避免使用字符串.任何机构都可以建议如何继续这一点.

我正在使用C#.Net,Framework 3.5.

Ivo*_*ops 6

对于国际象棋应用,最常用的结构是这个;

  • 一个ulong 64位变量,其中每个位代表电路板上的一个位置
  • 每个颜色的单独变量pawns,knigths等.

所以

ulong WHITE_PAWNS = xxx;
ulong BLACK_PAWNS = xxx;
Run Code Online (Sandbox Code Playgroud)

等等

这不是最具存储效率的版本,但可以让您快速完成很多工作.为了让小兵和骑士团结在一起,你可以做到

white_pawns_and_knights = WHITE_PAWNS | WHITE_KNIGHTS;
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多相关信息(以及其他地方).

我已经写了一个我自己的国际象棋程序(在Delphi中,部分是C#),那里有很多好东西.这些是我在这个主题上留下的书签;

我还有一个C#单元,可以根据需要对ulongs进行快速位操作.如果您需要,请发送电子邮件至ivotops#gmail#com,并随时提出要求.

不幸的是我的时间太少而且从未完成C#版本;-)