Voraussetzung: mBot, TFT_Screen, Extensions: AdvancedArduino_Fork, TFT_LCD(arduino Mode Only)
Das Haus vom Nikolaus ist ein weithin bekanntes Zeichenspiel. https://de.wikipedia.org/wiki/Haus_vom_Nikolaus Es soll die folgende Grafik in einem Zug gezeichnet werden. Im Internet gibt es viele Programme, die insbesondere ermitteln, wie viele und welche Möglichkeiten es gibt, dies zu erreichen. http://www.mathematische-basteleien.de/nikolaushaus.htm
Bei der Google-Suche mit Scratch Haus Nikolaus werden viele Lösungen gezeigt. In der Regel geht es darum, dass auf der Scratch-Bühne vom Rechner die Lösung erzeugt wird. https://physik.osz-biv.de/Informatik/7511/nikolaus.php
Bei der Google Suche mit mBlock Haus vom Nikolaus kamen keine passenden Treffer.
Bei der Google-Suche mit Scratch Haus Nikolaus kamen mehrere Treffer. Es ging aber immer nur darum, dass der Computer das Haus zeichnet.
Und bei der Google Suche mit Arduino Haus Nikolaus bin ich auch nicht fündig geworden.
Da ich das Ziel habe, alle Programme selbstständig auf dem mBot laufen zu lassen, habe ich mich daran versucht.
Im ersten Schritt wollte ich ohne zusätzliche Extension auskommen. Das Ganze sollte ein Spiel werden. Der Benutzer soll also selbstständig das Haus zeichnen. Der Computer passt nur darauf auf, dass die Regeln eingehalten werden. Außerdem misst er die Zeit, die für die Lösung gebraucht wird. Mit der Taste F kann jederzeit das Spiel neu gestartet werden.
Mir war klar, dass es ohne Arrays nur sehr umständlich möglich ist, die Regeln zu überprüfen. Das Bild zu malen ist mit einfachen Variablen noch relativ leicht möglich. Die Speicherung der schon gemachten Züge und insbesondere die Überprüfung, ob ein geplanter Zug nicht schon gemacht wurde ist kaum möglich.
Daher habe ich auf die Extension AdvancedArduino (https://www.lab169.ru/mblock/extensions/) zurückgegriffen. Diese bietet neben vielen interessanten Erweiterungen auch zweidimensionale Arrays. Ich empfehle sehr, sich auf der angegebenen Webseite umzusehen. Leider gibt es neben dieser keine weitere Dokumentation, sodass für viele Blöcke trotz der vielen Beispiele nur ein Ausprobieren übrig bleibt.
Nach der Programmierung habe ich eine interessante Entdeckung gemacht. Weil ich es besser fand, auf einen weißen Hintergrund zu zeichnen, habe ich als Hintergrundfarbe für das TFT-Display Weiß benutzt. Das funktionierte auch sehr gut, wenn der mBot per USB-Kabel mit Strom versorgt wird. Auch unmittelbar nach der Trennung vom Kabel, also im reinen Akkubetrieb, lief alles wunderbar. Die Überraschung kam am nächsten Morgen: Der Bildschirm blieb schwarz. In dem Moment, in dem der mBot wieder ans Kabel gehängt wurde, wurde dann das erwartete Bild angezeigt.
Hier beide Skripte zum Herunterladen:
Schwarz auf Weiß: Nikolaus mit weißem Hintergrund
Weiß auf Schwarz: Nikolaus mit schwarzem Hintergrund
Offensichtlich braucht der weiße Hintergrund soviel Energie, dass er nur bei völlig gefülltem Akku angezeigt werden kann.
Hier das Video: https://youtu.be/YoTYQgbpOxs
Ein paar Erläuterungen zum Programm:
Wie bei der klassischen kaufmännischen Computerprogrammierung üblich wird das EVA-Prinzip realisiert:
Eingabe
Verarbeitung
Ausgabe.
Dies spiegelt sich im Hauptprogramm wieder:
Da erst verarbeitet werden kann, wenn die Eingabe abgeschlossen ist, wird die Routine "Warte auf Taste" benutzt (Einzelheiten siehe: ⇒Tastatureingabe mit der IR-Fernbedienung)
Das Schwierigste im Programm ist die Prüfung, ob ein geplanter Zug erlaubt ist.
Zuerst einmal darf nicht zum aktuellen Standort gezogen werden.
Dann ist auszuschließen, dass von der Spitze (Punkt A) zu einem der unteren Eckpunkte (D oder E) gezogen wird. Dies ist etwas trickreich gemacht.
Schließlich darf ein schon einmal gemachter Zug nicht noch einmal gemacht werden. Hierzu werden in einem zweiten Array alle schon gemachten Züge eingetragen. Um nur eine Prüfung machen zu müssen, wird immer der kleinere der beiden Punkte zuerst eingetragen. Dieses Array wird dann komplett durchlaufen. Dabei wird der geplante Zug (wieder: kleinerer Punkt zuerst) mit den schon gespeicherten verglichen.
Schließlich muss geprüft werden, ob das Spiel beendet ist, also alle erlaubten Züge gemacht wurden.
Was noch fehlt, ist die Prüfung, ob der Spieler sich in einer Sackgasse befindet, also vom aktuellen Standort aus keine Züge mehr erlaubt sind. Hierzu kann sicher die Prüfroutine eingesetzt werden. Sie muss allerdings von den Fehlerausgaben befreit werden.
Eine Erweiterung könnte sein, dass bei erfolgreichem Ende die fünf Dreiecke farbig ausgefüllt werden.
Es gibt insgesamt 44 Möglichkeiten, das Haus zu zeichnen. Eine Programmerweiterung könnte darin bestehen, dass nacheinander möglichst viele verschiedene Varianten gefunden werden müssen. Um zu überprüfen, ob die gefundenen sich von einander unterscheiden, müsste wohl ein zweidimensionales Array eingesetzt werden.