Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用二维数组对Tictatcoe中的赢家进行递归检查?_Java_Recursion_Multidimensional Array - Fatal编程技术网

Java 使用二维数组对Tictatcoe中的赢家进行递归检查?

Java 使用二维数组对Tictatcoe中的赢家进行递归检查?,java,recursion,multidimensional-array,Java,Recursion,Multidimensional Array,我正在用Java制作一个Tictatcoe游戏,我需要使用二维数组并使用递归来检查是否有赢家 我觉得我可以很容易地为胜利者做一个非递归检查,但是如果我要使用递归来做,我不知道从哪里开始,因为我对递归非常陌生。有人能告诉我从哪里开始这样一个算法的过程吗?我同意使用递归似乎有点强迫。然而,有一个想法是基于胜利的定义:在任何方向上,X或O的三个连续点。首先选择一个潜在的起点(除了中间的任何地方,它不能开始一个3平方行),然后选择一个可能有效的方向。(可能起作用的方向集是起始方的函数。)递归步骤是:如果

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


我觉得我可以很容易地为胜利者做一个非递归检查,但是如果我要使用递归来做,我不知道从哪里开始,因为我对递归非常陌生。有人能告诉我从哪里开始这样一个算法的过程吗?

我同意使用递归似乎有点强迫。然而,有一个想法是基于胜利的定义:在任何方向上,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)