Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

projektewise21:spieldeslebenspublic:start

FAME GAMES - In den Klauen des Zufalls (Projektdokumentation)

Themenbeschreibung und Überblick

In den Klauen des Zufalls ist ein Roboter gesteuertes Gemeinschaftsspiel. Der Aufbau besteht dabei aus einer 36*36*12 cm großen Kiste, auf deren Oberseite sich das Spielbrett befindet. Innerhalb der Kiste befinden sich verschiedene Steuerelemente sowie der eigentliche Arduino an sich. Neben der großen Kiste gibt es noch eine kleinere Box, an der sich ein Bildschirm zur Kommunikation mit den Spieler und fünf Knöpfe zur Steuerung befinden. Diese ist über Kabel mit der großen Kiste verbunden und kann von Spieler zu Spieler weiter gereicht werden. Die Box ist über ein Netzteil mit einer Steckdose verbunden, um den Arduino und die Motoren mit Strom zu versorgen. Außerdem gibt es fünf Spielfiguren (eine als Ersatz).

Abbildung 1: der komplette Spielaufbau

Aufgaben des Roboters

Der Roboter hat drei große Aufgabenbereiche.

Zum einen muss er das Spielgeschehen verwalten, sprich für die Spieler würfeln, ihre Positionen mitverfolgen und auf die entsprechenden Ereignisse reagieren. Beispielsweise erkennt der Roboter, wenn zwei Spieler sich auf dem gleichen Feld befinden und versetzt einen, den Regeln nachkommend, weiter, sodass nie zwei Spieler auf dem selben Feld stehen.

Neben der vielfältigen Verwaltung der Spielablaufs, muss der Roboter fünf verschiedene mechanische Funktionen ausführen, welche später noch genauer erläutert werden. Zudem fordert er den Spieler mit 6 Minispiele, 100 Quizfragen und 20 Aufgaben heraus und überprüft, ob diese gemeistert wurden oder nicht.
Die Minispiele geben dem eigentlichen Hauptspiel eine gewisse Würze, ohne jedoch selbst in den Vordergrund zu treten.

Die einzigartigen Landschaften auf dem Spielbrett mit den handgemachten Verzierungen stellen die Kirsche auf dem Sahnehäubchen dar und verleihen dem Ganzen ein gewisses Flair.

Konstruktion

Baugruppen

Spielbrett

Die obere Fläche der Kiste bildet das Spielfeld, welches aus zwei Holzplatten besteht. In der oberen, etwas dünneren Platte befinden sich Löcher für die Spielfelder und das Start- und das Zielfeld. Zusätzlichen wurden ein Fluss und eine Schlucht in das Brett modelliert. Unter der dünneren Platte befindet sich eine zweite, dickere Platte, die den Boden für die Spieler bildet. Der Fluss ist dabei auf dieser Platte mit einem Wellenmuster verziert. Die Schlucht jedoch wurde auch aus der unteren Platte herausgesägt, damit die Spieler in diese Fallen können. Um die elektronischen Bestandteile zu schützen und vor Blicken zu verbergen, befindet sich unterhalb der Schlucht eine weitere, leicht geneigte Bodenplatte mit Seitenwänden. Spielfiguren, die in die Schlucht fallen, rollen dadurch zu einer Öffnung in der Seitenwand aus der die Spieler diese wieder entnehmen können.
Mit einem Lötkolben sind die jeweiligen Feldzahlen in die Spielfelder geschrieben.
Die beiden Platten sind fest miteinander verschraubt, wobei diese auf den Unterbau lediglich aufgesetzt werden. Da die obere der beiden Platten etwas größer ist, ist die Konstruktion trotzdem stabil.

Deko

Auf dem Spielbrett befinden sich verschiedene Deko Elemente, wovon einige nur ästhetischen Nutzen haben und andere auch Funktionen übernehmen. Die dekorativen Elemente dienen vor allem dazu, die verschiedenen Landschaften auf dem Spielbrett darzustellen, somit das Spielbrett spannender zu gestalten und ein zusammenhängendes Abenteuer für die Spieler zu gestalten. Die Spielfiguren sind dabei koboldartige Wesen, welche zu dem Goldtopf im Ziel gelangen wollen.

