Python 0x88棋盘表示法中的行号。

Python 0x88棋盘表示法中的行号。,python,chess,Python,Chess,我正在做一个函数,如果一个移动是伪合法的,它将返回True。问题是,为了确定棋子是否在起始位置,我必须循环这一行中的所有方块,看看棋子所在的方块是否在该范围内。有更好的方法吗?我能算出当铺的行号吗 # Pawn. if piece == PAWN: if not from_piece & 8: # White pawn. if start_point < end_point: # Can't move backwards.

我正在做一个函数,如果一个移动是伪合法的,它将返回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 
#典当。
如果工件==典当:
如果不是来自第8块:#白色棋子。
如果起点<终点:#不能向后移动。
返回错误
elif diff==32,起始点在范围(96104)内,非线路板[起始点-16]和非线路板[结束点]:
通过有效案例,跳过下一个elif语句。可以在起始位置移动2个空格。
伊里夫·迪夫!=16:
返回错误
否则:#黑兵。
如果开始点>结束点:#不能向后移动。
返回错误
elif diff==32,起始点在范围(16,24)内,非线路板[end_point+16]和非线路板[end_point]:
通过有效案例,跳过下一个elif语句。可以在起始位置移动2个空格。
伊里夫·迪夫!=16:
返回错误
如果diff==16和board[end_point]:#如果已经有一块,则无法向前移动一个正方形。
返回错误
elif(diff==15或diff==17)和board[终点]:#在没有敌人棋子的情况下,不能移动一步对角线。
返回错误
返回真值
我制作了这个程序,使白兵的值为1,黑兵的值为9。空正方形由0表示


多谢各位

你可能想重新考虑一下你的模型,我觉得它有点不必要的复杂。但是,您可以使用整数除法代替循环:

(...)
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 = [...]

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
board=[…]
def xy288(字段):
“”“从(列,行)转换为[0…127]””
返回字段[0]*16+字段[1]
def为白色(字段):

board[xy288(field)]您可能需要重新考虑您的模型,它对我来说有点不必要的复杂。但是,您可以使用整数除法代替循环:

(...)
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 = [...]

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
board=[…]
def xy288(字段):
“”“从(列,行)转换为[0…127]””
返回字段[0]*16+字段[1]
def为白色(字段):

董事会[xy288(现场)]谢谢,这正是我要找的。但是,请你解释一下为什么它看起来太复杂,我非常愿意相应地修改我的代码。再次感谢你的回答。谢谢,这正是我想要的。但是,请你解释一下为什么它看起来太复杂,我非常愿意相应地修改我的代码。再次感谢你的回答。