Algorithm 在平均情况下,将国际象棋移动存储在一个字节中

Algorithm 在平均情况下,将国际象棋移动存储在一个字节中,algorithm,byte,storage,chess,Algorithm,Byte,Storage,Chess,我想要一种高效的单字节方式来存储国际象棋棋棋步。标准的代数国际象棋记数法占用了太多的字节,而我提出的其他解决方案(比如将正方形编号为0-63,然后将数字一个接一个地追加)也不起作用。我也知道像升级这样的东西可能需要超过一个字节,但我希望标准移动平均需要一个字节。有什么标准/算法吗?在我看来,你可以计算棋盘位置,(0-63),棋步可以是从当前位置到新位置的偏移量,因此你可以有“移动”形式-63到63。 您可以使用log_2(64)+1=7位来执行此操作(因此您可以只使用一个字节) 然后,知道一个棋

我想要一种高效的单字节方式来存储国际象棋棋棋步。标准的代数国际象棋记数法占用了太多的字节,而我提出的其他解决方案(比如将正方形编号为0-63,然后将数字一个接一个地追加)也不起作用。我也知道像升级这样的东西可能需要超过一个字节,但我希望标准移动平均需要一个字节。有什么标准/算法吗?

在我看来,你可以计算棋盘位置,(0-63),棋步可以是从当前位置到新位置的偏移量,因此你可以有“移动”形式-63到63。
您可以使用
log_2(64)+1=7位来执行此操作(因此您可以只使用一个字节)


然后,知道一个棋子的起始位置和所有偏移量,你可以找到该棋子的所有位置

每个玩家在棋盘上最多有16个棋子。您可以通过定义顺序(例如,从a8开始按行),然后按照该顺序(0到15,所以是4位)编码工件的索引来识别要移动的工件

然后,每个工件都有许多有效的位置可以移动。当皇后在所有方向上都没有挡块时,可以找到有效目标位置的最大数量

X • • • X • • •
• X • • X • • X
• • X • X • X •
• • • X X X • •
X X X X Q X X X
• • • X X X • •
• • X • X • X •
• X • • X • • X
如果我算对了,那就是27个目标方块。你需要5块钱。然而,你可以看到一个棋子最多有四个不同的目标方块,2位就足够了(除非它在第七级,当它可以提升到四个不同的棋子,所以12个目标,需要4位)。一个骑士最多有8位,所以有3位。主教和车:4位。国王:最多8点(只有当他在边缘时才有可能施法),3位


然后,您可以定义一个移动,以使用第一部分中标识的工件所指示的尽可能多的附加位。您只需定义目标移动(包括可能的升级)的考虑顺序。

您可以使用目标单元格消除大多数候选项,然后按预定义顺序枚举其余候选项,最后选择正确的

一个小例子,让它更清楚。假设您从左塔移动到位置34。比如说,在你做这个动作的那一刻,你有4个候选人可以到达这个牢房:当铺6号,左塔,左骑士,右骑士。您的移动可以按以下方式编码: 100010(34的二进制)01(左塔是第二个可能的选择)

当然,如果有4个以上的选择,将有超过8位;但这些案例都是自我标记的(如果一个职位有超过4名候选人,你就会知道),而且非常罕见。

告诉我们:

如果移动列表中生成的移动是确定的,则可以将移动编码为相对列表索引。由于每个位置的最大移动次数似乎为218,因此一个字节足以对移动进行索引。这种编码在早期的游戏数据库中使用

两个位置,每个位置移动218次


因此,这要求您的实现能够为给定的位置生成所有有效的国际象棋移动。链接文章提到了对该方法的一些改进,但是如果您只关心保持在1字节范围内,那么这就足够了。

您可以按照。向下滚动至信息Required/From-to-Based,您将看到一个很好的表格,其中解释了如何在不丢失任何重要信息的情况下执行此操作。这是该表的图像(我无法在此处复制/粘贴它):


什么是“储存棋步”??你需要在这个字节中保存什么?@Berto99作为内存,这样它就可以与棋盘上的一个棋子的独特移动进行一对一的匹配,并且可以在以后检索,这样我就可以确切地知道已经进行了什么移动。你需要阅读关于PGN的最传统的方式,博客@Davidisenstat已经发布了如果移动有上下文,然后很容易将移动编码为一个字节。断章取义,没有机会。上下文意味着字节是描述游戏从一开始的动作序列的一部分。所以每个字节都描述了游戏状态的变化。断章取义意味着您可以查看位并准确确定移动了哪一块、从何处开始以及在何处结束。这需要两个字节。但对于这一点,我需要知道我要从哪个位置开始,比如e4到e5,这意味着我需要另一个字节来表示e4部分……不,你必须知道游戏的第一个位置,以及所有的动作,然后你才能重建该部分的历史(要知道第三个位置,你需要开始+第一步+第二步,然后你有第三步)第七级的兵可以有3个不同的步数x 4个可能的提升==12步。