Das Startfeld befindet sich im „Dusterwald“. Hier gibt es tote Bäume, Giftpilze und Spinnen, die verhindern, dass man sofort ins „Schlaraffenland“ kommt. Stattdessen müssen die Spieler über Baumstümpfe, Büsche und Bäume einen Umweg nehmen. Der Baum (Feld 4) ist dabei nicht nur dekorativ, sondern hat einen ganz besonderen Mechanismus. Kommt ein Spieler auf das Feld, so wird dieser vom Roboter mit einer bestimmten Wahrscheinlichkeit zum Fallen gebracht, woraufhin der Spieler zurück zum Startfeld muss. Im Wald befinden sich außerdem die Tannen von Hanoi (vgl. die Türme von Hanoi), welche ein Minispiel darstellen.
Nach dem Wald müssen die Spieler zwei Mal den gefährlichen Fluss überqueren. Steht dabei ein Spieler auf einem Flussfeld wird dieser mit einer gewissen Wahrscheinlichkeit vom Roboter nassgespritzt.
Zwischen dem Fluss und der Schlucht ist eine Wüste mit Kakteen und Steinen und eigenartigen Wüstenpflanzen. Aus diesem Grund können die Spieler nicht auf direktem Weg zur Brücke gelangen. Jedoch befindet sich zwischen Feld 14 und Feld 19 eine geheime Abkürzung. Es wird nicht jedem Spieler gelingen, diese zu entdecken und auch zu benutzten.
Hinter der Abkürzung beginnt das Schlaraffenland, bestehend aus einer Landschaft aus Süßigkeiten und einem großen Turm. In diesem Turm befinden sich Schokoladenplättchen, welche von oben befüllt werden können. Steht ein Spieler auf Feld 17 wird ihm Schokolade ausgegeben.
Zum Überqueren der Schlucht steht den Spielern nur eine instabile und wacklige Brücke zur Verfügung. Diese lässt auf Kommando des Roboters manchmal Spieler in die Schlucht fallen.
Auf der anderen Seite der Schlucht erwartet einen die Eiswüste, durch die man zum Ziel gelangen muss. Dort wartet ein großer Schatz auf den glorreichen Sieger.

Ein weiteres Deko Element mit Funktion ist der Draht, welcher über die Schlucht verläuft. Er ist Teil des Minispiels „Ruhige Hand“.

Abbildung 2: Aufnahmen vom Spielfeld

Unterbau

Der Unterbau bezeichnet die vier Seitenplatten sowie die Bodenplatte der Kiste. Die Seitenplatten sind mit der Bodenplatte verschraubt. Diese Schrauben lassen sich jedoch auch wieder lösen, um zum Beispiel Probleme an der Schaltung zu beheben oder Bauteile auszutauschen.

Abbildung 3: der Unterbau von Innen

Bildschirm-Box

Zu dem ganzen Spiel gibt es extern noch eine kleine Box, in dem ein Monitor verbaut ist, über den der Roboter mit den Spielern kommunizieren kann. Ferner befinden sich 5 Knöpfe an der Box, über die sich die Spieler mit dem Roboter verständigen können. Durch die externe Konstruktion ist unser Herzstück der Kommunikation mobil und erleichtert somit nicht nur den Datenaustausch für jeden Spieler sondern steigert zudem den Komfort.

Abbildung 4: die Bildschirmbox

Der fallende Baum

Der fallende Baum, der den Spieler zurück aufs Startfeld wirft, hat eine besondere Konstruktion. Er besteht aus einem Stumpf, der fest mit dem Boden verklebt ist und dem Stamm mit der Baumkrone, welcher umkippen kann. Die beiden Teile sind dabei an einer Seite über ein Stück Stoff verbunden, welcher als Scharnierersatz dient. Am kippenden Teil des Baumes ist unten ein Draht befestigt. Durch ein Loch im Baumstumpf und in der Bodenplatte führt dieser bis zu einem Servo, welcher von unten am Spielbrett befestigt ist. Falls ein Spieler auf das Feld kommt, entscheidet der Roboter per Zufall, ob der Baum fallen soll. In diesem Fall ist aktiviert er den Servo der mit dem Draht verbunden ist. Dieser dreht sich so, dass das Draht ein Stück nach oben geschoben wird und der Baum sich somit richtung Startfeld neigt. Nach einer kurzen Wartezeit bringt sich der Servo wieder in Startposition und zieht somit den Baum wieder in eine aufrechte Haltung.

Die Wasserspritze

