我正在寻找一种有效的方式来代表国际象棋的位置。 我的“效率”标准是:
我试图偏离标准表示的原因是我的要求略有不同。具体来说,我不是在尝试开发国际象棋引擎,因此不需要移动生成和相关问题。我只需要关注一些现有游戏,并代表某些位置,并将它们存储在数据库中。
如果有一个已经提供此功能的软件包,那就太好了。如果你有关于如何做的想法,我很乐意开发它:)
...谢谢
答案 0 :(得分:0)
这里有一个免费的PGN查看器:http://chesstempo.com/pgn-viewer.html
关于空间要求,您可以使用您选择的压缩算法压缩FEN,而不会失去检查相等性的能力。根据移动的编码方式(g1f3与Nf3),您可能需要合法移动生成器来满足要求2)。
答案 1 :(得分:0)
我会提供一些可能的解决方案,根据您的规范使用“尽可能少的内存”。我知道你可以使其中一些更紧凑,但这样做会使它更难以使用。
64位:我不知道您需要从表示中检索哪种信息,但满足您所有要求的技术是Zobrist hashing。它需要非常少的内存(您可以使用64位密钥,然后在预期发生冲突之前存储2个 32 位置)。逐步更新(按位XOR运算)非常简单有效,当然也很容易比较。但是,如果您需要显示位置或检索有关碎片的任何信息,这将使您失去运气。
328位:你可以使用一个片段列表,每个片段(4位)位于一个正方形(6位)。由于有32件,你需要跟踪铸造权(4位),en passant文件(3位)和side to move(1位)。
468位:bitboard representation。我知道你不是在开发国际象棋引擎,但这仍然是一个非常紧凑的代表。你需要7个位板(全白,全黑,所有皇后,所有车,所有主教,所有骑士,所有棋子),分别跟踪国王(12位),以及所有其他杂项信息。是的,这将是一些需要实现的工作,但是这允许你做很多其他表示中无法实现的事情,所以如果你需要分析位置,这很好。