Tipps
Vorwarnung
Achtung! Im Folgenden erhältst du ein paar Tipps, die dir bei der Problemlösung zu den jeweiligen Aufgaben helfen sollen. Diese können auch Teile der Lösung enthalten, benutze sie daher nur dann, wenn du bei einer Aufgabe nicht mehr weiterkommen solltest!
Tipps zu Aufgabe 1: Grundprinzip Roulette
In diesem Tipp soll es um die Zufallsziehung und die Gewinnberechnung beim Roulette gehen.
Tipp zur Zufallsziehung
Für eine einfache Simulation der Zufallsziehung beim Roulette in R
benutzt man den sample
-Befehl. Für weitere Informationen zu dieser Funktion und den Argumenten schau dir die interne Hilfe an. Roulette ist nicht sehr kompliziert, du brauchst also nur die Basics.
Wenn du 50 Ziehungen in einem Objekt speichern willst, gibt es zwei Möglichkeiten:
- Entweder du bleibst bei der
sample
-Funktion und benutzt passende Argumente dafür, - oder du benutzt eine
for
-Schleife, um 50 Mal den gleichen Befehl auszuführen und das Ergebnis jeweils einem Objekt hinzuzufügen.
Tipp zur Gewinnberechnung
Im vorherigen Teil hast du einen Vektor mit 50 Ziehungen angelegt. Wie berechnet man jetzt daraus den Gewinn für eine Wette auf die 9?
Dafür benötigst du eine Art der if
-Funktion. Diese Funktion ist auf Vektoren anwendbar und überführt die einzelnen Zufallsziehungen entweder in ein Ergebnis A (Bedingung “Zahl = 9” erfüllt) oder in ein Ergebnis B (Bedingung “Zahl = 9” nicht erfüllt). Hier entsteht also ein neuer Vektor, der die Zufallsziehungen in Gewinn bzw. Verlust für diese Ziehung überführt. Daraus lässt sich dann durch einfache Addition der Gesamtgewinn berechnen.
Wichtig: Die gesuchte Funktion lässt sich leicht im Internet finden. Geh dort auf die Suche!
Tipps zu Aufgabe 2: Implementierung verschiedener Wettmöglichkeiten
Tipp zur Überarbeitung der Gewinnberechnung
Mehrere Dinge müssen verändert werden, um weitere Wettmöglichkeiten in die Gewinnberechnung zu implizieren.
Zum einen muss die Bedingung verändert werden. ==
eignet sich nicht dafür, zu überprüfen, ob eine Zahl Element einer Zahlengruppe ist. Aus diesem Grund sollte man hierfür nun is.element()
benutzen. Sofern dir nicht klar ist, was diese Funktion macht und wie sie aufgebaut ist, schau dir die Funktion in der Hilfefunktion von R
an.
Zum anderen muss man beachten, dass es nun unterschiedliche Quoten für die verschiedenen Wetten gibt. Aus diesem Grund kann man eine weitere if
-Funktion mit mehreren elseif
-Fortsätzen einfügen, die für jede Wettmöglichkeit die Gewinnausschüttung angibt [z.B. if (x == RED){y} elseif (x == firstThird){2y}
mit x
= Wette und y
= Einsatz]. Für das Beispiel heißt das: Wenn auf RED
gewettet wurde, so liegt der Gewinn bei Eintreffen der Wette bei y
, man erhält den eigenen Einsatz also doppelt zurück.
Nicht vergessen: Die Zahlengruppen, wie z.B. RED
und BLACK
, müssen zuvor erstellt werden. Dafür erstellt man Objekte, die die jeweiligen Zahlen enthalten.
Die Berechnung des Gewinns nach dem oben genannten Schema führt unter bestimmten Umständen zu einer Warnung in R
: the condition has length > 1 and only the first element will be used
. Der Fehler liegt hier im Abgleich der Wette mit den verschiedenen Wettmöglichkeiten, um die richtige Berechnung des Gewinns auszuwählen: if (x == RED){y} elseif (x == firstThird){2y}
.
Informiere dich darüber, was der Fehler zu bedeuten hat und unter welchen Bedingungen die Funktion in Folge dessen einen falschen Gewinn ausgibt.
Überlege dir eine Alternative zur Berechnung des Gewinns (hierzu eignet sich zum Beispiel die
identical()
-Abfrage).
Viele verschiedene Wettmöglichkeiten führen zu einer identischen Gewinnberechnung (z.B. RED
und BLACK
). Dadurch wiederholen sich in der Funktion möglicherweise einige Befehle. Versuche das durch die Verwendung des mathematischen “oder”, in R
: |
(“Alt Gr” + “<”), zu vermeiden.
Tipp zur Erstellung der neuen Schleife
Im letzten Schritt benutzt man eine for
-Schleife. In diese setzt du die Zufallsziehung und die Gewinnberechnung ein, sodass in jedem Durchlauf direkt auch der Gewinn ausgegeben werden kann. Wichtig: Beide Variablen müssen in einem Objekt abgespeichert werden! Falls du nicht weißt, wie man das bei einer Schleife macht, schau dir das Beispiel in der Übersicht an.
Tipps zu Aufgabe 3: Spiele, bis du X Euro gewonnen hast.
Hier erhältst du zwei Möglichkeiten, um das selbe Problem zu lösen. Die erste Möglichkeit wird dich etwas mehr fordern. Probiere es also zuerst damit. Falls du es damit nicht schaffst, die Aufgabe zu lösen, schau dir die zweite Möglichkeit an. Diese gibt dir Hinweise zu den einzelnen Schritten, bis du zur Lösung des Problems kommst.
Möglichkeit 1: Übertragen von Modell
Falls du noch nicht darauf gekommen bist, schau dir nochmal das Beispiel auf der Übersichtsseite von diesem Projekt an. Dort findest du eine Funktion nach dem gleichen Schema, wie es auch hier gefordert ist. Falls dir das nicht ausreicht, kannst du zusätzlich dazu auch noch Möglichkeit 2 nutzen.
Möglichkeit 2: Schrittweise Anleitung
Zunächst solltest du dich damit vertraut machen, welche neue Funktion man in dieser Aufgabe verwenden muss. Überlege dir, welche der Funktionen hier unter dem Reiter “Programmierung” Sinn ergeben würde.
Schau dir zunächst einmal an, was du aus den vorherigen Abschnitten übernehmen kannst. Ändert sich etwas an der Zufallsziehung und der Gewinnberechnung? Was kommt neu hinzu?
In kurz: Zufallsziehung und Gewinnberechnung bleiben gleich; können also 1:1 übernommen werden. Neu sind die Bedingung mit dem Gesamtgewinn, das Updaten des Gesamtgewinns und das Zählen der Durchgänge.
Beginnen wir bei der Bedingung: Die Bedingung sollte den Befehl geben, dass die Schleife so lange wiederholt wird, bis der Gesamtgewinn nicht mehr kleiner als der gewünschte Gesamtgewinn ist.
Die Berechnung des Gesamtgewinns erfordert eine neue “Technik”, da dieser jeden Durchgang aktualisiert werden muss. Dazu muss vor der Durchführung der Funktion ein Gesamtgewinn
-Objekt mit dem Wert 0 erstellt werden. Jede Runde soll dieser Gesamtgewinn dann erneuert werden, indem man den alten Gesamtgewinn und den Gewinn der aktuellen Runde addiert.
Achtung: Diese Berechnung muss nach der Berechnung des aktuellen Gewinns geschehen, ansonsten rechnet man mit dem Gewinn aus der vorherigen Runde.
Der letzte Schritt sollte sein, die Durchgänge zu zählen. Das beruht auf der gleichen Methode, wie die Berechnung des Gesamtgewinns.
Möglicherweise erreicht man den erwünschten Gewinn nie und in Folge dessen würde die Schleife unendlich weiterlaufen (Sofern du die Schleife bereits gestartet hast, aber die Funktion nicht zum Ende kommt, nutze den “STOP”-Button in der oberen rechten Ecke der Konsole, um die Funktion manuell zu stoppen!). Um das unendliche Weiterlaufen zu vermeiden, muss eine weitere Bedingung die Spiel-Durchgänge begrenzen. Schau dir dafür beispielsweise den break
-Befehl an und wie er zu benutzen ist.
Natürlich kannst du auch eine weitere Bedingung zum Abschluss der Funktion mit einem logischen “oder” hinzufügen. Das sollte dann so aussehen: while (cond1 | cond2) {...}
.
Tipps zu Aufgabe 4: Funktionen
In diesem Abschnitt beschäftigen wir uns mit dem Erstellen von eigenen Funktionen, um eine authentische Roulette-bezogene Ausgabe in R
zu erhalten. Da die Problemstellung in zwei Teile geteilt ist und man zwei Funktionen erstellen soll, teilen wir auch die Tipps in zwei Teile.
Teil 1
Als allererstes solltest du dir diesen Link zu der function
-Funktion in R
durchlesen, falls du dich damit noch nicht auskennst. Hierin wird erklärt, wie diese Funktion in R
funktioniert. Sobald du das verstanden hast, kannst du mit dem Erstellen der Funktion beginnen.
Ein wichtiger Bestandteil der Funktion sind die Parameter in der normalen Klammer. Hier stellt sich die Frage: Wie viele “Unbekannte” wird meine Funktion haben? Welche Information braucht meine Funktion? - In unserem Fall handelt es sich nur um zwei Unbekannte, die man als Spieler im vorhinein angeben muss:
- Der Einsatz: Wie viel will ich setzen?
- Die Wette: Auf was will ich setzen?
Diese zwei Variablen müssen also in der normalen Klammer benannt werden (dafür kannst du jegliche sich unterscheidende Buchstaben verwenden).
Jetzt kannst du mit dem Schreiben der Funktion beginnen. Dafür kannst du einige Operationen aus den vorherigen Aufgaben übernehmen. Beachte dabei nur, die Variablen aus der normalen Klammer bei den Operationen an der richtigen Stelle einzusetzen.
Das Grundgerüst für Roulette sollte nun stehen, nur gibt die Funktion noch keinen Output aus. Dafür können wir den message
-Befehl benutzen. Dieser ermöglicht es uns, auch Variablen in den Text einzufügen. Hier ein Beispiel:
Wuerfeln1 <- function (){
message ("Bitte jetzt würfeln!")
Augenzahl <- sample (1:6, 1)
message ("Du hast eine ", Augenzahl, " geworfen!")}
Wuerfeln1 ()
## Bitte jetzt würfeln!
## Du hast eine 5 geworfen!
Nutze das für deine Nachricht(en) aus!
Um das Ganze noch authentischer zu gestalten, kannst du jetzt Pausen für die Ausgabe einbauen. Dafür benutzt man den Sys.sleep
-Befehl, der in Klammern die Pausenzeit in Sekunden enthält. So kann beim Würfeln zum Beispiel die Zeit zum Fallen des Würfels simuliert werden:
Wuerfeln2 <- function (){
message ("Bitte jetzt würfeln!")
Augenzahl <- sample (1:6, 1)
Sys.sleep (3.0)
message ("Du hast eine ", Augenzahl, " geworfen!")}
Wuerfeln2 ()
## Bitte jetzt würfeln!
## Du hast eine 2 geworfen!
Teil 2
Diese Funktion gestaltet sich etwas komplexer als die vorherige Funktion. Hier werden wir mit dem repeat
-Befehl und if (condition) break
arbeiten. Schau dir die Funktionsweise davon im Internet oder in den vorgeschlagenen Websiten auf der Übersichtsseite dieses Projekts an. An sich funktioniert dieser Befehl genauso wie eine for
- oder while
-Schleife, nur dass wir die Schleife hier erst dann stoppen wollen, wenn ein explizites Ereignis eintritt.
Wie bereits in allen anderen Aufgaben solltest du auch hier auf den bereits vorhandenen Operationen aufbauen. Für diese Funktion eignet sich logischerweise die Funktion aus Teil 1 dieses Abschnitts. Es kommt nur eine weitere Variable - neben Einsatz und Wette - hinzu: die Rundenzahl. Das ist die erste Ergänzung, die du vornehmen kannst: Erstelle eine neue Rundenvariable in der normalen Klammer. (Außerdem solltest du dieser Funktion einen neuen Namen geben, um die erste Funktion nicht zu überschreiben)
Hier soll es nun darum gehen, wie wir die neue Rundenvariable (die durch den/die Spieler:in angegeben wird) mit der gerade gespielten Runde abgleichen können, sodass die Schleife dann endet. Dafür muss nach bereits angewendetem Prinzip eine weitere Variable erstellt werden, die die aktuelle Runde zählt (also jede Runde 1 addiert wird). Diese muss dann ganz am Ende der repeat
-Schleife mit der durch den/die Spieler:in angegebenen Rundenzahl abgeglichen werden. Wenn beide Variablen den gleichen Wert haben, soll die Schleife abgebrochen werden.
Das Rundenproblem sollte damit gelöst sein. Hinzu kommt jedoch noch der Gesamtgewinn. Dieser wird bis jetzt nicht ermittelt (es wird nur immer wieder der Gewinn der gerade laufenden Runde ermittelt und dann in der nächsten Runde überschrieben). Natürlich kann der Gewinn jeder Runde in einer Nachricht ausgegeben werden, dadurch erhält man jedoch keinen Gesamtgewinn. Dieser sollte auch nach bereits bekanntem und angewendetem Schema ermittelt werden: Variable mit dem Wert “0” vor der repeat
-Schleife erstellen; dann jede Runde updaten.
Der letzte Schritt sind Nachrichten und Pausen. Hier kann man kreativ werden; auf jeden Fall kann man die Nachrichten aus der Funktion in Teil 1 übernehmen. Diese werden in jeder Runde ausgegeben. Außerdem sollte man (auch in jeder Runde) den Gesamtgewinn angeben. Neben diesen Nachrichten sollten auch bei Beenden der Schleife Nachrichten folgen, die das Spiel zusammenfassen. Hierbei kann man auch, je nach Gesamtgewinn, verschiedene “Pfade” erstellen.
Zu bedenken ist dabei, in welcher Reihenfolge die Funktion die Informationen für die Nachrichten berechnet, sodass jede Runde die aktuellen Daten ausgegeben werden und nicht die Daten der vorherigen Runde. –> Schreibe die ründlichen Nachrichten an das Ende der repeat
-Funktion (direkt über if (cond) break
). Die anderen Nachrichten schreibst du an das Ende der gesamten Funktion. So gehst du in jedem Fall auf Nummer sicher.