Falls die Spieler während ihrer Reise zum verborgenen Schatz auf einen kleine Wasserfall stoßen, besteht die Möglichkeit, eine kleine Wasserdusche nehmen zu müssen. Dabei entscheidet der Roboter, ob der Wassersprühmechanismus aktiviert wird. Die Wasserspritze ist die Konstruktion, die am schwierigsten umzusetzen war. Die kleine Wasserpistole, welche im Kasten verbaut ist, benötigt viel Kraft, um sie zu betätigen. Daher haben wir zusätzlich einen Flaschenzugmechanismus gebaut. Nachdem die Pistole über den Flaschenzug mit dem Schrittmotor verbunden wurde, konnte der Auslöser durch die Drehbewegung des Motors angezogen werden.

Abbildung 6: die Wasserspritze

Schokoladenausgabe

Im Schlaraffenland ankommend, wird dem Spieler vielleicht seine Reise versüßt. Dieser darf sich nämlich, wenn er Glück hat, an einem Stück Schokolade erfreuen. Durch eine spezielle Konstruktion wird immer ein Schokoladenstückchen mit Hilfe eines Servos aus der Box hervorgeschoben, welches man dann unverzüglich zu verzehren hat.
Die rechteckigen Schokoladenstücken werden übereinander gestapelt gelagert. Das unterste Stück liegt auf einer Art Schiene, in das die Schokolade genau reinpasst. Hinter dem Stückchen befindet sich ein etwa gleich großes Stück Holz, welches über einen Draht mit einem Stepper-Motor verbunden ist. Wenn ein Stück Schokolade ausgegeben werden soll, wird das Stückchen Holz durch eine Drehbewegung des Motors nach vorne geschoben. Dadurch wird das Schokoladenstückchen bis zum Loch in der Wand geschoben, wo der Spieler es sich nehmen kann. Anschließend zieht der Motor das Holzstückchen wieder zurück. Wenn das Holz vollständig zurück gezogen ist fallen die restlichen Schokoladenstückchen alle ein Stück runter, sodass nun ein neues Stück unten liegt.

Abbildung 7: die Schokoladenausgabe

Die Schlucht

Die Schlucht, die nur über eine instabile Brücke zu überqueren ist, wird ebenfalls vom Roboter gesteuert. Per Zufall wird entschieden, ob ein Spieler die Brücke erfolgreich passieren darf oder ob dieser in die Schlucht fällt. Dabei bildet eine längliche Holzplatte den Boden der Brücke, in welcher sich jedoch ein Loch befindet. Unter diesem Loch ist eine kleinere Platte platziert, auf der der Spieler steht. Falls der Spieler zum Fallen verurteilt wird, wird die untere Platte, die über ein Stück Draht mit dem Servo verbunden ist, durch die Drehung des Servos ruckartig nach hinten gezogen, sodass der Spieler durch das leere Loch in die Schlucht fällt. Anschließend fährt sich der Boden langsam wieder aus und das Feld ist wieder begehbar.

Schaltung

Stromversorgung

In unserem Roboter sind zwei Stepper Motoren verbaut, welche mit 12V betrieben werden müssen. Da der Arduino nur maximal 5V ausgeben kann, benutzen wir zur Stromversorgung ein Netzteil. Dadurch müssen wir auch keinen Akku verwenden, um den Arduino mit Strom zu versorgen. Das Kabel des Netzteils wird durch ein Loch in der Wand mit einer der Leiterbahnen des Arduino Boards verbunden. Von dieser Leiterbahn aus wird der Arduino über den vin (Voltage Input) Pin verbunden und somit mit Strom versorgt. Die andere Leiterbahn wird normal über den 5V Pin des Arduino mit Strom versorgt. Es gibt also eine Leiterbahn auf der 12V fließen und eine mit 5V. Mit Ausnahme der Steppermotoren werden alle Bauteile die Strom benötigen mit der 5V Leiterbahn verbunden.

Knöpfe

Wie im Abschnitt Code beim Thema Knöpfe erklärt, haben wir die Knöpfe auf der einen Seite mit Ground und auf der anderen mit dem entsprechenden Messungspin verbunden. Wir haben digitale Pins im INPUT_PULLUP Mode verwendet, analoge Pins wären jedoch auch möglich gewesen.
Es ist wichtig darauf zu achten, die Knöpfe richtig auszurichten. Wie in Abb. 9 zu sehen, müssen die Kabel jeweils auf der Seite angeschlossen sein, wo die Beinchen des Knopfes raus schauen.

Abbildung 9: Schaltung eines Knopfes (INPUT_PULLUP Mode) Quelle

