2

我正在使用 Java 中的 24 位位板,代表以下形式的游戏板:

00 01 02 03 04
05 06 07 08 09
10 11 XX 12 13
14 15 16 17 18
19 20 21 22 23

请注意,板的中间有一个孔,用“XX”表示。我已经生成了一个合法位板列表,但是由于该板具有正方形的对称性,我可以丢弃大量已经由列表中的对称表亲表示的位板。

为了检查这些对称性,我需要能够将板旋转 90、180 和 270 度并水平、垂直和对角(在两条对角线上)镜像的函数。显然我想利用位操作,但这是我卡住的地方。我找到了一些关于如何为棋盘执行此操作的信息,但我无法理解这个概念 - 更不用说如何将其应用于我自己的棋盘情况了。

任何人都可以通过一些解释告诉我如何有效地旋转/镜像位板吗?

4

2 回答 2

2

我在这里找到了最有效方法的汇编:

http://chessprogramming.wikispaces.com/Flipping+Mirroring+and+Rotating

例如 64 位板的垂直翻转只有 13 次操作,并且没有任何 if 语句。旋转可以通过翻转和镜像的组合来完成。

其中一些算法在您第一次看到它们时看起来就像魔术一样。要真正了解它们,在每次操作后转储电路板状态会有所帮助。

于 2014-10-03T09:02:46.093 回答
0

在我读到这个问题之前,我没有遇到过比特板。有趣的概念!

我想知道你是不是误会了什么。我怀疑您不应该根据其拓扑动态生成位板的旋转算法,我希望您对旋转算法进行硬编码。

所以我会将旋转编码为:

00 -> 04
01 -> 09
02 -> 13
03 -> 18
04 -> 23
...

然后,您可以在将位板作为参数的方法/例程中对此进行编码,执行转换并返回结果。您可能会发现某些转换可以使用二进制逻辑运算符进行编码,但这应该作为算法的优化而不是基本概念。

这里有一个使用位板的很好的例子,一个知识渊博的开发人员正在讨论在跳棋游戏中使用位板。

或者,您可以选择不同的表示形式,例如:

00 10 20 30 40
01 11 21 31 41
02 12 XX 32 42
03 13 23 33 43
04 14 24 34 44

翻转和旋转的转换显然要简单得多,并且在位使用方面进行了非常合理的权衡。

您选择的表示实际上取决于您计划在游戏中进行的移动类型以及哪些应该易于计算。

于 2014-07-17T22:20:35.123 回答