代码会检查更多的条件,如下所示。我想把它写成回忆录,但我想不出(作家们怎么阻止)。不然我怎么能优化这个呢?我知道这听起来很傻,但我的代码大部分时间都花在了函数上。
def has_three(p, board):
"""Checks if player p has three in a row"""
# For every position on the board
for i in xrange(6):
for j in xrange(7):
if board[i][j] == p:
if i<=2 and board[i+1][j]==p and board[i+2][j]==p and board[i+3][j]==0:
return True
if i>=3 and board[i-1][j]==p and board[i-2][j]==p and board[i-3][j]==0:
return True
if j<=3 and board[i][j+1]==p and board[i][j+2]==p and board[i][j+3]==0:
return True
if j>=3 and board[i][j-1]==p and board[i][j-2]==p and board[i][j-3]==0:
return True
if i<=2 and j<=3 and board[i+1][j+1]==p and board[i+2][j+2]==p and board[i+3][j+3]==0:
return True
if i<=2 and j>=3 and board[i+1][j-1]==p and board[i+2][j-2]==p and board[i+3][j-3]==0:
return True
if i>=3 and j<=3 and board[i-1][j+1]==p and board[i-2][j+2]==p and board[i-3][j+3]==0:
return True
if i>=3 and j>=3 and board[i-1][j-1]==p and board[i-2][j-2]==p and board[i-3][j-3]==0:
return True
return False发布于 2013-04-26 23:04:36
我们真的需要更多的了解游戏,以帮助你正确。另外,为什么您的程序在这个函数上花费了那么多时间?(您是否在进行某种展望,此函数是评估的一部分?)
如果这是一个像高木库这样的游戏,玩家轮流,在每个回合中,一个玩家在棋盘上放置一块,第一个在一条线中获得n的玩家获胜,那么棋盘能有一条获胜线的唯一方法是,如果这条线包括刚玩过的那块。因此,看董事会的其他观点是没有意义的。
所以在这种情况下,你会写这样的东西:
DIRECTIONS = [(1,0),(1,1),(0,1),(-1,1)]
def legal_position(i, j, board):
"""Return True if position (i, j) is a legal position on 'board'."""
return 0 <= i < len(board) and 0 <= j < len(board[0])
def winning_move(player, move, board, n = 3):
"""Return True if 'move' is part of a line of length 'n' or longer for 'player'."""
for di, dj in DIRECTIONS:
line = 0
for sign in (-1, 1):
i, j = move
while legal_position(i, j, board) and board[i][j] == player:
i += sign * di
j += sign * dj
line += 1
if line > n: # move was counted twice
return True
return False但是如果不了解你的游戏规则,我就不可能知道这种方法是否有意义。
发布于 2013-04-28 09:29:26
如果只循环遍历行、列和对角线,并在执行过程中计算连续的p's,则可以减少比较的次数。
https://codereview.stackexchange.com/questions/25550
复制相似问题