Как правильно использовать al oop в системе инвентаря игры Python? - PullRequest
0 голосов
/ 19 июня 2020

Я собираю систему инвентаря для игры-одевалки (Python / Ren'py), и я застрял на самом последнем препятствии. У меня есть объект Inventory, объект Clothing и Items настроены следующим образом:

class Clothing(store.object):
    def __init__(self,name,desc,place):
        self.name = name
        self.desc = desc
        self.place = place
        place = []

class Inventory(store.object):
    def __init__(self, name):
        self.name=name
        self.wearing=[]


    def wear(self,item):
        self.wearing.append(item)
        return

    def is_wearing(self, item):
        if item in self.wearing:
            return True
        else:
            return False

    def remove(self,item):
        if item in self.wearing:
            self.wearing.remove(item)
        return

    def drop(self, item):
        self.wearing.remove(item)

    def remove_all(self):
        list = [item for item in self.wearing]
        if list!=[]:
            for item in list:
                self.wearing.remove(item)
        return

player_inv = Inventory("Player")
wardrobe_inv = Inventory("Wardrobe")

jeans = Clothing(name="Jeans", desc="blue jeans", place=["legs"])
tshirt = Clothing(name="T-shirt", desc="white tee", place=["torso"])
boxers = Clothing(name="Boxer shorts", desc="white boxer shorts", place=["crotch"])
dress = Clothing(name="Dress", desc="a pretty pink dress", place=["legs", "torso"])
socks = Clothing(name="Socks", desc="sports socks", place=["shins"])
sneakers = Clothing(name="Sneakers", desc="beat up old sneakers", place=["feet"])
heels = Clothing(name="High Heels", desc="sky high stilettos", place=["feet"])
towel = Clothing(name="Towel", desc="a basic towel", place=["torso", "chest", "legs", "crotch", "shins", "feet"])

wardrobe_inv.wear(towel)
wardrobe_inv.wear(heels)
wardrobe_inv.wear(dress)

player_inv.wear(jeans)
player_inv.wear(tshirt)
player_inv.wear(boxers)
player_inv.wear(socks)
player_inv.wear(sneakers)

Итак, пока все идет хорошо. Но очень важная часть вышесказанного - это теги «места», которые устанавливаются внутри каждого объекта одежды. Причина в том, что, предположим, игрок был одет в джинсы (место: ноги) и футболку (место: торс), и он хотел надеть платье , им сначала нужно было бы снять джинсы и футболку. (другими словами, мне нужна функция, которая просматривает эти теги мест и отправляет предметы с любым подходящим тегом от игрока в гардероб, прежде чем они наденут новый предмет ...

И у меня есть почти сделал это (ну, я говорю «я» - многое из следующего было фактически предложено доброй душой на другом форуме). Но я чувствую, что моя добрая воля на исходе, и я ооочень близок к Это работает. Итак, вот что у меня есть:

def try_on(self,item):
        for all_clothes in self.wearing:
            for matching_tags in all_clothes.place:
                if matching_tags in item.place:
                    wardrobe_inv.wear(all_clothes)
                    self.remove(all_clothes)
        self.wearing.append(item)
        wardrobe_inv.remove(item)
        return

И это почти полностью функционально. Как и предполагалось, он сканирует теги и отправляет предметы обратно в гардероб . Единственная проблема в том, что он отправляет обратно только один элемент, первый элемент с совпадающим тегом, с которым он сталкивается. Я знаю, что должен быть действительно базовый c простой способ получить код l oop через пункты в этом p суставной секции, переместите каждую из них в шкаф, а затем продолжайте работу с остальными. Но я не могу понять, что это такое! Я пробовал сделать "if matching_tags in item.place:" еще один для l oop, но это, казалось, приводило к возникновению самых разных странных, напуганных непреднамеренных вещей!

(Пожалуйста, имейте в виду, что я собрал инвентарь из нескольких разных примеров, которые я нашел в Интернете, и прошел то, что похоже на интенсивный курс sh в Python на выходных, но Я все еще новичок и действительно не в себе! Я просто хочу, чтобы мой инвентарь работал, пока у меня еще есть волосы на голове!) Итак, кто-нибудь, пожалуйста - есть ли способ убедиться, что эта функция try_on работает как задумано, и отправляет каждый предмет с соответствующим тегом «место» обратно в шкаф, а не только первый, с которым сталкивается?

Заранее спасибо и извините за стену текста. Я действительно не знал, как более лаконично объяснить эту загадку! х

...