我在很久以前完成了我的程序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步)。
非常感谢您提前提出的建议。
答案 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更快。