Bildschrim

Das Display ist über vier Anschlüsse mit dem Arduino verbunden. Erst war geplant ein eigenes zu verwenden, jedoch stellten sich die vielen Anschlüsse davon als Schwachstelle heraus. Das LCD mit den vier Anschlüssen haben wir so verkabelt, dass „SDA“ und „SCL“ jeweils durch digitale Pins gesteuert werden und „Ground“ und „5-Volt“ in die längeren Leiterbahnen des Steckbrettes geführt werden. Die vier Pins führen nicht direkt zum LCD, sondern zu dem dazugehörigen Treiber, der fest an das LCD gelötet ist und die Ansteuerung erheblich erleichtert.

Motoren

Die Stepper-Motoren verwenden jeweils einen Treiber und zwei Stromquellen. Der Treiber wir über einen 5V und einen Ground-Anschluss vom Arduino erreicht. Weiterhin sorgen zwei digitale Pins für die Ansteuerung des „Step-“ und des „Direction-Anschlusses“. Jenachdem, in welchem Zustand der Direction-Pin ist (HIGH oder LOW), dreht sich der Stepper in die eine oder die andere Richtung. Wenn der Step-Pin auf HIGH ist, wird ein Schritt gemacht. Die dazu benötigte Leistung liefert eine 12V-Spannungsquelle. Diese ist an die anderen beiden langen Leiterbahnen des Steckbrettes gesteckt. Vor den 12V- und den Ground-Anschluss wird parallel ein 100Mikrofarrad-Widerstand gesteckt. Der Stecker für den eigentlichen Motor wird dann an die Anschlüsse A1,A2,B1 und B2 gesteckt.

Lautsprecher

Der Lautsprecher, den wir verwenden, ist momentan noch ein normaler Piezo Summer, welcher sich im Inneren der Box befindet. Die Schaltung ist daher recht simpel.Einer der Anschlüsse ist mit 5V verbunden, der andere mit einem digitalen Pin.

Minispiel ruhige Hand

Das Minispiel ruhige Hand besteht aus einem großen Draht, welcher unter Strom steht, und dem Hakenstock, welcher mit Ground verbunden ist. Der Hakenstock ist direkt mit Ground verbunden, der Draht hingegen ist mit einem analogen Pin im INPUT_PULLUP Mode verbunden. Dadurch haben wir die Möglichkeit, den Strom am Draht wieder abzuschalten, wenn das Spiel gerade nicht gespielt wird (Pin Mode ändern). Zudem wird mit Hilfe dieser Methode nur ein Pin belegt.

Technische Daten

Pinbelegungstabelle

Pin Pinmode Bauteil Funktion
A0 random Seed für Zufallszahlen
A1
A2
A3
A4 Display SDA
A5 Display SCL
A6 INPUTT_PULLUP oder INPUT (wenn nicht gespielt wird) Draht für Ruhige Hand
A7 OUTPUT DIR Schokoladen Motor steuert Drehrichtung des Motors
D2 OUTPUT STEP Wasserspritzen Motor betreibt Motor
D3 OUTPUT DIR Wasserspritzenmotor steuert Drehrichtung des Motors
D4 OUTPUT STEP Schokoladen Motor betreibt Motor
D5 INPUT_PULLUP Knopf 1 Enter
D6 INPUT_PULLUP Knopf 2 Richtig
D7 INPUT_PULLUP Knopf 3 Falsch
D8 INPUT_PULLUP Knopf 4
D9 INPUT_PULLUP Knopf 5 alle Positionen ausgeben
D10 Fallender Baum Motor
D11 Piezo Summer
D12 Kaputte Brücke Motor

Bauteile und Materialien

  • Arduino-Nano
  • Breadboard
  • LCD Display
  • 2 Servos
  • 2 Schrittmotoren
  • 2 Kondensatoren
  • 2 Treiber
  • 5 Knöpfe
  • Steckerkabel zum Verbinden mit dem Arduino
  • Netzkabel
  • Schrauben, Muttern
  • Holz
  • Polymerknete
  • Farbe
  • Epoxidharz
  • Draht

Code

Hier gibt es den Code zum Download: code_in_den_klauen_des_zufalls.zip

Zu Beginn des Codes wird ein globales Array mit Spielerpoitionen erstellt, wobei anfangs alle Positionen Null sind. Der erste Wert entspricht dabei der Position (als Feldzahl) des ersten Spielers, der zweite Wert der des zweiten Spielers und so weiter. Auf dieses Array können die Funktionen der Spielsteuerung zugreifen, um die Positionen der Spieler abzulesen und/oder zu verändern.

