Sign in Join
Wiki copytemporary

trivial/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: trivial/de

OldNewLine
1+Zurück zur [[Console/de|Konsolenseite]].
2+
3+Dieses Spiel Trivial ist ein einfaches Spiel für die Konsole (Windows), das Terminal (Linux) oder auch für die Kommandozeile (DOS).
4+
5+Das Spiel soll die Möglichkeiten von Free Pascal demonstrieren.
6+
7+Dieses Spiel hat keine Hilfe.
8+
9+Das Programm wird durch das drücken einer der Tasten \<ESC\>, oder \<E\> beendet.
10+
11+Das Hauptprogramm trivial ruft die einzelnen Unterprogramme auf:
12+
13+``` pascal
14+program trivial;
15+
16+{$mode objfpc}{$H+}
17+{$IMPLICITEXCEPTIONS OFF}
18+
19+uses
20+ uDateiEinLesen,
21+ uSpielLogik,
22+ uAusgabe,
23+ Crt;
24+
25+{$R *.res}
26+
27+begin
28+
29+ // Liest die Datei mit den Fragen ein
30+ subDateiEinlesen;
31+ repeat
32+
33+ subFragenReihenfolge;
34+ subAusgabe;
35+ subEingabe;
36+ // Zwei Sekunden Pause
37+ Delay(2000);
38+ until 0 > 1;
39+
40+end.
41+```
42+
43+Die Unit subDateiEinlesen.pas liest die Textdatei mit den Fragen ein.\
44+Die Datei mit den Fragen hat folgendes Format:\
45+* Die Datei mit den Fragen ist eine csv-Datei ohne Kopfzeile und ohne Größenbegrenzung.
46+
47+- Das Trennzeichen zwischen der Frage und den möglichen Antworten ist das Semikolon.
48+- Die erste Antwort, die nach der Fage kommt ist die richtige Antwort.
49+
50+``` pascal
51+unit uDateiEinLesen;
52+
53+{$mode objfpc}{$H+}
54+{$IMPLICITEXCEPTIONS OFF}
55+
56+interface
57+
58+uses
59+ SysUtils, uSpielLogik;
60+
61+var
62+ intSemikolonZaehler: integer = 0;
63+
64+procedure subDateiEinlesen;
65+
66+implementation
67+
68+procedure subArrayZuWeisen(strDateiInhalt: string);
69+var
70+ intI: integer = 0;
71+ //intSemikolonZaehler: integer = 0;
72+ intarrLaenge: integer = 0;
73+
74+begin
75+
76+ // prüft, ob ein leerer String übergeben wurde
77+ if strDateiInhalt = '' then
78+ Exit;
79+
80+ // setzt den Semikolonzähler wieder auf 0
81+ intSemikolonZaehler := 0;
82+
83+ // Legt die neue Grösse des Arrays fest
84+ intarrLaenge := length(arrTrivial);
85+ SetLength(arrTrivial, intarrLaenge + 1);
86+
87+ for intI := 0 to length(strDateiInhalt) do
88+ begin
89+
90+ if strDateiInhalt[intI] = ';' then
91+ intSemikolonZaehler := intSemikolonZaehler + 1
92+ else
93+ begin
94+
95+ case intSemikolonZaehler of
96+ 0:
97+ arrTrivial[intarrLaenge].strFrage :=
98+ arrTrivial[intarrLaenge].strFrage + strDateiInhalt[intI];
99+ 1:
100+ arrTrivial[intarrLaenge].strAntwort1 :=
101+ arrTrivial[intarrLaenge].strAntwort1 + strDateiInhalt[intI];
102+ 2:
103+ arrTrivial[intarrLaenge].strAntwort2 :=
104+ arrTrivial[intarrLaenge].strAntwort2 + strDateiInhalt[intI];
105+ 3:
106+ arrTrivial[intarrLaenge].strAntwort3 :=
107+ arrTrivial[intarrLaenge].strAntwort3 + strDateiInhalt[intI];
108+ end;
109+
110+ end;
111+
112+ end;
113+
114+end;
115+
116+procedure subDateiEinlesen;
117+var
118+ datDatei: TextFile;
119+ strDateiInhalt: string;
120+
121+begin
122+
123+ // öffnet die Datei
124+ AssignFile(datDatei, 'Trivial.txt');
125+ // setzt den Dateizeiger auf den Anfang der Datei
126+ Reset(datDatei);
127+
128+ // liest die Datei bis zu ihrem Ende ein
129+ while not EOF(datDatei) do
130+ begin
131+ ReadLn(datDatei, strDateiInhalt);
132+ if strDateiInhalt <> '' then
133+ subArrayZuWeisen(strDateiInhalt);
134+ end;
135+
136+ //Schliesst die Datei
137+ CloseFile(datDatei);
138+
139+end;
140+
141+end.
142+```
143+
144+Die Unit uSpiellogik.pas enthält die Spielsteuerung.
145+
146+Hier befindet sich auch die Anweisung für den Programmabbruch.
147+
148+Die Tasten \<ESC\>, oder \<E\> beenden das Programm.
149+
150+``` pascal
151+unit uSpielLogik;
152+
153+{$mode objfpc}{$H+}
154+{$IMPLICITEXCEPTIONS OFF}
155+
156+interface
157+
158+uses
159+ SysUtils, crt;
160+
161+type
162+ TTrivial = record
163+ strFrage: string;
164+ strAntwort1: string;
165+ strAntwort2: string;
166+ strAntwort3: string;
167+ end;
168+
169+type
170+ TAntwort = record
171+ strAntwort1: string;
172+ strAntwort2: string;
173+ strAntwort3: string;
174+ end;
175+
176+var
177+ arrTrivial: array of TTrivial;
178+ typeAntwort: TAntwort;
179+
180+const
181+ // Die Konstanten sind typisierte Konstanten
182+ conintZufallszahlAntwort: integer = 0;
183+ conintZufallszahlArray: integer = 0;
184+
185+procedure subFragenReihenfolge;
186+procedure subEingabe;
187+
188+implementation
189+
190+uses
191+ uAusgabe;
192+
193+procedure subZufallszahlArray;
194+begin
195+ randomize;
196+ conintZufallszahlArray := random(length(arrTrivial));
197+end;
198+
199+procedure subZufallszahlAntwort;
200+begin
201+ randomize;
202+
203+ // Da die Verteilung der Zufallszahlen bei random(2) + 1 zu ungenau ist,
204+ // wurde dieser Lösungsansatz gewählt:
205+ conintZufallszahlAntwort := random(29) + 1;
206+
207+ if (conintZufallszahlAntwort mod 3) = 0 then
208+ conintZufallszahlAntwort := 3
209+ else if (conintZufallszahlAntwort mod 2) = 0 then
210+ conintZufallszahlAntwort := 2
211+ else
212+ conintZufallszahlAntwort := 1;
213+
214+ // Alternativ zu obigen Weg geht auch dieser Weg:
215+ {case conintZufallszahlAntwort of
216+ 3, 6, 9, 12, 15, 18, 21, 24, 27, 30:
217+ conintZufallszahlAntwort := 3;
218+ 2, 4, 8, 10, 14, 16, 20, 22, 26, 28:
219+ conintZufallszahlAntwort := 2;
220+ else
221+ conintZufallszahlAntwort := 1;
222+ end;}
223+
224+end;
225+
226+procedure subFragenReihenfolge;
227+begin
228+ // Wählt die Frage aus
229+ subZufallszahlArray;
230+ // Wählt aus, an welcher Stelle
231+ // die richtige Antwort erscheinen soll
232+ subZufallszahlAntwort;
233+
234+ case conintZufallszahlAntwort of
235+ 1:
236+ begin
237+ typeAntwort.strAntwort1 := arrTrivial[conintZufallszahlArray].strAntwort1;
238+ typeAntwort.strAntwort2 := arrTrivial[conintZufallszahlArray].strAntwort2;
239+ typeAntwort.strAntwort3 := arrTrivial[conintZufallszahlArray].strAntwort3;
240+ end;
241+ 2:
242+ begin
243+ typeAntwort.strAntwort1 := arrTrivial[conintZufallszahlArray].strAntwort2;
244+ typeAntwort.strAntwort2 := arrTrivial[conintZufallszahlArray].strAntwort3;
245+ typeAntwort.strAntwort3 := arrTrivial[conintZufallszahlArray].strAntwort1;
246+ end;
247+ 3:
248+ begin
249+ typeAntwort.strAntwort1 := arrTrivial[conintZufallszahlArray].strAntwort3;
250+ typeAntwort.strAntwort2 := arrTrivial[conintZufallszahlArray].strAntwort1;
251+ typeAntwort.strAntwort3 := arrTrivial[conintZufallszahlArray].strAntwort2;
252+ end;
253+ else
254+ begin
255+ typeAntwort.strAntwort1 := ' Fehler ' + IntToStr(conintZufallszahlAntwort);
256+ typeAntwort.strAntwort2 := ' Fehler ' + IntToStr(conintZufallszahlAntwort);
257+ typeAntwort.strAntwort3 := ' Fehler ' + IntToStr(conintZufallszahlAntwort);
258+ end;
259+ end;
260+end;
261+
262+procedure subEingabe;
263+var
264+ chrEingabe: char = ' ';
265+
266+begin
267+
268+ // Wandelt Tastatureingabe in Kleinbuchstaben um
269+ chrEingabe := LowerCase(Readkey);
270+
271+ // Überschreibt den Inhalt der Statuszeile und
272+ // setzt die Farbe für die Schrift wieder auf Hellgrau
273+ subStatuszeile(' ',
274+ LightGray);
275+
276+ case chrEingabe of
277+ #27, 'q', 'e':
278+ begin
279+ // Gibt an der Statuszeile das Programmende aus und
280+ // setzt die Farbe für die Schrift auf Hellgrau
281+ subStatuszeile('Das Programm Trivial wurde beendet.', LightGray);
282+ halt;
283+ end;
284+
285+ 'a':
286+ begin
287+ begin
288+ if typeAntwort.strAntwort1 =
289+ arrTrivial[conintZufallszahlArray].strAntwort1 then
290+ subStatuszeile('Richtig', LightGreen)
291+ else
292+ subStatuszeile('Falsch', LightRed);
293+ end;
294+ end;
295+
296+ 'b':
297+ begin
298+ begin
299+ if typeAntwort.strAntwort2 =
300+ arrTrivial[conintZufallszahlArray].strAntwort1 then
301+ subStatuszeile('Richtig', LightGreen)
302+ else
303+ subStatuszeile('Falsch', LightRed);
304+ end;
305+ end;
306+
307+ 'c':
308+ begin
309+ if typeAntwort.strAntwort3 =
310+ arrTrivial[conintZufallszahlArray].strAntwort1 then
311+ subStatuszeile('Richtig', LightGreen)
312+ else
313+ subStatuszeile('Falsch', LightRed);
314+ end;
315+ end;
316+
317+end;
318+
319+end.
320+```
321+
322+Die Unit uAusgabe.pas ist für die Anzeige des Spiels an der Konsole zuständig.
323+
324+``` pascal
325+unit uAusgabe;
326+
327+{$mode objfpc}{$H+}
328+{$IMPLICITEXCEPTIONS OFF}
329+
330+interface
331+
332+uses
333+ SysUtils, crt, uSpielLogik;
334+
335+const
336+ constrCopyright = '(c) 2015 by Olaf';
337+ constrVersion = 'Version: 0.4.0';
338+ conintStatuszeile = 14;
339+
340+procedure subAusgabe;
341+procedure subStatuszeile(strUebergabe: string; intFarbe: integer);
342+
343+implementation
344+
345+function funTextZentrieren(strText: string): integer;
346+begin
347+ Result := Trunc((80 - length(strText)) / 2);
348+end;
349+
350+procedure subTitel;
351+begin
352+ ClrScr;
353+ GOTOXY(funTextZentrieren('TRIVIAL'), 1);
354+ Write('TRIVIAL');
355+ GOTOXY(funTextZentrieren(constrVersion), 2);
356+ Write(constrVersion);
357+ GOTOXY(funTextZentrieren(constrCopyright), 3);
358+ Write(constrCopyright);
359+end;
360+
361+procedure subKoerper;
362+begin
363+ GOTOXY(1, 6);
364+ Write(arrTrivial[conintZufallszahlArray].strFrage);
365+ GOTOXY(1, 8);
366+ Write('a) ' + typeAntwort.strAntwort1);
367+ GOTOXY(1, 9);
368+ Write('b) ' + typeAntwort.strAntwort2);
369+ GOTOXY(1, 10);
370+ Write('c) ' + typeAntwort.strAntwort3);
371+ GOTOXY(1, 12);
372+end;
373+
374+procedure subStatuszeile(strUebergabe: string; intFarbe: integer);
375+begin
376+ TextColor(intFarbe);
377+ GOTOXY(1,conintStatuszeile);
378+ Write(strUebergabe);
379+ TextColor(LightGray);
380+ GOTOXY(1,conintStatuszeile + 2);
381+end;
382+
383+procedure subInfo();
384+begin
385+ GOTOXY(1,conintStatuszeile + 1);
386+ WriteLn('Die Tasten <ESC>, <q> oder <e> beenden das Programm.');
387+end;
388+
389+procedure subAusgabe;
390+begin
391+ subTitel;
392+ subKoerper;
393+ subInfo;
394+end;
395+
396+end.
397+```
398+
399+Beispiel für die Datei (Trivial.txt) die die Fragen und die Antworten enthält:
400+
401+`Was ist der Pumukl?;ein Kobold;ein Klabautermann;ein Schreinermeister`\
402+`Was ist ein Gugelhupf?;ein Kuchen;eine Froschart;ein Schnaps`\
403+`Was sind Tapas?;kleine Appetithappen;Tiere;Gebäude`\
404+`Was sind Tapire?;Tiere;kleine Appetithappen;Wanddekorationen`\
405+`Was sind Tapeten?;Wanddekorationen;ein Kuchen;kleine Tiere`\
406+`Was ist ein Wolpertinger?;ein bayerisches Fabelwesen;eine seltene Tierart;ein Einwohner des Ortes Wolpert`\
407+`Was ist ein Tatzelwurm?;ein alpenländisches Fabeltier ählich einem Drachen;ein seltene Wurmart;eine Katze`\
408+`Was ist ein Lindwurm?;ein Fabeltier ähnlich einer Schlange;eine seltene Wurmart;eine Schlange`\
409+`Was ist Frau Holle?;eine Märchen- oder Sagengestalt;ein Hausmädchen;eine Putzfrau`\
410+`Was ist ein Wal?;ein Säugetier;ein Fisch;eine Amphibie`\
411+`Was ist ein Pinguin?;ein Vogel;ein Fisch;ein Säugetier`\
412+`Wer nascht mehr Süsses?;Frauen;Männer;beide naschen gleich viel`\
413+`Was ist eine Schnecke?;ein Weichtier;ein Primat;eine Pilzart`\
414+`Wann sind die Rauhnächte?;meist zwischen dem 24.12. und dem 06.01.;zu Ostern;zwischen dem 06.7. und dem 01.08.`\
415+`Was ist Freibier?;ein Bier das man selbst nicht zahlen mus;obergärig;untergärig`\
416+`Was ist ein Obazter?;ein angemachter Käse;ein Raufbold;ein Kuchen`
417+
418+---
419+*From the Free Pascal wiki, page "trivial/de", as it stood on 2020-03-01 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history