lehrkraefte:blc:informatik:ffprg1-2020:snake

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
lehrkraefte:blc:informatik:ffprg1-2020:snake [2020/05/04 16:51]
Ivo Blöchliger created
lehrkraefte:blc:informatik:ffprg1-2020:snake [2021/04/28 14:11] (current)
Ivo Blöchliger [Snake]
Line 1: Line 1:
 ====== Snake ====== ====== Snake ======
-Programmieren Sie eine Strategie, die die Schlange steuert.+Programmieren Sie eine Strategie, die die Schlange steuert. {{ :lehrkraefte:blc:informatik:ffprg1-2018:screenshot.png|}} 
 + 
 +Ziel ist es, diese Strategien in einem Tournier gegeneinander antreten zu lassen.
  
 {{ :lehrkraefte:blc:informatik:ffprg1-2020:tjsnake.zip |Source-Code}} {{ :lehrkraefte:blc:informatik:ffprg1-2020:tjsnake.zip |Source-Code}}
  
 +=== Spiel via Netzwerk ===
 +Lassen Sie Ihre Strategie via Netzwerk gegen eine andere spielen, indem Sie die ''NetworkStrategy'' einbauen (neu in obigem Archiv enthalten). Lassen Sie mir Ihre Strategie zukommen, ich werde diese einbauen, damit alle gegen diese spielen können. Der Server läuft allerdings nur auf Anfrage.
 +
 +=== Anleitung ===
 +
 +  * Archiv entpacken (Source-Code)
 +  * Alle .py-Dateien in TigerJython öffnen.
 +  * game.py in Tigerjython starten.
 +  * Für eigene Strategie ivo_simple_strategy.py kopieren und wie folgt benennen: name_xyz_strategy.py, nur Kleinbuchstaben a-z und _ (underscore). Die Datei muss mit dem eigenen Namen beginnen und mit strategy.py aufhören.
 +  * In game.py:
 +    * Die eigene Strategie importieren (ganz oben im Code, analog zu ivo_simple_strategy.
 +    * Eigene Strategie ganz unten in game.py eintragen (min. einmal ivo_simple_strategy ersetzen).
 +  * Code studieren, Fragen stellen.
 +
 +=== Video-Anleitung ===
 +  * https://fginfo.ksbg.ch/~ivo/videos/tjsnake.mp4
 +
 +=== Dokumentation ===
 +Entweder direkt Kommentare im Code oder [[https://fginfo.ksbg.ch/~ivo/tjsnake/annotated.html|online]].
 +
 +
 +===== Aufbau des Spiels =====
 +Die Logik des Spiel läuft in game.py. Damit haben Sie, ausser zum Eintragen Ihrer eigenen Strategie, erst mal nicht viel zu tun.
 +
 +Das Spiel (in game.py) läuft wie folgt ab:
 +  * Strategien, Spielfeld etc initialisieren.
 +  * Jede Strategie nach der Richtung für nächsten Schritt fragen: 0-3 (links, unten, rechts, oben).
 +  * Schritte ausführen, Kollisionen und Apfelfressen überprüfen.
 +
 +Eine Strategie hat Zugriff auf folgende Informationen um den nächsten Schritt zu planen (d.h. welche der 4 Richtungen):
 +    self.params (Alle Informationen zum aktuellen Spielstand, mit den Feldern
 +        width (int): Breite des Spielfelds
 +        height (int): Hoehe des Spielfelds
 +        feld (int[width][height]): Aktueller Zustand des Felds
 +        vanish (int[width][height]): Bis wann ein Feld noch besetzt ist.
 +        alive (bool): Ob die Schlange noch am Leben ist.
 +        points (int): Punkte des Spielers
 +        time (int): Aktuelle Zeit (in Spielschritten)
 +        appletime (int): Zeit, zu welcher der Apfel verfault (und alle Schlangen sterben).
 +        x (int): x-Koordinate der Schlange
 +        y (int): y-Koordinate der Schlange
 +        dir (int): Letzte Richtung der Schlange
 +        reason (str): Todesursache
 +        changed (int[][2]): Koordinaten der Felder, wo eine Veraenderung stattgefunden hat.
 +        heads (int[][2]): Koordinaten der aller lebenden Schlangenkoepfe (auch des eigenen)
 +        apple (int[2]): Koordinaten des Apfels
 +
 +So liefert z.B. ''self.params.apple[0]'' die $x$-Koordinate des Apfels oder ''self.params.feld[3][7]'' den Inhalt vom Spielfeld an der Position (3,7), oder ''self.params.heads[0][0]'' und ''self.params.heads[0][0]'' die $x$- und $y$-Koordinaten einer Schlange (eine gegnerische oder die eigene).
 +
 +Erklärungen: 
 +  * ''int'' bedeutet, dass eine ganze Zahl enthalten ist.
 +  * ''int[4]'' bedeutet ein Array mit 4 Elementen, die Ganzzahlen sind.
 +  * ''int[width][height] bedeutet ein zweidimensionales Array der Grösse width x height, das Ganzzahlen als Element enthält
 +  * ''bool'' ist entweder True oder False.
 +
 +
 +
 +===== Breitensuche zur Distanzberechnung (im Grid) =====
 +Pseudo-Code (kann so nicht direkt in Python ausgeführt werden).
 +<code python>
 +dist[x][y] auf -1 initialisieren
 +
 +dist[startpunkt] = 0
 +todo = [startpunkt]
 +
 +while (len(todo)>0):
 +    aktuell = todo.pop(0) # Vorne entfernen
 +    for nachbar in nachbarn(aktuell):
 +        if dist[nachbar]==-1: # Noch offen?
 +            dist[nachbar] = dist[aktuell]+1
 +            todo.append(nachbar)
 +return dist
 +</code>
  
  
  • lehrkraefte/blc/informatik/ffprg1-2020/snake.1588603887.txt.gz
  • Last modified: 2020/05/04 16:51
  • by Ivo Blöchliger