5

我有一个简单的游戏,您可以在网格中垂直或水平移动 1 个正方形的游戏块,以制作一排相同类型的三个块。

游戏网格宽 8 格,高 7 格,我想找到最有效的方法来检查是否没有剩余的移动,这将导致连续 3 个。

到目前为止我所拥有的是:

网格检查计划

http://i.imgur.com/jY6wJvZ.png

我的想法是水平测试,我只需要检查 C 列与任一侧的片类型不同,F 列相同。

垂直 - 我认为只需将第 2 行与第 3 行进行比较,以确保没有匹配项,第 5 列应与第 4 行和第 6 行进行比较以进行匹配。

那么,如果这些都不匹配,那么就不可能有更多的动作了?

我不确定这是否是最有效的方法,或者它是否会错过可能的匹配,任何有比我更好的大脑的人都可以为我指出正确的方向吗?

4

2 回答 2

3

您的检查并不能保证没有移动。例如,假设左上角是:

      *     *
  a a b c . . . .
* c c a b . . . .
  b b d a . . . .
  . . . . . . . .
* . . . . . . . .
  . . . . . . . .
  . . . . . . . .

实际上,C 列中没有一个单元格等于它的左边或右边,第 2 行中没有一个单元格等于它的上方或下方。然而,我们可以交换 C1 和 C2 来创建一个 3-in-a-row。

正如@Patashu 所建议的那样,一个天真的解决方案在这里可能是最好的,特别是对于概念化,例如,如果其他人要阅读您的代码。我将一次跟踪三个单元格(在有界 FIFO 队列中),首先按行,然后按列,当三个单元格中的两个匹配时,检查 2 到 6 个周围的单元格,这些单元格可能会被交换为填充第三个单元格。例如,

  . . . . . . . .
  . . * . . * . .
  . * . a a . * .
  . . * . . * . .
  . . . . . . . .
  . . . . . . . .
  . . . . . . . .

或者

  . . . . . . . .
  . . . . * . . .
  . . . a . a . .
  . . . . * . . .
  . . . . . . . .
  . . . . . . . .
  . . . . . . . .

或者

  . . . . . . . .
  . . . . . . . .
  . . . . . . . .
  . . . . . . . .
  . . . . . . . .
  . . . . . * . .
  . . . . * . a a

如果这些*'ed 单元格中的任何一个匹配(例如 a),那么您知道另一个 3-in-a-row 是可能的。

于 2013-05-02T22:39:15.030 回答
2

这是我的幼稚算法。显然,所有数组访问都应该尊重边界检查。

1)检查网格的每个棋盘格颜色,如仅在 xs 中然后 .s 仅在以下模式中:

x.x.x.
.x.x.x
x.x.x.
.x.x.x

在阅读行中扫描它(每 x 水平,然后下降一行)(提示:在% 2这里* 2将成为你的朋友)执行以下操作:

1a) 如果当前图块的颜色与我右下方的图块颜色相同,如果以下任何一个 X 也是相同颜色,则为连续三个:

.....
..XX.
.Xx.X
.X.xX
..XX.

1b)对于一个较低和左侧是相似的:

.....
.XX..
X.xX.
Xx.X.
.XX..

(我会将 X 的位置编码为与您正在检查的中央图块的偏移量 - 如在 {0, -1},{-1, 0},{-1, 1} 等数组中)

(或者,您可以将每个数组实现为 1 的 5 x 5 数组以在此处检查,0 表示不 - 类似于它在此答案中的外观 - 然后在扫描游戏场地时扫描 5 x 5 数组。这可能更快。不知道!你必须测试。)

2)现在从上到下每列向下如果两个相邻的瓷砖颜色相同,检查两个高或三个低的瓷砖 - 如果任何一个颜色相同,那就是连续三个:

.
X
.
x
x
.
X

3)行类似,从左到右阅读:

.X.xx.X

注意:我不知道这是否比检查每个可能的交换以查看它是否连续三个的幼稚算法更快!毕竟,两种算法都是 O(n^2),所以哪个更快取决于实现细节。因此,我推荐两件事:

1)在您实施解决方案之前不要进行优化,对于正在使用它的实际案例,对于使用它的人来说,该解决方案太慢了。

2)当你优化时,检查你是否让它更快!(并确保它仍然有效 - 没有什么比破坏代码的优化更糟糕了:))

当然,这并不意味着优化不好玩,但不要被愚弄认为优化已经足够快的代码除了锻炼你的头脑之外什么都做;)

于 2013-05-02T23:26:34.363 回答