Java 使用二维数组对Tictatcoe中的赢家进行递归检查?
我正在用Java制作一个Tictatcoe游戏,我需要使用二维数组并使用递归来检查是否有赢家Java 使用二维数组对Tictatcoe中的赢家进行递归检查?,java,recursion,multidimensional-array,Java,Recursion,Multidimensional Array,我正在用Java制作一个Tictatcoe游戏,我需要使用二维数组并使用递归来检查是否有赢家 我觉得我可以很容易地为胜利者做一个非递归检查,但是如果我要使用递归来做,我不知道从哪里开始,因为我对递归非常陌生。有人能告诉我从哪里开始这样一个算法的过程吗?我同意使用递归似乎有点强迫。然而,有一个想法是基于胜利的定义:在任何方向上,X或O的三个连续点。首先选择一个潜在的起点(除了中间的任何地方,它不能开始一个3平方行),然后选择一个可能有效的方向。(可能起作用的方向集是起始方的函数。)递归步骤是:如果
我觉得我可以很容易地为胜利者做一个非递归检查,但是如果我要使用递归来做,我不知道从哪里开始,因为我对递归非常陌生。有人能告诉我从哪里开始这样一个算法的过程吗?我同意使用递归似乎有点强迫。然而,有一个想法是基于胜利的定义:在任何方向上,X或O的三个连续点。首先选择一个潜在的起点(除了中间的任何地方,它不能开始一个3平方行),然后选择一个可能有效的方向。(可能起作用的方向集是起始方的函数。)递归步骤是:如果在某个特定方向上,在一行中需要n,比如X,并且当前位置有一个X,那么在该方向上迈出一步,然后从那里开始在该方向上的行中查找(n-1)。当n=0时停止。在每一个起点和方向上都要完成这整个过程,直到你找到一个胜利或选择的机会
我想这已经足够让你开始了。假设你的棋盘看起来像:
| |
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]
| |
一种方法是简单地递归检查相邻单元(在单个方向)。例如(伪代码):
现在,假设递归的使用是相当有限的(并且是人为的),但是,正如您所说的,无论如何,它并不适合递归。更好的方法是只使用八个
if
语句,前提是您不打算将其扩展到超过标准的3x3 tic tac-toe。这是一个额外的学分分配。它在折磨我,我在网上找不到任何想法。你们老师所说的递归检查到底是什么意思?你试过什么了?他不想遍历棋盘上的位置,看看它们是否相等,而是想让我用递归来看看它们是否相等。非常感谢。这是一个奇迹,现在我的递归思维已经扩展(我只熟悉回溯)。
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)