我正在使用Java制作TicTacToe游戏我需要使用二维数组并使用递归来检查是否有赢家。
我觉得我可以很容易地对胜利者进行非递归检查,但是如果我使用递归来做这件事我不知道从哪里开始,因为我在递归时非常新。有人可以指导我在哪里开始这种算法的过程吗?
答案 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
语句会好得多。