Den*_*nis 7 algorithm tic-tac-toe
我需要知道在一场比赛和十字架比赛中发现胜利动作的最佳方法.源代码没关系,我只需要一个例子或者我可以开始的东西.
我唯一能想到的就是使用循环并测试玩家每次移动的每个方向,以搜索例如连续五次.有更快更有效的方法吗?
真正简单的解决方案就是从最后一次移动中检查......显然,之前的移动不会赢得比赛,或者你不会在这里...所以你只需要检查一下是否有5(或许多)在刚放置的移动周围的行/列/对角线.
例如,如果电路板看起来像这样,X标记最近的移动:
.............
.............
.............
.............
.....X.......
.............
.............
.............
.............
.............
Run Code Online (Sandbox Code Playgroud)
您无需检查"C"范围之外的任何内容:
.C...C...C...
..C..C..C....
...C.C.C.....
....CCC......
.CCCCXCCCC...
....CCC......
...C.C.C.....
..C..C..C....
.C...C...C...
.............
Run Code Online (Sandbox Code Playgroud)
这有帮助吗?(看起来你可能在原来的问题中提到了这一点,但我不确定.)
除此之外,简单的循环将成为你最好的朋友.你可以做一些微优化,但是(取决于你的实际应用程序在做什么)它可能不值得.
要记住的一件事是你不能从最近一次寻找连续多次的动作中向任何方向跳出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.
Run Code Online (Sandbox Code Playgroud)
小智 7
Noughts和十字架是一个简洁的编程挑战,因为你可以使用很多数学技巧来简化问题.
Noughts和十字架通常是3乘3的网格.如果为网格中的每个位置指定一个从1到9的数字(不是按数字顺序排列),则可以排列数字,以便每个水平,垂直和对角线行总计最多15个
+----+----+----+
| 4 | 3 | 8 |
| | | |
+----+----+----+
| 9 | 5 | 1 |
| | | |
+----+----+----+
| 2 | 7 | 6 |
| | | |
+----+----+----+
Run Code Online (Sandbox Code Playgroud)
为什么那么有用?如果您可以选择属于"O"或"X"的任意三个方格,并且这三个方格总计为15,那么您就知道该玩家赢得了比赛.
我不知道还有比循环更好的方法,但是板子太小了,它非常微不足道。
一些 Python 伪代码:
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]
Run Code Online (Sandbox Code Playgroud)