Da das Spiel jeweils nur ein Mal gespielt werden soll, befindet sich der Code, der das eigentliche Spiel ausführt, im Setup. Eine while-Schleife überprüft, ob bereits ein Spieler das Ziel erreicht hat. Ist dies nicht der Fall, wird eine for-Schleife aufgerufen, in der alle vier Spieler einen Zug machen. Dabei wird jeweils die Funktion „laufen“ und dann die „Feldfunktion“ aufgerufen. Nach einem Zug kann man Enter (Knopf 1) drücken, um den nächsten Zug zu starten oder Knopf 5, um alle Positionen ausgeben zu lassen.

Der Code für dem Roboter gliedert sich in verschiedene Unterfunktionen, um die verschiedenen Aufgaben, die der Roboter erledigen muss, übersichtlich und getrennt voneinander aufrufen zu können. Dabei gibt es verschiedene Arten von Funktionen. Wir unterscheiden zwischen Funktionen zur Spielsteuerung, Minispielen, Quizfragen und Aufgaben.

Spielsteuerung

Funktionen zur Spielsteuerung bewegen die Spieler und behalten einen Überblick über deren Positionen. Sie aktivieren zusätzlich die verschiedenen Ereignisse, wenn ein Spieler auf einem Feld steht.

Laufen

Die Funktion erzeugt einen zufälligen Würfelwert zwischen eins und fünf. Der Spieler wird dann auf die entsprechende Position bewegt. Anschließend wird überprüft, ob der Spieler auf dem selben Feld wie einer der anderen Spieler steht. So lange dies der Fall ist, wird der Spieler zufällig einen Schritt vor oder zurück bewegt, bis er sich auf einem freien Feld befindet. Sollte er dabei wieder auf Feld Null landen, wird der Vorgang unterbrochen, da auf dem Startfeld mehrere Spieler stehen können.

Feld zurück

Diese Funktion wird aufgerufen, wenn ein Spieler zum Beispiel ein Minispiel nicht geschafft hat oder eine Frage nicht richtig beantworten konnte.
Der Spieler wird ein Feld zurück bewegt, danach wird überprüft, ob dort bereits ein anderer Spieler steht. In diesem Fall wird der Spieler so lange zurück bewegt, bis er auf einem freien Feld oder dem Startfeld steht (dort können auch mehrere Spieler stehen).

Positionen ausgeben

Diese Funktion kann am Ende jedes Zuges aufgerufen werden. Wird Knopf 5 gedrückt, so werden die Positionen aller Spieler ausgegeben.

Feldfunktion

Die Feldfunktion ist dafür verantwortlich, was auf welchem Feld passiert und wird aufgerufen, nachdem alle Lauf-Aktionen beendet wurden. Sie ruft dann die dem Feld entsprechende Funktion auf. Die Feldfunktion greift auf die Position des Spielers zu und überprüft, ob dieser auf einem Feld mit fester Funktion steht (Baum, Fluss, Abkürzung, Schokoladenausgabe und Brücke). Ist dies nicht der Fall, wird zufällig entschieden, ob eine Aufgabe, eine Quizfrage, ein Minispiel oder gar nichts gestartet wird.

Eingebaute Funktionen

Auf einigen Feldern befinden sich feste Funktionen. Kommt ein Spieler auf eines dieser Felder, wird jedes Mal die selbe Funktion ausgeführt. Diese Feldfunktionen sind:

  • Der fallende Baum (Feld 4)
  • Die Flussfelder (Felder 7 und 9)
  • Die Abkürzung (Felder 13 und 19)
  • Die Schokoladenausgabe (Feld 17)
  • Die Brücke (Feld 22)

Diese Funktionen sind hauptsächlich mechanischer Natur, weswegen im Code eventuell lediglich die Feldzahl angeglichen, ein Servo angesteuert oder per Zufall entschieden wird, ob das Ereignis überhaupt eintritt.
Genaueres kann bei Interesse im Code nachgelesen werde.

Minispiele

Es gibt fünf verschiedene Minispiele, zwischen denen zufällig gewählt wird. Wenn ein Spieler nichtbbetanden hat, wird er jeweils ein Feld (oder mehr) zurückgesetzt. Die Minispiele sind:

  • Reaktionsspiel
  • Töne nachspielen
  • Sching Schang Schong (Schmerz)
  • Ruhige Hand
  • Die Tannen von Hanoi

