检测’赢’

1.1 说明

检测我方棋子移动后,是否获胜的判断逻辑

  1. 每当落子后,判断对方的任意一步棋子走位后,是否不会被我方将军
  2. 如果对方所有的棋子假设走棋后都不能阻挡“将军”,那么此时我方获胜
  3. 如果对方有任意一颗棋子在走棋后能够阻挡“将军”,那么此时仅仅是将军而不是获胜

1.2 代码实现

# 剔除哪些被"将军"的位置
put_down_chess_pos = self.judge_delete_position(put_down_chess_pos, clicked_chess)
def judge_delete_position(self, all_position, clicked_chess):
        """
        删除被"将军"的位置
        """
        # 定义要删除的列表
        deleting_position = list()

        # 判断这些位置,是否会导致被"将军",如果是则从列表中删除这个位置
        for row, col in all_position:
            # 1. 备份
            # 备份当前棋子位置
            old_row, old_col = clicked_chess.row, clicked_chess.col
            # 备份要落子的位置的棋子(如果没有,则为None)
            position_chess_backup = self.chessboard_map[row][col]
            # 2. 挪动位置
            # 移动位置
            self.chessboard_map[row][col] = self.chessboard_map[old_row][old_col]
            # 修改棋子的属性
            self.chessboard_map[row][col].update_postion(row, col)
            # 清楚之前位置为None
            self.chessboard_map[old_row][old_col] = None
            # 3. 判断对方是否可以发起"将军"
            if self.judge_attack_general("b" if clicked_chess.team == "r" else "r"):
                deleting_position.append((row, col))
            # 4. 恢复到之前位置
            self.chessboard_map[old_row][old_col] = self.chessboard_map[row][col]
            self.chessboard_map[old_row][old_col].update_postion(old_row, old_col)
            self.chessboard_map[row][col] = position_chess_backup

        # 5. 删除不能落子的位置
        all_position = list(set(all_position) - set(deleting_position))

        return all_position

image-20210821201413053

    def judge_win(self, attack_player):
        """
        判断是否获胜
        """
        # 依次判断是否被攻击方的所有棋子,是否有阻挡攻击的可能
        for chess_line in self.chessboard_map:
            for chess in chess_line:
                if chess and chess.team != attack_player:
                    move_position_list = self.get_put_down_postion(chess)
                    if move_position_list:  # 只要找到一个可以移动的位置,就表示没有失败,还是有机会的
                        return False

        return True

image-20210821201822564

# 检测对方是否可以挽救棋局,如果能挽救,就显示"将军",否则显示"胜利"
if chessboard.judge_win(game.get_player()):
    print("获胜...")
else:

image-20210821201926239

1.3 运行效果

img

在测试的时候,需要自己制造获胜的场景,像上图显示的效果就是获胜的场景,此时在终端显示了“获胜”信息

Copyright © itprojects.cn 2021 all right reserved,著作权归itprojects.cn所有,由王铭东编写该文件修订时间: 2021-08-21 20:34:56