【发布时间】:2021-09-18 13:08:29
【问题描述】:
4x4tic-tac-toe 在四行(从上到下编号为 0 到 3)和四列(从左到右编号为 0 到 3)的棋盘上进行。 X 总是会迈出第一步。
游戏由第一个在同一行、列或对角线(仅 2 个主对角线)上获得四个棋子的玩家获胜。如果棋盘已满且没有玩家获胜,则游戏为平局。
假设轮到X 移动,如果X 可以移动,那么X 被称为强制获胜,X 可以赢。这并不一定意味着X 将在下一步中获胜,尽管这是有可能的。这意味着X 有一个制胜策略,无论O 做什么,都能保证最终获胜。
鉴于与X 的部分完成的游戏接下来要移动,我必须确定X 是否有强制获胜。该游戏将代表一个真实世界的游戏,并且不存在任何错误(例如 x 的数量多于 o 的数量等)。如果有这样的强制获胜,应该报告第一个发现的这样的强制获胜。对于这个问题,第一次强制获胜是由棋盘位置决定的。
通过检查位置 (0,0), (0, 1), (0, 2), (0, 3),(1, 0), (1, 1), 来搜索强制获胜。 .., (2, 2),...(3, 3) 依次输出找到的第一个强制获胜。请注意,X 的许多动作可能会导致强制获胜 - 因此请以这种方式找到第一个此类强制获胜。
例子:
....
.xo.
.ox.
....
这里,X 没有强制获胜。但这是另一个例子:
o...
.ox.
.xxx
xooo
(0, 1) by X 是强制获胜。 (即使在 (0, 3) 和 (2, 0) 标记 x 将使 x 在同一个动作中获胜,但我们不允许跳转到任何特定位置。必须对每个位置执行顺序扫描并且顺序如上所述。)
我的方法:
因此,假设对于上面提到的第二个示例,如果我在 (0, 1) {这是可以进行移动的第一个空位} 处移动 x,我将递归调用此方法来确定是否通过标记这个地方是x 并在 3 个不同的子程序下检查以下内容,
-
x赢了吗? - 有平局吗?
-
o赢了吗?
这 3 个条件将在单独的方法中进行评估,每个方法都返回一个布尔值。如果 1 的返回值为真,我会立即将其作为答案返回。但是如果 2 为真,那么对于x 在 (0, 1) 处移动的当前棋盘,我将移动 o 以防止 x 获胜。可以根据作为参数传递给函数的当前布尔值进行轮次更改。为了确定这一举动,我必须扫描整个棋盘(4 行、4 列和 2 条对角线),看看棋盘上是否有任何地方x 有 4 个标记中的 3 个。
我无法弄清楚接下来的步骤,我强烈觉得我走错了方向。我知道它涉及递归和回溯。(如果没有,请纠正我)。任何形式的指导将不胜感激。
更新:
我试图自己弄清楚一些事情。
- 如果比赛中的标记少于 6 个,则为平局。
- 因此,即使对已经存在 6 个标记的游戏使用蛮力,复杂度也将是 9!对于每场分析的比赛(如果模拟到最后。但一旦我们知道这是
x的强胜,我们可以立即返回)。 - 如果标记 x 生成超过 2 行得分为 3 或更高,并且没有得分为 -3 或更高的行 o,则它是
x的强制获胜(在板上,我是用1表示标记为x,-1表示标记为o,0表示空白)。 - 如果标记 0 生成超过 2 行的得分为 -3 或更高,则强制
o和x丢失。 - 除了这些点之外,无需检查。
- 在每次移动前进行平局检查。
更新 2:
Tricont 建议我在这里使用 minmax 算法方法。但我相信这对于这个问题来说可能是一种矫枉过正。这不是人类与人工智能的游戏。我只需要确定导致x强制获胜的位置。如果不存在这样的位置,那么绝对不是强制获胜(可能是x输掉比赛或平局)。
【问题讨论】:
-
你看极小极大算法了吗?
-
让我直说。 Input - 板子的当前状态。 输出 - 查找
X在当前状态下是否强制获胜? -
不,我没有。我什至不知道它是什么。
-
@AKSingh 准确!
标签: algorithm tic-tac-toe