Reaktionsspiel

Um das Spiel zu starten, drückt der Spieler den Enter Knopf. Danach wird zufällig zwei bis fünf Sekunden gewartet und anschließend ein Ton ausgegeben. Der Spieler muss nun so schnell wie möglich erneut Enter drücken.
Experimentell haben wir ermittelt, dass unsere Reaktionszeiten etwa zwischen 220 und 150 Millisekunden liegen. Daher haben wir uns für eine Reaktionszeit von 175 Millisekunden entschieden. Innerhalb dieser Zeit wird in einer for-Schleife überprüft, ob Enter gedrückt wurde; Falls ja, wird dies in der Variable „geschafft“ gespeichert.
Anschließend wird eine Fallunterscheidung gemacht ob „geschafft“ true oder false ist und dementsprechend die „Schritt zurück“ Funktion aufgerufen.

Abbildung 10: Das Reaktionsspiel

Töne nachspielen

Nachdem der Spieler Enter gedrückt hat, wird ein Array mit zufälligen Zahlen zwischen null und fünf erstellt, wobei jeder Zahl ein Ton (C1 bis G1) zugeordnet wird.
Anschließend wird eine Sekunde lang ein C ausgegeben und direkt danach die fünf zufällig erstellten Töne.
Der Spieler muss nun die Töne in der richtigen Reihenfolge nachspielen. Dabei erklingt auf Knopfdruck jeweils der gespielte Ton. Um die Eingabe zu überprüfen, wird ein weiteres Array erstellt, in dem den Knöpfen wieder die Töne zugewiesen werden.
Zum Schluss werden in einer for-Schleife die beiden Arrays miteinander verglichen. Sind sie identisch, war der Spieler erfolgreich. Ansonsten muss er einen Schritt zurück.

Sching Schang Schong (Schmerz)

Nachdem das Spiel angekündigt wurde, kann der Spieler Knopf eins, zwei oder drei drücken und somit Schere, Stein oder Papier wählen. Daraufhin wird eine Zufallszahl zwischen eins und drei ermittelt und somit bestimmt was der Roboter wählt. Anschließend wird in mehreren Fallunterscheidungen geprüft, wer gewonnen hat. Bei einem Unentschieden erfolgt ein rekursiver Selbstaufruf der Funktion, bis es zu einem Ergebnis kommt.

Ruhige Hand

Die Idee bei diesem Minispiel ist, den Draht, der aus dem Spielfeld schaut, über ein Kabel mit Ground zu verbinden und welcher somit ständig geerdet ist. Der Hakenstock, den man um den Draht herum führen soll, ist mit einem analogen Pin im Input Pullup Modus verbunden. Dadurch ist er immer positiv geladen, außer wenn er direkt mit dem Ground verbunden ist. Ein interner Widertand verhindert dabei, dass ein Kurzschluss entsteht. Wenn sich der Draht und der Hakenstock berühren, führt es dazu, dass am analogen Pin eine Spannung von null Volt anliegt.
Im Code reicht es daher aus, am analogen Pin zu überprüfen, wann die Spannung auf null Volt fällt. Dies geschieht mit einer if-Verschachtelung, die sich innerhalb einer while-Schleife befindet, die so lange läuft, bis der Enter Knopf als Zeichen des Beendens der Aufgabe gedrückt wird.

Die Tannen von Hanoi

Bei diesem Minispiel hat der Roboter vergleichsweise wenige Aufgaben. Er bestimmt eine Zufallszahl von vier bis sechs, welche die Anzahl an Ringen, mit welchen man spielen muss, repräsentiert. Anschließend berechnet er mit einer Formel, wie viel Zeit der Spieler für das Spiel hat. Zehn Sekunden vor Ablauf der Zeit beginnt ein sekündliches Ticken. Nach Ablauf der Zeit geht dies in ein längeres Tonsignal über. Der Spieler muss nun eingeben, ob er erfolgreich war oder nicht.

Abbildung 11: die Tannen von Hanoi

Formel zur Berechnung der Zeit:
Aufgrund des Aufbaus des Spiels braucht man bei optimaler Spielweise für jeden extra Ring immer doppelt so lange wie zuvor. Es handelt sich also um logarithmisches Wachstum. Mathematisch lässt sich solches mit der Formel
f(x)=a*b^x
darstellen. Die Variable b ist dabei der Wachstumsfaktor, in unserem Fall also zwei, da sich die Anzahl der Züge mit jedem extra Ring verdoppelt. Die Variable a beschreibt den Startwert, also wie viel Zeit man für den Minimalfall von 4 Ringen benötigt.

