コード例 #1
0
ファイル: main.py プロジェクト: nynon-afk/Checkers-with-ai
def main():
    pygame.init()
    fps_clock = pygame.time.Clock()
    pygame.display.set_caption('Checkers')

    main_board = Board()
    main_display = Display()

    spoty = 0
    spotx = 0
    mousex = 0
    mousey = 0
    mouse_clicked = False
    board = main_board.get_newboard()
    human_player = Player(Colour.WHITE.value, True)
    ai_player = Player(Colour.RED.value, False)
    computer = Computer(ai_player, human_player, Colour.RED.value)
    move = Move()

    while True:  # Main game loop
        current_player = Player.select_player_with_turn(
            human_player, ai_player)
        main_display.update_board(board)

        if human_player.turn is True:  # human player turn
            is_attacked = human_player.is_piece_attacked(
                board)  # checks if piece is attacked
            main_display.check_for_quit()

            for event in pygame.event.get(
            ):  # catch mouseclicks and mouse position
                if event.type == MOUSEMOTION:
                    mousey, mousex = event.pos
                if event.type == MOUSEBUTTONUP:
                    spoty, spotx = main_display.get_spot_clicked(
                        board, event.pos[0], event.pos[1])
                    mouse_clicked = True
            main_display.highlight_while_hovering(board, main_display,
                                                  mouse_clicked, mousey,
                                                  mousex)
            piece = board[spoty][spotx]

            if isinstance(
                    piece, Piece
            ) and piece.colour == human_player.colour and mouse_clicked is True:
                available_moves, attack = piece.get_all_available_moves(board)
                has_attacked = False

                # While loop for handling attack moves. If there's no attack available, this loop is skipped.
                while any(True in sublist
                          for sublist in available_moves) and attack is True:
                    main_display.highlight_available_moves(
                        available_moves)  # displays available attacks
                    event = pygame.event.wait()
                    main_display.check_for_quit()

                    if event.type == MOUSEBUTTONUP:
                        field_to_move_y, field_to_move_x = main_display.get_spot_clicked(
                            board, event.pos[0], event.pos[1])

                        if available_moves[field_to_move_y][
                                field_to_move_x] is True:
                            main_display.attack_piece_animation(
                                board, field_to_move_y, field_to_move_x,
                                piece.colour, spoty, spotx)
                            piece.attack_piece(board, field_to_move_y,
                                               field_to_move_x)

                            spoty, spotx = field_to_move_y, field_to_move_x

                            if isinstance(piece, Pawn):
                                piece.check_for_promotion(board)

                            available_moves, attack = piece.get_all_available_moves(
                                board)
                            has_attacked = True

                        elif has_attacked is False:
                            break  # return to piece selection

                # while loop for handling non attack moves
                while any(True in sublist for sublist in available_moves
                          ) and not has_attacked and not is_attacked:
                    main_display.highlight_available_moves(available_moves)
                    event = pygame.event.wait()
                    main_display.check_for_quit()

                    if event.type == MOUSEBUTTONUP:  # catch mouseclicks
                        field_to_move_y, field_to_move_x = main_display.get_spot_clicked(
                            board, event.pos[0], event.pos[1])

                        if available_moves[field_to_move_y][
                                field_to_move_x] is True:
                            main_display.move_piece_animation(
                                board, field_to_move_y, field_to_move_x,
                                piece.colour, spoty, spotx)
                            piece.make_move(board, field_to_move_y,
                                            field_to_move_x)
                            spoty, spotx = field_to_move_y, field_to_move_x

                            if isinstance(piece, Pawn):
                                piece.check_for_promotion(board)

                            # end his turn
                            human_player.switch_turns(human_player, ai_player)
                            mousey, mousex = event.pos
                            available_moves = [[]]
                        else:
                            break  # return to piece selection

                if has_attacked:  # end his turn
                    human_player.switch_turns(human_player, ai_player)
                    mousey, mousex = event.pos

        else:  # Computer turn
            value, best_move = computer.alpha_beta(5, True, -math.inf,
                                                   math.inf, board)
            if best_move[4] is not None:
                move.attack(board, best_move[0], best_move[1], best_move[2],
                            best_move[3], best_move[4])
                main_display.draw_computer_highlight(best_move[0],
                                                     best_move[1])

                piece = board[best_move[0]][best_move[1]]
                if isinstance(piece, Pawn):
                    piece.check_for_promotion(board)

                can_attack_again = piece.can_piece_attack(board)
                while can_attack_again is True:  # can move after multi-attack, check this function
                    value, best_move = computer.alpha_beta(
                        5, True, math.inf, -math.inf, board)
                    move.attack(board, best_move[0], best_move[1],
                                best_move[2], best_move[3], best_move[4])
                    main_display.draw_computer_highlight(
                        best_move[0], best_move[1])

                    piece = board[best_move[0]][best_move[1]]
                    if isinstance(piece, Pawn):
                        piece.check_for_promotion(board)

                    can_attack_again = piece.can_piece_attack(board)

            else:  # non attack touple doesnt have any fifth item
                move.move(board, best_move[0], best_move[1], best_move[2],
                          best_move[3])
                main_display.draw_computer_highlight(best_move[0],
                                                     best_move[1])
                piece = board[best_move[0]][best_move[1]]

                if isinstance(piece, Pawn):
                    piece.check_for_promotion(board)

            ai_player.switch_turns(human_player, ai_player)
            pygame.display.update()
            pygame.time.wait(300)

        # Redraw screen and wait a clock tick.
        current_player.check_for_victory(board, main_display)
        mouse_clicked = False
        pygame.display.update()
        fps_clock.tick()