奥赛罗棋盘游戏的简单数据结构?

时间:2010-11-06 04:39:50

标签: algorithm data-structures tree

我在很久以前完成了我的程序here作为一个uni项目,至少它在某种程度上有效(你可以尝试猴子和新手级别:))。

我想重新设计并重新实现它,以便练习数据结构和算法。

在我之前的项目中,min-max搜索和alpha-beta修剪是缺失的部分,以及缺少开放字典。

由于游戏板水平和垂直对称,我需要比以前的方法更好的数据结构:

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 11 12 13 14 15 16 17 18 -1
-1 21 22 23 24 25 26 27 28 -1
-1 31 32 33 34 35 36 37 38 -1
    . . . . . .

通过这种方式,可以很容易地计算给定任何单元格值的相邻位置,如下所示:

x-11 x-10 x-9
x-1   x   x+1
x+9  x+10 x+11

那些-1s就像“墙”一样,以防止错误的计算。

最大的问题是它没有考虑对称/方向,即,像平行开口一样的相同开口将在数据库中具有4个相应的开口情况,每个方向一个。

有什么好的建议吗?我也在考虑尝试ruby,因为它的计算速度比PHP快(仅适用于min-max alpha-beta修剪,如果我将它编程为前面的n步)。

非常感谢您提前提出的建议。

4 个答案:

答案 0 :(得分:1)

当您在数据库中对要存储或查找的位置进行哈希处理时,会获取所有八个对称位置的哈希值,并仅存储或查找八个中最小的一个。因此,所有对称位置都散列为相同的值。

这会将数据库的大小减少8,但会使散列成本乘以8.这是一个很好的权衡吗?这取决于您的数据库有多大以及您进行数据库查找的频率。

答案 1 :(得分:1)

转到C / C ++之后:-)考虑将游戏板表示为“位板”,例如两个64位向量,例如对于白色和黑色,例如struct Board {unsigned long white,black};

然后小心,你可以避免数组索引来测试片段位置,事实上可以使用一系列位逻辑运算符,移位,从一个位置并行搜索所有上捕获,右上捕获等。和面具,没有循环(!)。快得多。

这种表现形式与你打开书本对称的questino正交。

快乐的黑客攻击。

答案 2 :(得分:1)

如果从内部表示中分离出董事会的陈述,问题很容易解决。一旦打开移动,您将获得平行,折叠或垂直开口。它们中的每一个都可以处于4个方向中的任何一个方向。旋转内部板表示,直到它与您的开始书对齐。然后在绘制电路板时简单地考虑旋转。


关于游戏,你需要研究移动理论。看看Hugo Calendars关于这个主题的书。 Nick Buro也写了一些关于他的Logistello程序的文章。 A FAQ

答案 3 :(得分:-2)

由于平行开口仅适用于第一步,我只是将第一步移动固定。

如果你真的想要速度,我推荐使用C ++。

我还想象检查板上的空间比检查空间是否包含-1更快。