Как избежать глобальных (и использовать классы?) Python - PullRequest
0 голосов
/ 10 июня 2019

Чтобы иметь некоторое упражнение в изучении Python, особенно с объектно-ориентированным программированием.Я создаю простую текстовую игру.Я немного борюсь с использованием глобальных переменных.Люди говорят, что лучше избегать их.

Мой вопрос, как я могу заставить вещи работать без них и где объявлять эти переменные.

В настоящее время в моем методе main () я запускаю игру на основе классов для каждой комнаты или взаимодействия, которое может происходить в игре.Но есть некоторые объекты, к которым я хочу получить доступ в любое время, например враги или главный герой, такие как Здоровье, Инвентарь и т. Д. (См. Код).

Я создал глобал из этих переменных для доступа к нему в любое время, но думаю, что не должен.

Любой совет, как мне это сделать?

class Character(object):

    def __init__(self, location, accuracy):
            self.current_health = 100
        self.max_health = 100
        self.max_ammo = 20
        # self.current_ammo = 0
        self.current_ammo = 20
        # self.inventory = {}
        self.inventory = {'Gun': True}
        self.location = location
        self.accuracy = accuracy


class MainCharacter(Character):
    # some extra attributes only for the main character


class EnemyChar(Character):

    def __init__(self, location, accuracy, can_see_you=True):
        self.type = 'Alien'
        self.can_see_you = can_see_you
        super(EnemyChar, self).__init__(location, accuracy)


def main():
    # Some globals to be able to access anytime
    global enemies, main_char, keypad


    # Where we start
    first_room = 'first_room'

    # Enemies
    enemies = {
        #'Enemy_1': EnemyChar('small_ally', 30, False),
        'Enemy_1': EnemyChar(first_room, 30, False),
        'Enemy_2': EnemyChar(first_room, 90)
    }

    # You
    main_char = MainCharacter(first_room, 50)

    # Stuff to interact with
    keypad = Keypad()

    map = Map(first_room)
    game = GameEngine(map)
    game.play()


if __name__ == '__main__':
    main()

В настоящее время это работает с моими глобальными переменными, но я думаю, что это не "правильный" способ сделать это.

1 Ответ

1 голос
/ 11 июня 2019

Обычно это решается использованием некоторого глобального класса в качестве контейнера для всех этих переменных.Например:

class Game:
    def __init__(self):
        # Where we start
        self.first_room = 'first_room'

        # Enemies
        self.enemies = {
            #'Enemy_1': EnemyChar('small_ally', 30, False),
            'Enemy_1': EnemyChar(self.first_room, 30, False),
            'Enemy_2': EnemyChar(self.first_room, 90)
        }

        # You
        self.main_char = MainCharacter(self.first_room, 50)

        # Stuff to interact with
        self.keypad = Keypad()

        self.map = Map(self.first_room)
        self.game = GameEngine(map)

    def play(self):
        self.game.play()

и так далее.Теперь, когда вам нужна одна из этих переменных, вы создаете функцию, которая принимает объект Game, или вы превращаете эту функцию в метод класса Game.В вашем случае вы могли бы использовать GameEngine вместо Game.

...