Maze Generator Das folgende Programm erstellt aus einer Textdatei ein Labyrinth mit einem Start- und Zielpunkt. Labyrinth in Text- und Bildform Wobei folgende Platzhalter in der Textdatei genutzt werden können: # = WandLeerzeichen = freies Feld? = Startpunkt! = Zielpunktalle anderen Zeichen werden als Text ausgegeben Weitere mögliche Labyrinthe Ausführen Das Programm kann über die Kommandozeile ausgeführt werden. Dazu lädt man sich die Python-Datei herunter und erstellt im gleichen Ordner eine Textdatei mit den Daten des Labyrinths. Im Anschluss öffnet man die Kommandozeile und kann das Programm mit „python myMaze.py maze1.txt“ ausführen: Maze Generator.zipHerunterladen Programm wird in der Kommandozeile ausgeführt Nach dem Ausführen wird das Labyrinth in der Kommandozeile aufgezeichnet und im Hintergrund als PNG-Bild im gleichen Ordner gespeichert. Code import sys from PIL import Image, ImageDraw, ImageFont class Maze(): # Konstruktor def __init__(self, filename): # Liest die Datei z.B.: "maze1.txt" ein with open(filename) as f: contents = f.read() # Setzt die Höhe und Breite des Labyrinths self.contents = contents.splitlines() self.height = len(self.contents) self.width = max(len(line) for line in self.contents) # Eigene Printfunktion, die das Labyrinth in der Konsole ausgibt def print(self): print() # Iteriert durch die Zeilen und Items der Textdatei for row in self.contents: for item in row: # Wand if item == "#": print("â–ˆ", end="") # alle anderen Felder else: print(item, end="") print() print() # Funktion, die das Labyrinth als Bilddatei .PNG speichert def output_image(self, filename): self.cell_size = 50 self.cell_border = 2 # Erstellt eine leere Zeichenfläche img = Image.new( "RGBA", (self.width * self.cell_size, self.height * self.cell_size), "black" ) draw = ImageDraw.Draw(img) # Iteriert durch die Zeilen und Items der Textdatei for i, row in enumerate(self.contents): for j, item in enumerate(row): char = "" # Wand if item == "#": fill = (115, 113, 106) # mögliches Startsymbol elif item == "?": fill = (255, 0, 0) # mögliches Endsymbol elif item == "!": fill = (0, 171, 28) # leeres Feld elif item == " ": fill = (237, 240, 252) # kein reserviertes Symbol sondern Buchstaben und Zahlen else: fill = (237, 240, 252) char = item # Zelle wird befüllt mit Farbe oder Buchstabe/Zahl if char == "": self.drawRectangle(i, j, fill, draw) else: self.drawRectangle(i, j, fill, draw) self.drawText(char, i, j, draw) # Speichert das Bild img.save(filename) # Zeichenfunktion: Rechteck def drawRectangle(self, i, j, fill, draw): draw.rectangle( ([(j * self.cell_size + self.cell_border, i * self.cell_size + self.cell_border), ((j + 1) * self.cell_size - self.cell_border, (i + 1) * self.cell_size - self.cell_border)]), fill=fill ) # Zeichenfunktion: Text def drawText(self, char, i, j, draw): font = ImageFont.truetype("arial.ttf", self.cell_size, encoding="unic") w, h = draw.textsize(char, font) text_x = j * self.cell_size + (self.cell_size - w)/2 text_y = i * self.cell_size - (self.cell_size - h)/2 draw.text((text_x, text_y),char ,font=font , fill=(255, 200, 0)) # START # if len(sys.argv) != 2: sys.exit("Usage: python maze.py maze.txt") # Maze Objekt wird mit Hilfe der angegebenen Textdatei erstellt m = Maze(sys.argv[1]) # Labyrinth wird in der Konsole ausgegeben print("Maze:") m.print() # Labyrinth wird als Bild gespeichert imageFilename = sys.argv[1].split(".")[0] + ".png" m.output_image(imageFilename) Links Python Modul: pillow – Python Imaging LibraryHavard University – CS50’s Introduction to Artificial Intelligence with Python unsere-schule.org × Maze Generator Code: Infos: unsere-schule Codes