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アプローチのように見えると思います。それには何の問題もありませんが、ほとんどのpythonistaは、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 に答える