2

私はPythonが初めてで、単純なチェストゲームで検証関数を作成して達成しようとしています:

ピースは完全に伸びる必要があります (つまり、B7:E4 のように移動方向に移動し、別のピース F4 をブロックします。これは合法的な動きです)。

ここに画像の説明を入力

def validate_move_rule(from_position, to_position, position_hash):
    blocker_position = []
    blocker_position.extend(position_hash)
    if(abs((int(to_position[1]) - int(from_position[1]))) == abs(ord(to_position[0]) - ord(from_position[0]))):
        if((int(to_position[1]) - int(from_position[1])) > 0 and (ord(to_position[0]) - ord(from_position[0])) > 0):
            next_position = str_plus(to_position[0],1) + str(int(to_position[1]) + 1)
            if(next_position in blocker_position):
                return True
        elif((int(to_position[1]) - int(from_position[1])) < 0 and (ord(to_position[0]) - ord(from_position[0])) < 0):
            next_position = str_plus(to_position[0],-1) + str(int(to_position[1]) - 1)
            if(next_position in blocker_position):
                return True
            #   left_up
        elif((int(to_position[1]) - int(from_position[1])) > 0 and (ord(to_position[0]) - ord(from_position[0])) < 0):
            next_position = str_plus(to_position[0],1) + str(int(to_position[1]) - 1)
            if(next_position in blocker_position):
                return True
            #left_down
        elif((int(to_position[1]) - int(from_position[1])) < 0 and (ord(to_position[0]) - ord(from_position[0])) > 0):
            next_position = str_plus(to_position[0], -1) + str(int(to_position[1]) + 1)
            if(next_position in blocker_position):
                return True
            #right_up
    elif(from_position[1] == to_position[1]):
        if((ord(to_position[0]) - ord(from_position[0])) > 0):
            next_position = str_plus(to_position[0],1) + to_position[1]
            if(next_position in blocker_position):
                return True
            #right
        elif((ord(to_position[0]) - ord(from_position[0])) < 0):
            next_position = str_plus(to_position[0],-1) + to_position[1]
            if(next_position in blocker_position):
                return True
            #left
    elif(from_position[0] == to_position[0]):
        if((int(to_position[1]) - int(from_position[1])) > 0):
            next_position = to_position[0] + str(int(to_position[1]) + 1)
            if(next_position in blocker_position):
                return True
            #down
        elif((int(to_position[1]) - int(from_position[1])) < 0):
            next_position = to_position[0] + str(int(to_position[1]) - 1)
            if(next_position in blocker_position):
                return True
            #up
    else:
        puts("Error: it's not a legal move(hint: must diagonal horizontal vertical)")
        return False

私のコードは本当に退屈だと思いました.Pythonにはコードを簡素化する機能が必要だと思いました.何か提案はありますか?

4

2 に答える 2

4
  • 位置間の差に変数を使用する
  • blocker_position チェックを一番下に移動
  • blocker_position は必要ありません
  • 関数の最初または最後にのみ int()/str() を使用します
  • 中央のセクションでは、x と y の値ではなく、どれだけ変化するかを把握するだけです

そのようです:

def validate_move_rule(from_position, to_position, position_hash):
    to_pos_x = ord(to_position[0])
    to_pos_y = int(to_position[1])
    delta_pos_x = to_pos_x - ord(from_position[0]) # x
    delta_pos_y = to_pos_y - int(from_position[1]) # y

    delta_x = 0
    delta_y = 0

    if abs(delta_pos_x) == abs(delta_pos_y): 
        # diagonal
        delta_x = 1 if delta_pos_x > 0 else -1
        delta_y = 1 if delta_pos_y > 0 else -1
    elif from_position[1] == to_position[1]: 
        # horizontal     
        delta_x = 1 if delta_pos_x > 0 else -1
    elif from_position[0] == to_position[0]: 
        # vertical     
        delta_y = 1 if delta_pos_y > 0 else -1
    else:
        puts("Error: it's not a legal move(hint: must diagonal horizontal vertical)")
        return False

    new_position = chr(to_pos_x + delta_x) + str(to_pos_y + delta_y)
    return new_position in position_hash
于 2012-10-11T06:02:56.703 に答える
0

ブール値の小さなテーブルについて考えてみてください。有効または無効。

于 2012-10-11T15:25:15.087 に答える