Exemplo n.º 1
0
    def manage(self, tournament: Tournament):
        ViewTournament.menu(tournament)
        choice = input()
        if choice == '9':  #
            self.leaderboard(tournament)

        if choice == '0':  # back last Menu
            return self.index()
        if choice == '1':
            self.edit(tournament)
        if tournament.player_count < 2 * tournament.rounds_total:
            if choice == '2':  # load a player
                c = PlayerController()
                player_id = c.select_player()
                if player_id is not None:
                    tournament.add_player(player_id)
        elif not tournament.rounds or tournament.rounds[-1].is_closed():
            if choice == '3':  # generate matches
                tournament.generate_matches()
        else:
            if choice == '4':  # score match of current round
                return self.match_index(tournament, tournament.rounds[-1])
            cumulated_score = tournament.rounds[-1].total_scores()
            if (choice == '5' and cumulated_score
                    == tournament.rounds_total):  # close current round
                tournament.close_last_round()

        return self.manage(tournament)
Exemplo n.º 2
0
class TournamentControler:
    """Tournament controler

    Attributes:
        screen (object): display for tournament controler
        tournament_infos (dict): Dictionnary contains infos for a tournament
        tournament (object): tournament on course
    """
    def __init__(self):
        self.screen = Screen()
        self.screen.info_users([
            "         GESTION DES TOURNOIS     ", "\n\n\n",
            "[1] Créer un tournoi", "\n", "[2] Charger un tournoi", "\n",
            "[3] Modifier un tournoi", "\n"
        ])
        self.screen.clear()
        self.screen.on_screen()

        menu = input_menu_verification(3, "Saisissez le menu désiré")

        if menu == 1:
            self.create()
        elif menu == 2:
            self.load()
        elif menu == 3:
            self.modify()

    def create(self):
        """Create a new tournmanent"""
        self.screen.info_users(
            ["               CREATION DE TOURNOI             \n\n\n"])
        self.screen.clear()
        self.screen.on_screen()
        tournament_infos = {}
        tournament_infos['id'] = max_id(tournaments_db) + 1
        tournament_infos['name'] = input("Nom du Tournoi : ")
        tournament_infos['location'] = input("Lieu du tournoi : ")
        tournament_infos['date_start'] = strftime("%A %d %B %Y %H:%M:%S")
        tournament_infos['date_end'] = "on_course"
        tournament_infos['total_round'] = ROUNDS_NB
        self.screen.info_users([
            "Choix du controleur de temps :\n", "           [1] Blitz \n",
            "           [2] Bullet \n", "           [3] Coup Rapide \n"
        ])
        self.screen.on_screen()

        controler_saisie = input_menu_verification(
            3, "Veuillez saisir le numéro correspondant à votre choix")

        if controler_saisie == 1:
            tournament_infos['time_controler'] = "Blitz"
        elif controler_saisie == 2:
            tournament_infos['time_controler'] = "Bullet"
        elif controler_saisie == 3:
            tournament_infos['time_controler'] = "Coup rapide"

        tournament_infos['description'] = input("Description : ")
        tournament_infos['players_list'] = []
        tournament_infos['rounds_list'] = []

        self.tournament = Tournament(tournament_infos)
        self.tournament.save(tournaments_db)
        self.players_on_load = []
        while len(self.tournament.players_list) < TOURNAMENT_PLAYERS_NB:
            self.add_player_on_tournament()
            self.tournament.save(tournaments_db)
        self.play()

    def add_player_on_tournament(self):
        """Add a player in a tournament"""
        self.screen.clear()
        report = Reports(players_db, tournaments_db)
        self.screen.info_users(report.list_of_players('id'))
        self.screen.add_infos([
            "{} joueurs ajoutés au tournoi".format(
                len(self.tournament.players_list))
        ])
        self.screen.on_screen()
        id_player = input_menu_verification(
            max_id(players_db),
            "Entrez le numéro du joueur à ajouter au tournoi")
        while id_player in self.players_on_load:
            self.screen.warning(
                "Le joueur {} est déjà inscrit dans ce tournoi".format(
                    id_player))
            id_player = input_menu_verification(
                max_id(players_db),
                "Entrez le numéro du joueur à ajouter au tournoi")
        valid_player = search_db(id_player, players_db)
        if valid_player is not False:
            self.tournament.add_player(valid_player)
            self.players_on_load.append(id_player)
        else:
            self.screen.warning("Le joueur {} n'existe pas.".format(id_player))
            sleep(1)

    def load(self):
        """Load a tournament"""
        report = Reports(players_db, tournaments_db)
        self.screen.clear()
        self.screen.info_users(report.tournaments_list())
        self.screen.on_screen()
        tournament_id = input_menu_verification(
            max_id(tournaments_db), "Saisissez le numéro du tournoi à charger")

        valid_tournament = search_db(tournament_id, tournaments_db)

        if valid_tournament is False:
            self.screen.warning(
                "Le tournoi {} n'existe pas.".format(tournament_id))
            sleep(1)
            self.load()
        else:
            tournament_on_load = Tournament(valid_tournament)
            tournament_on_load.deserialized()
            self.tournament = tournament_on_load
        self.players_on_load = []
        for player in self.tournament.players_list:
            self.players_on_load.append(player.player_id)

        while len(self.tournament.players_list) < TOURNAMENT_PLAYERS_NB:
            self.add_player_on_tournament()

        self.play()

    def play(self):
        """Play a tournament

        Args:
            tournament (object): Tournament object
        """
        self.screen.clear()
        tournament_infos_list = [
            self.tournament.name, "\n", "Lieu : ", self.tournament.location,
            "\n", "Début du tournoi : ", self.tournament.date_start, "\n"
        ]

        while self.tournament.round < ROUNDS_NB:
            if self.tournament.rounds_list == [] or self.tournament.rounds_list[
                    -1].date_end != 'On course':
                self.tournament.create_round()
                self.tournament.save(tournaments_db)
            while self.tournament.rounds_list[-1].date_end == 'On course':
                self.screen.info_users(
                    ["               TOURNOI EN COURS            \n\n\n"])
                self.screen.add_infos(tournament_infos_list)
                round_infos = [str(self.tournament.rounds_list[-1]), "\n\n"]
                for match in self.tournament.rounds_list[-1].matchs_list:
                    round_infos.append(str(match))
                    round_infos.append("\n")
                self.screen.add_infos(round_infos)
                self.screen.on_screen()
                self.actions()
                self.tournament.save(tournaments_db)

        if self.tournament.date_end == 'on_course':
            self.tournament.date_end = strftime("%A %d %B %Y %H:%M:%S")
            self.tournament.save(tournaments_db)

        self.tournament.players_list = sorted(
            self.tournament.players_list,
            key=lambda player: player.elo_ranking)
        self.tournament.players_list = sorted(
            self.tournament.players_list,
            key=lambda player: player.tournament_score,
            reverse=True)
        self.result()
        input_menu_verification(1, "")

    def actions(self):
        """choice of actions in tournament"""
        self.screen.info_users([
            "Actions possibles :\n",
            "            [1] Saisir le score d'un match\n",
            "            [2] Modifiez le classement d'un joueur\n"
        ])
        self.screen.on_screen()
        choice = input_menu_verification(
            2, "Saisissez le numéro de l'action souhaitée")
        if choice == 1:
            self.update_score()
        elif choice == 2:
            self.modify_player_rank()

    def update_score(self):
        """Updating a match score"""
        match_index = input_menu_verification(
            int(TOURNAMENT_PLAYERS_NB / 2),
            "Pour quel match voulez vous rentrer les résultats")
        if self.tournament.rounds_list[-1].matchs_list[
                match_index - 1].statement == "Validé":
            self.screen.info_users(["Match déjà joué."])
            sleep(1)
            self.update_score()
        player_1 = str(
            self.tournament.rounds_list[-1].matchs_list[match_index -
                                                        1].player1)
        player_2 = str(
            self.tournament.rounds_list[-1].matchs_list[match_index -
                                                        1].player2)
        self.screen.info_users([
            "Choix du score pour les joueurs :\n", "    [1] ", player_1,
            " remporte le match\n", "    [2] Match nul\n", "    [3] ",
            player_2, " remporte le match\n"
        ])
        self.screen.on_screen()
        choix_score = input_menu_verification(3, "")
        if choix_score == 1:
            score_p1 = 1
            score_p2 = 0
        elif choix_score == 2:
            score_p1 = 0.5
            score_p2 = 0.5
        elif choix_score == 3:
            score_p1 = 0
            score_p2 = 1
        self.tournament.rounds_list[-1].validate_match(match_index, score_p1,
                                                       score_p2)
        self.screen.clear()

    def modify_player_rank(self):
        """Modify a player's rank"""
        self.screen.clear()
        report = Reports(players_db, tournaments_db)
        self.screen.info_users(
            report.t_players_list(self.tournament.id, 'surname'))
        self.screen.on_screen()
        id_player = input_menu_verification(
            self.max_player_id_tournament(),
            "Saisissez l'id du joueur dont vous souhaitez modifier le rang")
        id_players_list = []
        for player in self.tournament.players_list:
            id_players_list.append(player.player_id)

        if id_player not in id_players_list:
            self.screen.warning(
                "Le joueur {} n'est pas présent dans le tournoi.".format(
                    id_player))
            sleep(1)
            self.modify_player_rank()
        new_ranking = input_menu_verification(
            1000000000, "Saisissez le nouveau classement du joueur")
        for player in self.tournament.players_list:
            if player.player_id == id_player:
                player.modify_ranking(new_ranking)
                update_item_in_db(players_db, 'elo_ranking', new_ranking,
                                  id_player)
        self.screen.clear()

    def max_player_id_tournament(self):
        """Define maximum player id"""
        i = 0
        for player in self.tournament.players_list:
            if player.player_id > i:
                i = player.player_id
        return i

    def result(self):
        """Display result for a tournament"""
        tournament_result = [
            "Classement  ", "NOM          ", "PRENOM       ", "SCORE        ",
            "\n\n"
        ]
        t_rank = 1
        for player in self.tournament.players_list:
            player_infos = []
            player_infos.append(str(t_rank))
            player_infos.append(player.surname)
            player_infos.append(player.name)
            player_infos.append(str(player.tournament_score))
            for i in range(4):
                dif = len(tournament_result[i]) - len(player_infos[i])
                if dif < 0:
                    tournament_result.append(
                        str(player_infos[i])[:(dif - 1)] + " ")
                elif dif > 0:
                    tournament_result.append(str(player_infos[i]) + dif * " ")
            tournament_result.append("\n")
            t_rank += 1

        self.screen.info_users(tournament_result)
        self.screen.on_screen()

    def modify(self):
        """Modify info for a tournament"""
        report = Reports(players_db, tournaments_db)
        self.screen.clear()
        self.screen.info_users(report.tournaments_list())
        self.screen.on_screen()

        tournament_id = input_menu_verification(
            max_id(tournaments_db),
            "Saisissez le numéro du tournoi à modifier")

        self.screen.info_users([
            "Choix de la modification :\n", "           [1] Nom \n",
            "           [2] Lieu \n", "           [3] Description \n"
        ])
        self.screen.on_screen()
        modify = input_menu_verification(
            3, "Saisissez le numéro de la donnée à modifier")
        info_modify = input("Saisissez la modification : ")
        if modify == 1:
            key = 'name'
        if modify == 2:
            key = 'location'
        if modify == 3:
            key = 'description'
        update_item_in_db(tournaments_db, key, info_modify, tournament_id)
        self.modify()