Um diesen Wert zu ermitteln, haben wir Tabelle 1 mit Messwerten der Spielzeit verschiedener Personen erstellt. Daraus können wir entnehmen, dass die durchschnittliche Spielzeit für 4 Ringe bei etwa 20 Sekunden liegt. Um mehr Puffer zu haben und auch kleine Fehler zu erlauben, rechnen wir daher mit a=25sek. Als Formel für die Zeit in Abhängigkeit der Ringanzahl ergibt sich also:
t(ringe) = zeit = 25*2^(ringe-4)

Tabelle 1: Messwerte für die Tannen von Hanoi

Quizfragen und Aufgaben

Sollte kein Minispiel aufgerufen werden, wird eine Quizfrage oder eine Aufgabe gestartet. Diese unterscheiden sich im Code nicht großartig.

In der Gruppe haben wir uns 100 Quizfragen überlegt, diese anschließend alle einzeln im Code als String deklariert und in eine Tabelle einsortiert. Bei den dazugehörigen Antworten sind wir genauso vorgegangen (Frage und Antwort müssen jeweils die selbe Position in der Tabelle haben). Die Besonderheit ist dabei, dass wir aus Speicherplatzgründen alle Strings in den flash Speicher verschoben haben (mehr dazu siehe „Speichermanagement“).
Danach wird die Frage, die der Spieler dann beantworten muss, ausgegeben. Auf Knopfdruck wird die Antwort angezeigt. Daraufhin wird eingelesen, ob die Antwort richtig (Knopf 2) oder falsch (Knopf 3) war.

Die 20 Aufgaben werden auf die selbe Weise ausgegeben und auf Bestehen gewertet.

Knöpfe

Zur Spielsteuerung und für die Minispiele benutzen wir fünf verschiedene Knöpfe. Diese stellen eine leitfähige Verbindung her, wenn der Knopf gedrückt wird. Ursprünglich hatten wir daher die eine Seite mit 5V verbunden, die andere mit einem Pin zum Messen und über einen Wiederstand mit Ground, um zu verhindern, dass nach dem Knopfdruck noch Strom am Messungspin fließt.

Dann erfuhren wir von dem Input Pullup Modus und beschlossen, diesen zu verwenden, um Wiederstände und Platz auf dem Board zu sparen.
Dabei verbindet man den Knopf auf der einen Seite mit Ground und auf der anderen mit dem Messungspin, wodurch am Messungspin immer 5V anliege, außer der Knopf ist gedrückt. Daher ist es wichtig im Code die Logig des Knopfdrucks zu verändern, ein gedrückter Knopf entspricht am Messungspin LOW und ein nicht gedrückter HIGH.

Speichermanagement

Da wir mit einem Arduino Nano arbeiten, haben wir nur 2kB dynamischen Speicher zur Verfügung. Dies ist der Speicherplatz, der mit dynamischen Variablen belegt wird, die sich im Laufe des Programms ändern.
Nach dem wir die 220 Elemente vom Datentyp String hinzugefügt hatten, ließ sich unser Programm nicht mehr kompilieren, da wir 300% des verfügbaren Speichers verbrauchten.

Die Lösung des Problems war dann, die Quizfragen und Aufgaben sowie die anderen Ausgaben im Code in den flash Speicher zu verschieben, wo Daten gespeichert werden können, die sich während des Programmablaufes nicht verändern müssen.
Dadurch verbrauchen wir jetzt nur noch 25% des verfügbaren dynamischen Speichers.

Wie wir die Speicherverschiebung gemacht haben, ist im Code nachzulesen.

Display Ausgabe

