||Tetris in Miranda
||Idee: Mark Caeles Weyer + Fabian Nilius
||Realisierung: Fabian Nilius
||Hauptmodul:
||Hier wird das Spiel gestartet und beendet.
||Hier findet auch das einzige nicht-funktionale statt,
||da hier die Zeit (fuer den Zufallsgenerator) eingelesen wird.
||Der Eingabestream wird als unendlicher Stream an das Programm uebergeben.
%include "zustand" || zustand.m
|| Startzustand
|| Uebergang von einem Zustand zum Naechsten
%include "eingabe" || eingabe.m
|| Routinen zur Ein/Ausgabe, unter anderem:
|| teinstream
|| tausstream
|| eingabe
|| rest
%include "zellen" || zellen.m
%include "stein" || stein.m
|| hier eingebunden, aber erst von zustand benutzt, und dort erklaert
|| Startaufruf - Holt Systemzeit und Eingabestream ( $- )
tetris :: tausstream
tetris
= spielschritt (startzustand zeit) $-
|| Hauptschleife des Programms:
|| Aktuellen Zustand ausgeben
|| Eingabe lesen
|| Neuen Zustand berechnen
|| Rekursion
spielschritt :: tzustand->teinstream->tausstream
spielschritt zustand stream
|| Falls nicht Ende und Darstellung noetig
= (ausgeben zustand) ++ (spielschritt zustandneu (rest stream)),
if (ende zustand = False) & (geaendert zustand)
|| Falls nicht Ende, Darstellung aber unveraendert
= spielschritt zustandneu (rest stream),
if (ende zustand = False)
|| Falls Ende
= spielende zustand stream,
otherwise
where
zustandneu
= neuerzustand zustand (eingabe stream)
|| spielende: Der Zustand wird hierhin mituebergeben, damit die in Zustand
|| kodierte Zufallszahl nicht verloren geht (fuer ein neues Spiel)
spielende zustand stream
= "Wir hoffen, Ihnen hat das Spiel gefallen.\nSie haben eine einfaches funktionales Programm sehr gluecklich gemacht.\n\nVerspueren Sie den Wunsch, noch einmal zu spielen,\nso tippen Sie '4'. Sonst bitte '2'.\n" ++ abwarten zustand stream
abwarten zustand stream
= [],
if (eingabe stream) = '2'
= spielschritt (startzustand (zufallszahl zustand)) (rest stream),
if (eingabe stream) = '4'
= abwarten zustand (rest stream),
otherwise
|| Tja ja, nicht wirklich funktional
zeit :: num
zeit
= ausschnitt (system "date +%H%M%S")
where
ausschnitt (ausgabe,fehler,exit)
= numval (take 6 ausgabe)