【问题标题】:A recursive check for a winner in TicTacToe using a two-dimensional array? [closed]使用二维数组递归检查井字游戏中的获胜者? [关闭]
【发布时间】:2023-04-02 18:31:01
【问题描述】:

我正在用 Java 制作井字游戏,我需要使用二维数组并使用递归来检查是否有赢家。

我觉得我可以轻松地对获胜者进行非递归检查,但是如果我要使用递归来做,我不知道从哪里开始,因为我对递归非常陌生。有人可以指导我从哪里开始这种算法的过程吗?

【问题讨论】:

  • 这是一个额外的学分作业。它在吞噬我,我在网上找不到任何想法。
  • 你的老师所说的递归检查到底是什么意思?你试过什么?
  • 他希望我使用递归来查看它们是否相等,而不是遍历棋盘位置并查看它们是否相等

标签: java recursion multidimensional-array


【解决方案1】:

假设您的电路板看起来像:

            |            |
 cell[0][0] | cell[1][0] | cell[2][0]
            |            |
------------+------------+------------
            |            |
 cell[0][1] | cell[1][1] | cell[2][1]
            |            |
------------+------------+------------
            |            |
 cell[0][2] | cell[1][2] | cell[2][2]
            |            |

一种方法是简单地递归检查相邻的单元格(在一个方向上)。例如(伪代码):

def checkSame (val, cellX, cellY. deltaX, deltaY):
    # No winner if check value is empty.

    if val == empty: return false

    # Winner if we've gone off edge. No need to worry about < 0
    # since one direction is always ascending but I've left it
    # in anyway.

    if cellX > 2 or cellY > 2: return true
    if cellX < 0 or cellY < 0: return true

    # No winner if piece has changed.

    if cell[cellX][cellY] != val: return false

    # Otherwise use recursion to check next one.

    return checkSame (val, cellX + deltaX, cellY + deltaY, deltaX, deltaY)

然后,我们只需要检查八个可能的起点/方向值:

# Check rows.

if checkSame (cell[0][0], 0, 0, 1, 0): return true
if checkSame (cell[0][1], 0, 1, 1, 0): return true
if checkSame (cell[0][2], 0, 2, 1, 0): return true

# Check columns.

if checkSame (cell[0][0], 0, 0, 0, 1): return true
if checkSame (cell[1][0], 1, 0, 0, 1): return true
if checkSame (cell[2][0], 2, 0, 0, 1): return true

# Check diagonals.

if checkSame (cell[0][0], 0, 0, 1, 1): return true
return checkSame (cell[0][2], 0, 2, 1, -1)

现在,当然,这是对递归的相当有限(和人为)的使用,但正如您所说,无论如何,这并不是真正适合递归的情况。最好只使用 8 个 if 语句,前提是您不打算将其扩展到超过标准的 3x3 tic-tac-toe。

【讨论】:

  • 非常感谢。这很神奇,现在我的递归思维已经扩展(我只熟悉回溯)。
【解决方案2】:

我同意为此使用递归似乎有些勉强。然而,一个想法是基于胜利的定义:在任何方向连续三个 X 或 O。首先选择一个潜在的起点(除了中间的任何地方,不能开始一个 3 方格的行),然后选择一个可能有效的方向。 (可能起作用的方向集是起始方格的函数。)递归步骤是:如果您需要 n 在一行中,例如 X,在特定方向上,并且当前position 有一个 X,然后朝该方向迈出一步,并从那里开始沿该方向连续查找 (n - 1)。当 n = 0 时停止。为每个起点和方向执行整个过程,直到找到胜利或用尽选择为止。

我认为,这足以让您入门。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多