1

如果移动是伪合法的,我正在制作一个返回 True 的函数。问题是,为了找出棋子是否在它的起始位置,我必须循环这一行中的所有方格,看看棋子所在的方格是否在那个范围内。有一个更好的方法吗 ?我可以以某种方式计算典当所在的行号或其他东西吗?

# Pawn.
    if piece == PAWN:
        if not from_piece & 8: # White pawn.
            if start_point < end_point: # Can't move backwards.
                return False
            elif diff == 32 and start_point in range(96, 104) and not board[start_point - 16] and not board[end_point]:
                pass # Valid case, skip next elif statement. Can move 2 spaces at the starting position. 
            elif diff != 16:
                return False 

        else: # Black pawn.
            if start_point > end_point: # Can't move backwards.
                return False
            elif diff == 32 and start_point in range(16, 24) and not board[end_point + 16] and not board[end_point]:
                pass # Valid case, skip next elif statement. Can move 2 spaces at the starting position. 
            elif diff != 16:
                return False 

        if diff == 16 and board[end_point]: # Can't move ahead one square if there's already a piece.
            return False 
        elif (diff == 15 or diff == 17) and board[end_point]: # Can't move one step diagonal when there's no enemy piece. 
            return False
return True 

我编写了程序,让白棋的值为 1,黑棋的值为 9。空方格用 0 表示。

非常感谢你。

4

1 回答 1

1

您可能想重新考虑您的模型,对我来说它看起来有点不必要的复杂。但是,您可以进行整数除法,而不是循环:

(...)
elif diff == 32 and start_point / 16 == 6 and not board[end_point + 16] and not board[end_point]:
    (...)

elif diff == 32 and start_point / 16 == 1 and not board[end_point + 16] and not board[end_point]:
    (...)

编辑(回复评论):

就个人而言,我认为您的代码看起来像是用 Python 完成的典型 C 表示数据的方法。这并没有错,但我怀疑大多数 pythonistas 会做一些事情,比如定义一个board类或提供一些实用方法:

board = [...]

def xy288(field):
    """Converts from (col, row) to [0...127]"""
    return field[0] * 16 + field[1]

def is_white(field):
    board[xy288(field)] <=8

def row(field):
    return field[0]

def col(field):
    return field[1]

def is_pawn(field):
    return board[xy288(field)] % 8 == PAWN

def is_empty(field):
    return board[xy288(field)] == 0

def valid_move(start, end):
    # use tuples for encoding start and end, ie. start = (4,7)
    if is_pawn(start):
        direction = 1 if is_white(start) else -1
        if col(start) == col(end) and \
           row(start) == row(end) + 2*direction and \
           is_empty(end) and \
           is_empty((row(start) + direction, col(start)):
           pass

这个想法是使代码具有语义和自包含性,即我不必查看板的定义方式来了解valid_move 的工作原理。请注意,Python 中具有全局范围的变量可能非常棘手 - 即。在这个例子中它可以工作,但是如果你在一个函数中改变或分配一个变量,它会自动假设本地范围。

于 2012-07-23T09:26:26.787 回答