2017-02-07 3 views
0

Ich habe ein Schatzsuche-Spiel gemacht, und ich brauche es, sobald ein Quadrat mit einer Schatzkiste dreimal besucht wurde, verwandelt es sich in einen "Banditen". Um die Anzahl der Besuche einer Schatzkiste zu verbergen, habe ich der Liste der TreasureChestCoordinates eine weitere Menge der gleichen Koordinaten hinzugefügt. Dann plane ich eine if-Anweisung, so dass, wenn eine der Koordinaten dreimal geschrieben wird, alle 3 entfernt und in die "Bandit" -Liste gesetzt werden. Hier ist mein Entwurf Code für den Abschnitt:Python Unbekannte Werte zu Listen hinzufügen

  # Treasure Chests Collecting Coins # 
     if (x,y) in TreasureCoords[0:(TCNumber -1)]: 
      print("You have landed on a treasure chest! You can visit it 2 more times before it becomes a bandit.") 
      CoinCollection = CoinCollection + 10 
      TreasureCoords.append(x,y) 

     #if TreasureCoords.count(any item) > 3: 
      #remove all copies of item from list 
      #add item to bandit list 

x, y bedeutet die Koordinaten der Benutzer gerade in ist CoinCollection ist eine separate Variable, wenn der Benutzer landet auf einer Schatztruhe oder bandit.By die Art und Weise verändert. Die Anzahl der Koordinaten ist unbegrenzt, da der Benutzer dies zu einem früheren Zeitpunkt im Spiel entscheidet. Also, wie kann ich meine Liste von Koordinaten kopieren, sie entfernen, sobald sie in der Liste sind 3 mal und in eine neue Liste setzen? Ich nehme an, dies ist der einfachste Weg, um zu zählen, wie oft der Benutzer auf einem Quadrat war, und die Schatztruhe zu einem Banditen zu machen.

+0

Nein, das klingt wie eine unnötig komplizierte Art, es zu tun. Es wäre einfacher, einfach ein Mapping von der Koordinate zur Anzahl der Besuche vorzunehmen. –

+0

Auch die Anzahl der Koordinaten, die du in deiner Liste hast, kann nicht "unbegrenzt" sein, da du keinen unbegrenzten Speicher hast ... –

+0

Sorry wollte nur meinen Standpunkt verdeutlichen - wie du wahrscheinlich weißt, bin ich kein besonders fortgeschrittener Kodierer ... Wie würden Sie Lösung arbeiten? – George

Antwort

1

Erste ... Sie brauchen nicht auf die Liste für jede Koordinate vorhanden dreimal zu suchen. Das ist verschwenderisch. Wenn Sie sie einmal entfernen, ist die einzige Koordinate, die möglicherweise dreimal vorhanden sein kann, diejenige, die Sie gerade besucht haben.

Wenn Sie wirklich wollen es tun, wie in Ihrer Frage gezeigt, tun Sie einfach etwas wie while (x,y) in TreasureCoords: TreasureCoords.remove((x,y)). Es wäre jedoch wahrscheinlich einfacher, eine dict zu verwenden. Sie können wahrscheinlich vermeiden, separate Variablen zu haben. Unter der Annahme, dass ItemCoords zunächst mit Koordinaten gefüllt ist, die unvisited Schatztruhen darstellen:

ItemCoords[(x,y)] = 0 # add a treasure 

... dann können Sie sich nur an, wie oft der Schatz besucht:

visits = ItemCoords.get((x,y), None) 
if visits is None: 
    pass # nothing there 
else if visits > 3: 
    fightBandit() # ...or whatever 
else: 
    print("You have landed on a treasure chest! You can visit it %i more times before it becomes a bandit." % (2 - visits)) 
    CoinCollection += 10 
    ItemCoords[(x,y)] += 1 

Diese noch simpel ist. Sie möchten wahrscheinlich einen objektorientierten Ansatz, wie von Christian angedeutet:

class Treasure: 
    def __init__(x,y): 
     self.x = x 
     self.y = y 
     self.visits = 0 

    def visit(): 
     print("You have landed on a treasure chest! You can visit it %i more times before it becomes a bandit." % (2 - visits))  
     CoinCollection += 10 

     if visits == 3: 
      world[(self.x, self.y)] = Bandit(self.x, self.y) 

class Bandit: 
    def __init__(x,y): 
     self.x = x 
     self.y = y 

    def visit(): 
     # Replace this with whatever happens when the player meets a bandit 
     print("You have been eaten by a grue.") 
     sys.exit(0) 

# Initialize the world 
for n in range(NumberOfTreasure): 
    # get x,y somehow, e.g. random 
    world[(x,y)] = Treasure(x,y) 

# ...code for player wandering around... 
here = world.get((x,y), None) 
if here is not None: 
    here.visit() 
+0

Ich habe deinen ersten Code implementiert und itemCoords in TreasureCoords geändert, das ist der Listenname, der alle Koordinaten der Schatzkiste speichert.Jedoch, als ich das Spiel spielte, erschien dieser Fehler "TreasureCoords [(x, y)] = 0 TypeError: Liste Indizes müssen Ganzzahlen sein, nicht Tupel" können Sie helfen/wissen Sie, was das bedeutet? – George

+0

Wahrscheinlich hast du 'TreasureCoords' wie' = [] 'initialisiert, was es zu einer' liste' macht. Mein modifizierter Code verwendet stattdessen ein 'dict', also müssen Sie es initialisieren wie '= {}' oder '= dict()'. – Matthew

+0

Ok. Bedeutet das, dass ich alle meine anderen Listen auch in Wörterbücher umwandeln muss? Muss ich noch etwas ändern oder funktioniert alles mit einem Wörterbuch? – George

0

Ich denke, dies ist ein Fall, in dem ein Objekt von Vorteil wäre - anstatt separate Listen mit Fakten über das gleiche zu verfolgen, verwenden Sie eine Liste von Objekten, die alle relevanten Informationen speichern.

könnte wie folgt aussehen:

class Monster(object): 
    #define like you like it 
    pass 

class Treasure(object): 
    def init(x, y): 
     self.x = x 
     self.y = y 
     self.visits = 0 

    def visit(): 
     self.visits += 1 

     if self.visits >= 3: 
      return Monster() 
     else: 
      return 10 


calling code: 
    treasure = Treasure(1,1) 
    rv = treasure.visit() 
    if isinstance(rv, Monster): 
     # lets the monster rip him to shreds 
    else: 
     CoinCollection +=treasure.visit() 
+0

Kann ich diesen Code immer noch benutzen, ohne zu wissen, wie viele Schatztruhen es gibt? Der Benutzer legt die Anzahl der Schatzkisten an anderer Stelle im Code fest. – George

+0

Natürlich - Sie müssten eine Liste von Schätzen ähnlicher Länge erstellen. Ehrlich, das ist die entscheidende Fähigkeit, die dein Softwarekurs dir beibringen möchte - wie man ein großes Programm strukturiert, das aus modularen Stücken besteht, die gemeinsam arbeiten, um ein Ziel zu erreichen. –

Verwandte Themen