使用二维数组对TicTacToe的获胜者进行递归检查?

时间:2012-04-06 02:51:37

标签: java recursion multidimensional-array

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

我觉得我可以很容易地对胜利者进行非递归检查,但是如果我使用递归来做这件事我不知道从哪里开始,因为我在递归时非常新。有人可以指导我在哪里开始这种算法的过程吗?

2 个答案:

答案 0 :(得分:1)

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

我认为这足以让你开始。

答案 1 :(得分: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)

现在,授予这是一种相当有限(并且已经设计)的递归使用,但正如你所说,它并不是真正适合递归的情况。如果您没有计划将其扩展到超过标准的3x3井字游戏,那么使用八个if语句会好得多。