Um die Ausgaben des Roboters auf dem Display anzuzeigen, haben wir die Unterfunktion „displayAusgabe“ geschrieben. Dieser Funktion wird ein String übergeben. Anschließend teilt sie diesen in vier gleich große Stücke mit je 37 Zeichen auf. Dies ist nötig, da sonst im folgenden Schritt Fehler auftreten, falls der String zu groß ist.
Als erstes wird Textabschnitt eins ausgegeben. Dabei sieht man nur die ersten 16 Zeichen, da das Display nur 16×2 Zeichen zeigen kann. Nach einer Sekunde Verzögerung wird der Textabschnitt an die Unterfunktion „textScrollen“ übergeben, welche alle 250 Millisekunden den Cursor ein Schritt nach links verschiebt und somit dafür sorgt, dass der Text über den Bildschirm scrollt. Wenn alle 37 Zeichen durchgescrollt wurden, ist die Funktion „textScrollen“ beendet. Je nach dem, wie lang der original Text ist, der ausgegeben werden soll, werden noch weitere Unterabschnitte des Textes an „textScrollen“ übergeben, bis der gesamte Text ausgegeben wurde.
Es ist auch möglich, eine Ausgabe über längeres Drücken des Enter Knopfes zu überspringen. Dafür befindet sich in der Funktion „textscrollen“ innerhalb der for-Schleife eine Abfrage, ob Knopf 1 gedrückt ist. Sollte dies der Fall sein, wird durch den „continue“ Befehl der Rest der Schleife übersprungen. Drückt man den Knopf lange genug (ca eine halbe bis eine Sekunde), wird dadurch die gesamte Ausgabe übersrpungen.

Ergebnis und Diskussion

Alles in Allem muss unser Roboter vielfältige Funktionen ausführen und dabei immer über das gesamte Spielgeschehen einen Überblick behalten. Die auf die Spielregeln angepassten Algorithmen, die der Roboter auszuführen hat, ermöglichen den Spielern einen spannenden und einzigartigen Spielverlauf. Er würfelt, versetzt die Spieler, führt die dem Feld entsprechenden Funktionen aus (leitet mechanische Funktionen ein, spielt gegen die Spieler Minispiele und stellt ihnen Fragen und Aufgaben). Der Roboter erfüllt all das, was wir erwartet haben, nicht weniger und nicht mehr.

Wir entwickelten sowohl vor der praktischen Arbeit als auch währenddessen viele weitere kleine Ideen, die das Spiel immer lustiger und amüsanter gemacht hätten. Da unsere Zeit jedoch begrenz war, mussten wir uns Prioritäten setzten und verzichteten somit auf einige Extras. Aufgrund des Zeitmangels haben wir es nicht geschafft, die Jelly-Bean-Ausgabe im Schlaraffenland zu bauen. Das ist auf jeden Fall noch etwas, was wir in Zukunft ergänzen möchten. Das Spiel kann immer aufs Neuste weiterentwickelt werden. Es können neue Fragen, Aufgaben und Minispiele gegen den Roboter ergänzt werden. Anstelle von Spieler 1 , Spieler 2 usw. könnten wird die Namen der Spieler zuvor in unseren Code integrieren, sodass der Roboter die Spieler bei Namen nennt. Was das ganze Spiel nochmal attraktiver machen würde, wäre der Einbau einer Menü-Funktion, in der die Spieler individuell einige Funktionen an- und abschalten können oder dass sie über diese Einstellung die Wahrscheinlichkeiten für das Eintreten einer Funktion ändern. Dadurch lässt sich das Schwierigkeitsniveau des Spiels anpassen.

Gelernt haben wir nicht nur das Coden und Umsetzten einer technischen Idee; Wir haben auch viel über Zeitmanagement, effizientes Arbeiten sowohl alleine als auch in einem Team und über den Umgang mit unerwarteten Problemen gelernt. Sei es beim Coden, Speichermanagement, Ansteuern des Displays oder der einzelnen Mechanismen, wie der der Wasserspritze.

Trotz der manchmal nervenkitzelnden Probleme hatten wir zusammen eine schöne und unvergesslichen Zeit. Aus vier unbekannten Studenten, die gerade auf der Suche nach dem nächsten Schritt im Leben sind, sind vier gute Freunde geworden.


Bildergalerie

Abbildung 12: Eine erste Skizze des Spielfeldes
Abbildung 13: Bohren der Felder
Abbildung 14: fertig geformte Oberplatte
Abbildung 15: Planung der Schlucht
Abbildung 16: fertige Schlucht
Abbildung 17: erste Deko
Abbildung 18: Die Brücke
Abbildung 19: fertig gebautes Spielbrett
Abbildung 20: zusammengeschraubte Box
Abbildung 21: noch mehr Dekoelemente
Abbildung 22: der Draht für ruhige Hand
Abbildung 23: Spielbrett mit Farbe
projektewise21/spieldeslebenspublic/start.txt · Zuletzt geändert: 2022/05/14 19:23 von d.golovko