非播放软件的国际象棋位置表示

时间:2013-06-21 18:40:40

标签: chess representation

我正在寻找一种有效的方式来代表国际象棋的位置。 我的“效率”标准是:

  1. 需要尽可能少的内存
  2. 给出位置表示和合法移动(以通常的方式表示,例如以pgn格式表示),很容易计算得到的poisition表示。也就是说,函数new_position = compute_position(old_position,move)可以(或者已经)以非常有效的方式实现(从运行时的角度来看)。
  3. 很容易比较两个位置,看它们是否相同
  4. 我试图偏离标准表示的原因是我的要求略有不同。具体来说,我不是在尝试开发国际象棋引擎,因此不需要移动生成和相关问题。我只需要关注一些现有游戏,并代表某些位置,并将它们存储在数据库中。

    如果有一个已经提供此功能的软件包,那就太好了。如果你有关于如何做的想法,我很乐意开发它:)

    ...谢谢

2 个答案:

答案 0 :(得分:0)

这里有一个免费的PGN查看器:http://chesstempo.com/pgn-viewer.html

关于空间要求,您可以使用您选择的压缩算法压缩FEN,而不会失去检查相等性的能力。根据移动的编码方式(g1f3与Nf3),您可能需要合法移动生成器来满足要求2)。

答案 1 :(得分:0)

我会提供一些可能的解决方案,根据您的规范使用“尽可能少的内存”。我知道你可以使其中一些更紧凑,但这样做会使它更难以使用。

  1. 64位:我不知道您需要从表示中检索哪种信息,但满足您所有要求的技术是Zobrist hashing。它需要非常少的内存(您可以使用64位密钥,然后在预期发生冲突之前存储2个 32 位置)。逐步更新(按位XOR运算)非常简单有效,当然也很容易比较。但是,如果您需要显示位置或检索有关碎片的任何信息,这将使您失去运气。

  2. 328位:你可以使用一个片段列表,每个片段(4位)位于一个正方形(6位)。由于有32件,你需要跟踪铸造权(4位),en passant文件(3位)和side to move(1位)。

  3. 468位:bitboard representation。我知道你不是在开发国际象棋引擎,但这仍然是一个非常紧凑的代表。你需要7个位板(全白,全黑,所有皇后,所有车,所有主教,所有骑士,所有棋子),分别跟踪国王(12位),以及所有其他杂项信息。是的,这将是一些需要实现的工作,但是这允许你做很多其他表示中无法实现的事情,所以如果你需要分析位置,这很好。