Model
Ein Datenmodell entwerfen
In den meisten Fällen ist es sinnvoll, sich zuerst Gedanken zu machen, welche Daten gespeichert werden sollen. Die Struktur dieser Daten wird dann in einem Datenmodell festgehalten, das man üblicherweise als Model bezeichnet.
In Elm wird das Model meistens als ein Record definiert. Selbst wenn es sich um eine Anwendung handelt, die nur eine einzelne Zahl speichert, wird das Model als Record definiert. Das hat den Vorteil, dass man später leichter weitere Daten hinzufügen kann, ohne das Model komplett umzuschreiben.
Daten des Nim-Spiels
Zu Beginn sollte man die Modellierung der Daten möglichst einfach halten. Zusätzliche Daten können später hinzugefügt werden. Überlegungen zur Modellierung der Daten des Nim-Spiels könnten so aussehen:
Wir müssen die Anzahl an Streichhölzern speichern, die noch übrig sind. Außerdem müssen wir speichern, welcher Spieler gerade am Zug ist. Das könnte der erste oder der zweite Spieler sein. Die Namen der Spieler speichern wir fürs Erste nicht. Am Ende des Spiels müssen wir wissen, welcher Spieler gewonnen hat. Auch das könnte der erste oder der zweite Spieler sein. Zu Beginn hat noch kein Spieler gewonnen. Da ein Datenfeld nicht leer sein kann, müssen wir auch diese Möglichkeit vorsehen.
Um den aktuellen Spieler und den Gewinner zu speichern, sollten wir einen Datentyp definieren, der die Möglichkeiten ErsterSpieler, ZweiterSpieler und KeinSpieler enthält.
Zu Beginn des Spiels ist der erste Spieler am Zug. Wir starten mit 10 Streichhölzern. Gewonnen hat natürlich noch niemand.
Aufgabe 1
Model
für den aktuellen Zustand des Spiels
und den Anfangszustand im Record initialModel
enthalten.
Gehe von folgendem Grundgerüst aus:
module Main exposing (..)
import Browser
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
-- ... hier fehlt noch etwas ...
main =
text "Ansicht kommt noch ..."
type Spieler
= ErsterSpieler
... ???
type alias Model =
{ rest : ???
, amZug : ???
, ???
}
initialModel : Model
initialModel =
{ ???
, ???
, ???
}