-
Forum: Programmieren allgemein
by Sidorion,
11. Mai 2007
Nö. Du kannst ja beim A* initialisieren, da wo Du die Schlangen einzeichnest für jedes Teil den Abstand zum Ende eintragen (negativ mit offset, da ja 'Wand'=-1 und Entfernungen positiv). Damit ist der größte Wert <-1 die potentielle Lücke. Ausserdem erleichterst Du Dir dadurch das 'Entfernen' des letzten Schlangenstücks bei jedem A* Durchlauf, indem Du einfach alle Zahlen <-2 um eins erhöhst und...
-
Forum: Programmieren allgemein
by Sidorion,
10. Mai 2007
Nein Du ermittelst einfach für jedes Feld am Rand, wie lange es dauern wird, bis es nichtmehr besetzt ist. Also für feste Wände unendlich(-1), für Schlangenteile Abstand zum hinteren Ende (der jeweiligen Schlange). Das Feld mit dem niedrigsten positiven Wert ist die (zukünftige) Lücke. Jetzt füllst Du die A* Map, als wäre das Futter an diesem Feld. Wenn Du damit fertig bist, lässt Du die Schlange...
-
Forum: Programmieren allgemein
by Sidorion,
10. Mai 2007
Hab gestern nochmal drüber nachgedacht. Du musst die Stelle finden, an der der Ring aufbrechen wird (weil der nachgezogene Schwanz irgendwann so weit vorrückt, dass eine Lücke entsteht). An dieser Stelle muss die Schlange dann rauskriechen. Wenn Du den Punkt hast, machst Du einen A* zu diesem Punkt und gehst dann aber mit dem Kopf in die Richtung weiter, die den größten Wert (also den längeren...
-
Forum: Programmieren allgemein
by Sidorion,
9. Mai 2007
Nein Du versuchst erst den ersten. Wenn der klappt, dann kann die Schlange zum Apfel und verfolgt dieses Ziel. Wenn nicht kann die Schlange auch nicht zum Apfel und verfolgt die Überlebensstrategie. Hierzu muss ich aber nochmal nachdenken, weil das klappt so nicht, da die Werte ja immer wieder überschrieben werden.
-
Forum: Programmieren allgemein
by Sidorion,
9. Mai 2007
Na SnakeBloed schon, denn da wird ja irgendwann ein Weg frei (wenn Dus so machst wie ich gesagt habe mit dem entfernen des letzen Gliedes vom Kopf aus).
SnakeDumm löst man, indem man A* vom Kopf aus anfängt und den Nachbarn überschreibt, wenn der neue Wert größer dem alten ist. Ist man fertig mit A* (keine Änderung mehr) geht man wieder Richtung kleinster Nachbar vom Kopf aus. Dadurch...
-
Forum: Programmieren allgemein
by Sidorion,
9. Mai 2007
Ich gehe mal davon aus, wir reden vom Fehler jpeg und die KI steuert die blaue schlange.
Dann sieht der A* so aus:
in Schritt 0 (aktuelle Situation) kann die blaue Schlange nicht zum Apfel. Trotzdem fangen wir an.
Wir schreiben also in alle Nachbarn des Schlangenkopfes eine 1. Jetzt bewegt sich die grüne ein Feld vorwärts und damit wird das Feld 0,7 frei (und Blue kann zum Apfel). Dieses...
-
Forum: Programmieren allgemein
by Sidorion,
9. Mai 2007
Folgendes: Je Schritt in der A* berechnung vergeht doch ein Spielzug (wenn schlange vom futter 4 weg ist, braucht sie 4 Züge um hinzukommen). Jetzt kannst Du also in jedem Schritt die Karte dahingehend anpassen, dass Du das jeweils letzte Feld jeder Schlange als begehbar markierst (Die Schlange ist ja ein Feld weitergekrochen). Damit ergibt sich dann plötzlich doch ein Weg bei Deinem Fehlerbild....
-
Forum: Programmieren allgemein
by Sidorion,
8. Mai 2007
Ich hab da nochmal drüber nachgedacht.. Du musst den A* 'rückwärts' anwenden.
Du gehst quasi vom Schlangenkopf zum Futter und löschst in jedem Schleifendurchlauf das letzte Glied jeder Schlange aus der A* map. Dadurch wird das Weiterkriechen der Schlangen simuliert und bei der Pfadsuche wird das dann berücksichtigt.
Einziges Problem ist nun, dass Du in Deiner A*-Map den Weg vom Futter zur...
-
Forum: Programmieren allgemein
by Sidorion,
8. Mai 2007
Zunächst sollte man noch eine weitere Abbruchbedingung einführen: konnte kein Nachbar mit n+1 besetzt werden, dann muss die Schlefe abbrechen. Einfach bei jedem Schleifendurchgang einen Boolean auf false setzen. Beim Setzen eines Nachbarn wird der dann auf true gesetzt.
Zudem hast Du in dieser Situatin zwei Möglichkeiten: 1. die blaue Schlange verfällt in einen Sicherheitsmodus, in dem sie...
-
Forum: Programmieren allgemein
by Sidorion,
8. Mai 2007
Aufgefallen ist mir nur, dass Du bei allen Prüfungen der umliegenden Felder auf >0 und <Feldbreite/Höhe prüfst. Dies erscheint mir unlogisch, da das Array entweder von 0 bis Felbreite-1 oder von 1 bis Feldbreite geht. D.h. Du hast eigentlich Feldbreite+1.
Wenn Du beim A* Map initialisieren das Futterfeld auch mit -1 belegst kannst Du Dir die ganzen (!IsFoodFoield..) sparen.
Du füllst in...
-
Forum: Programmieren allgemein
by Sidorion,
7. Mai 2007
Also für diese Anwendung ist wohl A* die effektivste Methode.
Das Prinzip ist einfach:
Du nimmst ein 2D-Array von der Größe Deiner Karte.
Dieses füllst Du erstmal mit Nullen.
Danach schreibst Du in jede Zelle wo Wand oder Schlange ist eine -1 rein.
Jetzt wird in die Nachbarn der Nahrung je eine 1 reingeschrieben (ausser Wert=-1).
Dann wird eine Schleife gestartet (ab n=1):
Für jede...