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:

  • # = Wand
  • Leerzeichen = freies Feld
  • ? = Startpunkt
  • ! = Zielpunkt
  • alle 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:

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

unsere-schule.org

×

Maze Generator

Code: