【问题标题】:Gomoku (5-In-a-row) Computer Logic五子棋(5-in-a-row)计算机逻辑
【发布时间】:2012-04-05 01:50:17
【问题描述】:

好吧,让我先说我的教授向我们提出了一个项目,我认为我们还没有准备好接受。尽管如此,我必须构建一个“智能”的连续 5 人游戏。所以我开始让程序使用这个询问用户电路板的尺寸:

https://gist.github.com/2307257

现在由于这个游戏中的棋盘很大,我想要一个算法来对棋盘上的空间进行排名,以便计算机尝试控制棋盘的中间。例如,在 5x5 板上,值将是:

1 1 1 1 1

1 2 2 2 1

1 2 3 2 1

1 2 2 2 1

1 1 1 1 1

在这种情况下,计算机会选择棋盘的中间(值三)。作为一个菜鸟,我在做这件事时遇到了一些困难。我一直在想我可以通过一些循环来做到这一点,因为我相信板上任何位置的价值应该是: 数组 [(最小宽度 + i)到(最大宽度 - i)] [(最小高度 + i)到(最大高度 - i)] = 1 + i 正确的? 好吧,我一直在尝试使用这样的东西:

https://gist.github.com/2307327

但当然它不起作用,否则我不会在这里。 所以请帮我解决这个问题。 谢谢

【问题讨论】:

标签: c++ arrays logic tic-tac-toe


【解决方案1】:

该代码将导致缓冲区溢出,因为长度/大小为 5 的数组将具有从 0 到 4 的索引。

当 y 等于高度时,第 27 行将导致崩溃,因为您将导致写入超出数组边界。当 x 等于 width 并且 y 小于 height 时,您将写入 array[0][y+1] 单元格。

你的循环应该是...... 对于 (y = 0; y

如果您想填充如上所示的数组,则忽略您的 y 方向。你可以简化。

#define MIN(A, B) (((A) < (B)) ? A : B)

// x or y is cell 0 to 4 then the cell value should x or y + 1
// x or y is close to the other edge then the cell value should be width - x, or height - y
// I'm assuming that if the playing field is larger than 9x9 then a cell value of 5 is
// good enough.
array[x][y] = 
   MIN(
      5,
      MIN(
         MIN(x + 1, width  - x),
         MIN(y + 1, height - y)));

我看到你试图通过意识到结果与第 27 行对称来变得聪明。但是,如果你这样做,那么你应该更改 for 循环以迭代宽度的“一半”(最终是高度)。否则你将覆盖已经计算过的单元格。简而言之,这是一种优化。你应该先做一些事情,然后先做一些事情。

通常,就速度而言,做一些简单易懂的事情就“足够好”了,可能不需要优化。在这种情况下,您需要一台 1970 年代的超慢机器,才能让脑死亡的简单算法看起来很慢。

一些挑剔...
- 验证您的输入。如果某些 yahoo 输入负数,则在尝试创建数组时会崩溃。在这种情况下,接受小于 5 的值是没有用的,因为您需要连接 5。4x4 的板将导致不可能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 2014-01-14
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多