Algorithm 在零和交叉中检测获胜游戏

Algorithm 在零和交叉中检测获胜游戏,algorithm,tic-tac-toe,Algorithm,Tic Tac Toe,我需要知道在一场零和传中发现一个胜利的移动的最佳方法。源代码不重要,我只需要一个例子或一些我可以开始 我唯一能想到的就是使用循环,测试玩家每一个动作的每个方向,比如连续搜索五个。有没有一种更快更有效的方法?我不知道还有比循环更好的方法,但电路板太小了,非常简单 一点Python psuedo代码: def get_winner(board): if board[0][0] != EMPTY and board[0][0] == board[1][1] == board[2][2]:

我需要知道在一场零和传中发现一个胜利的移动的最佳方法。源代码不重要,我只需要一个例子或一些我可以开始


我唯一能想到的就是使用循环,测试玩家每一个动作的每个方向,比如连续搜索五个。有没有一种更快更有效的方法?

我不知道还有比循环更好的方法,但电路板太小了,非常简单

一点Python psuedo代码:

def get_winner(board):
    if board[0][0] != EMPTY and board[0][0] == board[1][1] == board[2][2]:
        return board[0][0]
    if board[2][0] != EMPTY and board[2][0] == board[1][1] == board[0][2]:
        return board[2][0]
    for i in xrange(3):
        if board[i][0] != EMPTY and board[i][0] == board[i][1] == board[i][2]:
            return board[i][0]
        if board[0][i] != EMPTY and board[0][i] == board[1][i] == board[2][i]:
            return board[0][i]

有更有效的方法,但它们真正重要的是当你扩展这个游戏以获得更大的棋盘配置时。例如,如果在定向对象中存储了零和叉的分组(例如,存储对角线配置),则可以按长度
winLength-1
的分组进行排序,并仅针对这些分组测试新移动。您可以保存一些迭代,但必须在内存中保留大量额外信息。

这是一个表示问题。如何存储游戏板?现在,跳出框框思考;你还能怎么储存它呢?例如,您可以将棋盘表示为一对位图,一个表示零,一个表示十字,然后进行数字模式匹配以检测获胜条件。

真正简单的解决方案是只检查最后一步的情况……显然,之前的任何一步都不可能赢得比赛,或者你不会在这里…所以你只需要检查一下,看看在刚刚放置的移动周围的行/列/对角线中是否有5个(或多个)

例如,如果电路板看起来像这样,并且X标记最近的移动:

.............
.............
.............
.............
.....X.......
.............
.............
.............
.............
.............
您不需要检查任何超出“C”范围的内容:

这有用吗?(看起来你在最初的问题中可能暗示了这一点,但我不确定。)

除此之外,简单循环将成为您最好的朋友。您可能会做一些微优化,但(取决于您的实际应用程序正在做什么)这可能不值得

有一点要注意的是,你不能仅仅从最近的一个方向跳出5个方向,连续寻找很多,因为这个动作可能是在一个连线中。所以我会这样做

From the new move
    left = how many in a row we have to the left of the lastest move
    right = how many in a row we have to the right of the latest move
    if (left + right + 1 >= 5) then you have a winner

    up = how many in a row we have above the latest move
    down = how many in a row we have below the latest move
    if (up + down + 1 >= 5) then you have a winner

    // repeat for both diagonal directions.
以3X3板为例

设X=1 设O=-1 一个空间用零表示

因此,如果最上面一行看起来像这个[X][X][X],那么总和是3,因此这是一场胜利 [O] [O][O]总数为-3,因此是另一场胜利

[x][x][]是2,因此如果是x回合,他可以通过移动到空白,或者O必须阻止。 [十] [O][X]为1,因此不赢

在3x3板中,有8个位置需要评估

在NXN中,数字越来越大,但想法保持不变

如果N=8,并且一行或一列的总和为7,那么您知道该行/列上的X是成功的

那种方法在我高中时很管用

祝福


邪恶

零和叉是一个巧妙的编程挑战,因为有很多数学技巧可以用来简化问题

零和十字通常是3乘3的网格。如果在网格中为每个位置指定一个从1到9的数字(而不是数字顺序),则可以排列这些数字,使每个水平、垂直和对角行的总和达到15

+----+----+----+
| 4  | 3  | 8  |
|    |    |    |
+----+----+----+
| 9  | 5  | 1  |
|    |    |    |
+----+----+----+
| 2  | 7  | 6  |
|    |    |    |
+----+----+----+ 

那为什么有用?如果您可以选择属于“O”或“X”的任意三个方块,并且这三个方块的总和为15,那么您就知道该玩家赢得了比赛。

很抱歉,我忘了提到这一点,我需要在一个可以是任何大小的棋盘中检测获胜的游戏,而不仅仅是3x3Hmm,?你在评论中说棋盘不需要是3x3…如果你需要连续赢5场,那么5x5游戏基本上是不可能赢的,所以我假设赢的长度可以小于棋盘长度…对吗?你可能想更新你的问题,使它更清楚一点。@EvilTeach:Bleh。遗憾的投票给了人们不应有的支持。我猜测,否决投票的原因是:这个解决方案是可行的,但我无法想象它能很好地扩展,而试图阅读和维护它将是丑陋的。简单的事情显而易见,为什么还要去做困难的事情呢?(如果我不知道这是如何直截了当的,请直截了当地告诉我)。@Beska:我不否认我暗指的是潜在的丑陋代码。我想指出的是,可能有更多的方式来表示数据,而不是简单的方式,通过仔细的表示,你可能可以为自己设置一个算法胜利。如果董事会规模大于获胜所需的数量,这是行不通的。例如,如果棋盘宽度为12,并且需要连续3个棋盘才能获胜,而最上面一行有ooxxxoxooxo,则得分为-2…但X赢了。(OP在评论中说,棋盘不需要是3x3…如果你需要5连胜,5x5游戏基本上是不赢的,所以我假设赢的长度可以小于棋盘长度)是的,在我看来,如果你的棋盘是nxn,你需要N连胜。这就是所谓的魔方。更大的魔方确实存在。这听起来很有趣,但我真的不明白如何使用它来检测胜利。
+----+----+----+
| 4  | 3  | 8  |
|    |    |    |
+----+----+----+
| 9  | 5  | 1  |
|    |    |    |
+----+----+----+
| 2  | 7  | 6  |
|    |    |    |
+----+----+----+