Mehrere Quest

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Hallo nochmals,
in meinem Rollenspiel http://www.python-forum.de/viewtopic.php?f=9&t=30862
möchte ich dass wenn die erste quest abgeschlossen ist, dass man sie nicht wiederholt, sondern dei zweite beginnt.
Ich kam jetzt nur auf diese Lösung:

Code: Alles auswählen

quest1_id=True
if quest1_id:
    quest1.quest_durchführen()
    quest1_id=False
Und immer so weiter mit der zweiten:

Code: Alles auswählen

quest2_id=True
if quest2_id:
    quest2.quest_durchführen()
    quest2_id=False
usw.
Kann man das kürzer und eleganter machen???
gruß pythoraner
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Pythoraner123 hat geschrieben:Kann man das kürzer und eleganter machen?
Wenn du anfängst Dinge durchzunummerieren willst du fast immer eine Liste haben.

Code: Alles auswählen

quests = ['Start', 'nächste Aufgabe']
print quests[0]
print quests[1]
for quest in quests:
    print quest
Jetzt kannst du in der Liste natürlich auch komplexere Datenstrukturen unterbringen.

Code: Alles auswählen

class Quest(object):
    def __init__(self, name):
        self.name = name
        self.solved = False

quests = [Quest('Start'), Quest('nächste Aufgabe')]
quests[0].solved = True
for quest in quests:
    if not quest.solved:
        print quest.name
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Ich habe es jetzt so gelöst

Code: Alles auswählen

x=random.choice(quest_liste)
x.quest_durchführen()
quest_liste.remove(x)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Löschen aus Listen, wenn es sich nicht gerade um das letzte Element handelt, ist keine sehr schöne Lösung. Am einfachsten ist es, wenn du die shuffle-Funktion aus dem random-Modul verwendest und damit alle Quests mischt. Anschließend kannst du die Liste ganz normal mittels for-Schleife durchlaufen. Damit sparst du dir das unnötige Löschen oder das Markieren der bereits erledigten Quests.
Das Leben ist wie ein Tennisball.
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Wenn ich das Programm dann aber neu starte fangen die Quest wieder von vorne an, aber ich möchte ja dass man jede Quest nur einmal spielt.
Deswegen kann man dann die Liste abspeichern und sie beim nächsten Programmstart wieder verwenden ohne dass man eine Quest wiederholt.
Gruß Pythoraner
BlackJack

@Pythoraner123: Bleibt trotzdem unschön ein beliebiges Element aus einer Liste zu entfernen. Ein `shuffle()` beim ersten mal und dann entfernen des letzten Elements mit `pop()` ist effizienter. Letztlich würde ich es aber umgekehrt lösen: Beim Spieler nicht vermerken welche Quests noch offen sind, sondern welche schon bestanden wurden. Dann kann sich die Anzahl der Quests auch ändern zwischen den Spielen. Der Spieler spielt nix doppelt, bekommt aber die Chance auch neu hinzu gekommene Quests zu spielen. Umgekehrt hat er keine ungespielten Quests in seiner Liste stehen die mittlerweilse vielleicht gar nicht mehr existieren.
Antworten