Любой способ ссылаться на модули / переменные из функции? - PullRequest
0 голосов
/ 31 октября 2019

Просто чтобы попрактиковаться в Python, я пытаюсь создать простую игру. У меня возникла проблема с созданием функции, которая будет брать ресурс из банка и добавлять его в запас игрока, и наоборот.

Мне удалось добиться успеха, если я жестко закодировал все, что работает, но это не СУХОЙ и требует много кода только для простого сложения / вычитания. Ниже приведен код, который у меня есть только для двух ресурсов, но есть 10-15 ресурсов, которые будут нуждаться в такой же обработке.

Примечание: банк - это ссылка на модуль, а не экземпляр объекта, но pэто вызов экземпляра класса Player.

def transfer_resource(receive_or_send, resource_name, qty, player_instance):
    if receive_or_send == "receive":
        if resource_name == "yellow_cake":
            bank.yellow_cake -= qty
            player_instance.yellow_cake += qty
        elif resource_name == "dollars":
            bank.dollars -= qty
            player_instance.dollars += qty
    elif receive_or_send == "send":
        if resource_name == "yellow_cake":
            player_instance.yellow_cake -= qty
            bank.yellow_cake += qty     
        elif resource_name == "dollars":
            player_instance.yellow_cake -= qty
            bank.yellow_cake += qty 

С вызовом функции, подобным этому:

transfer_resource("receive", "yellow_cake", 10, p)

было бы хорошо, если бы я мог сделать что-то вроде этого:


def transfer_resource(receive_from, send_to, resource, qty):
    receive_from.resource -= qty
    send_to.resource += qty

с вызовом функции вроде:

transfer_resource(bank, p, yellow_cake, 10)

Есть идеи? Я новичок, поэтому любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

например, в классе Player у меня было это в init :

self.yellow_cake = 0

и это в модуле банка:

yellow_cake = 40

икогда я назвал это:

def transfer_resource(send_from, send_to, resource, qty):
    send_from.resource -= qty
    send_to.resource += qty

transfer_resource(bank, p, yellow_cake, 10)

, он возвращает ошибку имени, говоря, что имя «банк» не определено.

0 голосов
/ 31 октября 2019

Вы можете создать словарь Python (например, resources) в модуле банка и классе Player, чтобы сохранить их как пару key,value, используя такие ресурсы, как yellow_cake и dollarsв качестве ключа и соответствующего количества в качестве значения

resources = {"yellow_cake": 10, "dollars": 20}

def transfer_resource(receive_from, send_to, resource, qty):
    receive_from.resources[resource] -= qty
    send_to.resources[resource] += qty

transfer_resource(bank, p, "yellow_cake", 10)

Или просто передайте ссылку yellow_cake из банка и p напрямую (зависит от вашего дизайна)

def transfer_resource(receive_from_resource, send_to_resource, qty):
    receive_from_resource -= qty
    send_to_resource += qty

transfer_resource(bank.yellow_cake, p.yellow_cake, 10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...