Правильный способ построения классов - проект Django dartCounter

Недавно я начал заниматься программированием. Пару дней назад я понял, как использовать Django. И теперь я пытаюсь интегрировать с ним некоторый старый код на Python.

Я создал простой dartCounter. Что довольно просто в цикле while-loop. Однако для новой версии мне нужен графический интерфейс, поэтому я решил, что должен сделать несколько подходящих классов для взаимодействия без использования циклов while для механизма подсчета. Эти классы должны использоваться в секции views.py в Django.

Дело в том, что я думаю, что я уже сделал его слишком сложным, используя этот метод.

Сначала я создал класс dart_player()

class dart_player():

    def __init__(self, name):
        self.name = name
        self.score = None
        self.leg = 0

        self.thrown_scores = []

    def set_start_score(self, start_score):
        self.score = start_score
        self.thrown_scores = []

    def update_score(self, score):
        if self.score != None:
            self.score = self.score - score
            self.thrown_scores.append(score)
        else:
            print("Error score equals 'None' \n")

    def reverse_score(self, score):
        if self.score != None:
            self.score = self.score + score
            self.thrown_scores = self.thrown_scores[:-1]
        else:
            print("Error score equals 'None' \n")

    def update_leg(self, leg):
        self.leg = self.leg + leg

Далее я создал класс dart_match() и внутри него класс leg(), поскольку нога является частью dart_match(). Этот же класс dart_match() включил в себя класс игрока, который передается через конфигурационную переменную.

class dart_match():
    def __init__(self, config = False):
        if not config:
            config = setup_match()
        self.player_config = config['player_config']
        self.match_config = config['match_config']

        self.played_legs = 0
        self.played_sets = 0


        self.names = []
        names = self.player_config.keys()
        for item in names:
            self.names.append(item)

    def start_leg(self):
        self.leg1 = self.leg(self.names, self.match_config, self.player_config)

    class leg():
        def __init__(self, names, match_config, player_config):
            self.names = names
            self.match_config = match_config
            self.player_config = player_config


            self.count = 1
            self.statistics = {}

            for player_name in names:
                self.statistics[player_name] = {}

        def get_player(self):

            if self.match_config['teams'] == False and self.match_config['player_count'] == 2:
                if self.count % 2:
                    return (self.player_config[self.names[0]])
                elif self.count % 2 - 1:
                    return (self.player_config[self.names[1]])

        def roulette_player(self):
            if self.match_config['teams'] == False and self.match_config['player_count'] == 2:
                self.count += 1
                '''
                
                if self.count % 2:
                    self.play_leg()
                    # round(self.player_config[self.names[0]])
                    #round_score = self.player_config[self.names[0]].score
                    # print("---------------------")
                elif self.count % 2 - 1:
                    self.play_leg()
                    #round(self.player_config[self.names[1]])
                    #round_score = self.player_config[self.names[1]].score
                self.count += 1
                '''

        def reverse(self):
            if self.count > 1:
                self.count -= 1
                player = self.get_player()
                del self.statistics[player.name][self.count]
                print("self.count")
            elif self.count <= 1 :
                print("Start of the leg is reached")

        def play_turn(self):
            player = self.get_player()
            print("Player {}'s turn".format(player.name))
            filling_field = int(input("Enter desire \n"))

            if type(filling_field) == int:
                score = round(player, filling_field)
                self.statistics[player.name][self.count] = score
                if score == 0:
                    self.winner =  player.name
                self.count+=1



            elif filling_field == str("reverse"):
                print("Reverse entered")

            else:
                print("Error occured wrong input value")
                #exit()

Для запуска этого класса я сделал функцию для генерации соответствующего конфигурационного файла (который в основном должен соотноситься со страницей настроек графического интерфейса:

).
def setup_match(start_score = 501, legs = 3, sets = 1, win_settings = "best of", player_count = 2, teams = False):
    ###match config

    if teams == True:
        team_config = {}
    player_config = {}

    match_config = {
        'teams' : teams,
        'player_count': player_count,
        'start_score' : start_score,
        'legs': legs,
        'sets': sets,
        'win_settings' : win_settings
    }

    playerName = None
    while len(player_config) < player_count:
        playerName = input('enter playername: \n')
        try:
            player_config[playerName] = { 'start_score': start_score}

        except:
            print("Input Error \n")


    for player in player_config:
        player_config[player] = dart_player(name=player)
        player_config[player].set_start_score(start_score)
        print(player)
        #dart_player.name = player
    #player1 = dart_player(name = "mirno")

    config = {
        'player_config': player_config,
        'match_config': match_config
    }

    return config

Чтобы показать вам некоторые примеры кода и то, как я планирую с ним взаимодействовать: config = setup_match()

предлагает 2 имени: менно бенно

Далее я ввожу этот конфигурационный файл в класс dart_match. match = dart_match(config = config)

Теперь мы можем взаимодействовать с матчем.

  • match.names > ['menno', 'benno']
  • match.played_legs > 0
  • match.player_config['menno'] > Класс dart_player создан для Menno. С ним можно взаимодействовать внутри ноги для управления счетом.

Теперь мы можем начать с ноги. match.start_leg()

На данный момент это создаст класс ноги match.leg1 для взаимодействия внутри матча. (Я знаю, что параметризация не должна быть статически приписана к leg1. Но это будет улучшено)

Например, чтобы взаимодействовать с ногой. Мы можем увидеть, какой игрок в данный момент находится на очереди: match.leg1.get_player().name 'menno'

Далее мы хотим запустить наш ход этой ноги. match.leg1.play_turn() вход: 50 Ход игрока menno Менно, твой счет: 501

451 осталось

Как мы видим, это повторит счет Менно на 50 очков. И ищем следующий ход:

match.leg1.get_player().name 'benno'

Мы видим, что сейчас очередь Бенно.


Как видите, структура классов стала довольно сложной для того, что должно быть довольно простым. И не совсем удобной для использования и взаимодействия, на мой взгляд.

Кроме некоторых ошибок и несоответствий, у кого-нибудь есть идея, как подойти к этой конструкции классов лучше/более разумно.

Раздражает эта структура.

  • Создайте конфигурационный файл и добавьте в класс (player_config & match_config)
  • В конфиг файле созданы игроки и ссылки на них в словаре.
  • Класс leg, внутри класса dart_match использует словарь player_config. Содержит класс dart_player для взаимодействия с пользовательским счетом.

По какой-то причине я не смог придумать лучший способ реализации этой части. Какие обычно существуют хорошие подходы для решения таких проблем со структурой класса ?

Вернуться на верх