Liste ab Index X iterieren

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.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

@ BlackJack: Gute Idee :oops: Bin ich gar nicht drauf gekommen :lol:
@ EyDu: Danke. Werde ich morgen testen ;)

Gruß
Grüßle.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Das meinte ich übrigens auch mit: Du optimierst an der falschen Stelle. Du hast recht, das der Code in der Schleife schnell sein sollte, aber noch besser ist es, wenn er gar nicht in der Schleife ist. Sortiere die Ecken der Checkpoints einmal direkt im Konstruktor des Checkpoint-Objektes und du kannst dir das min() und max() in der Schleife sparen.

Zum ursprünglichen Problem: Jeder Spieler muss jeden Checkpoint nur einmal durchlaufen. Du hast also prinzipiell eine NxM Matrix für Spieler und Checkpoints mit True (für durchlaufen) und False (für nicht durchlaufen) und du möchtest verhindern, das Checkpoint-Spieler-Kombinationen geprüft werden, die bereits ein True in dieser Matrix haben.

a) Du pflegst diese Matrix und prüfst vor jedem Check, ob "checked[spieler-index][checkoint-index]" ein True enthält.
b) Du speicherst eine einfache Liste für jeden Spieler (oder eine für jeden Checkpoint) und checkst die.

Das geht deutlich schneller, als Slicing oder Listen-Manipulation.
Bottle: Micro Web Framework + Development Blog
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Problem ist aber, dass es auch mehrere Strecken für den "Parkour" geben kann. Es könnte also so aussehen:

Code: Alles auswählen

CP1 ------- CP2
  |
  |
  |
  |
CP3
Das ganze würde so also nicht funktionieren, da es sein kann, dass der Spieler den 1. Weg mit CP1 -> CP2 -> CP4 -> CPX nimmt.

Danke für die Tipps.

Gruß
Grüßle.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Versteh ich das richtig: Es gibt ein Netz von Checkpoints, die man nacheinander aktivieren muss, aber es gibt alternative Wege?

Dann würde ich für jeden Checkpoint speichern, welche Spieler ihn aktivieren können und welche Checkpoints frei geschaltet werden, sobald der aktuelle aktiviert wurde. Du beginnst das Spiel also mit einem Start-Checkpoint, auf den alle Spieler zugreifen können. Sobald jemand diesen Checkpoint erreicht, werden für diesen Spieler alle folgenden Checkpoints aktiviert und der aktuelle deaktiviert. Aktiviert jemand den Ziel-Checkpoint, passiert was tolles ;)

Code: Alles auswählen

for player in player_list:
  for checkpoint in checkpoint_list:
    if player.id in checkpoint.open_for \
    and check_collision(checkpoint, player):
      checkpoint.open_for.remove(player.id)
      print "Spieler %s erreicht Checkpoint %s" % player, checkpoint
      for nextcp in checkpoint.next_checkpoints:
        print "Nächster Checkpoint: %s" % nextcp
        nextcp.open_for.add(player.id)
      continue # Ein Spieler kann nur in einem Checkpoint gleichzeitig sein
Bottle: Micro Web Framework + Development Blog
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Erm - Geile Idee :)
Werde das morgen mal umsetzen und berichten :)

Danke!

Gruß
Grüßle.
Antworten