Sign in Join
Wiki copytemporary

trivial/de: what changed

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

OldNewLine
11Zurück zur [[Console/de|Konsolenseite]].
22
33Dieses Spiel Trivial ist ein einfaches Spiel für die Konsole (Windows), das Terminal (Linux) oder auch für die Kommandozeile (DOS).
44
55Das Spiel soll die Möglichkeiten von Free Pascal demonstrieren.
66
77Dieses Spiel hat keine Hilfe.
88
99Das Programm wird durch das drücken einer der Tasten \<ESC\>, oder \<E\> beendet.
1010
1111Das Hauptprogramm trivial ruft die einzelnen Unterprogramme auf:
1212
1313``` pascal
1414program trivial;
1515
1616{$mode objfpc}{$H+}
1717{$IMPLICITEXCEPTIONS OFF}
1818
1919uses
2020 uDateiEinLesen,
2121 uSpielLogik,
2222 uAusgabe,
2323 Crt;
2424
2525{$R *.res}
2626
2727begin
2828
2929 // Liest die Datei mit den Fragen ein
3030 subDateiEinlesen;
3131 repeat
3232
3333 subFragenReihenfolge;
3434 subAusgabe;
3535 subEingabe;
3636 // Zwei Sekunden Pause
3737 Delay(2000);
3838 until 0 > 1;
3939
4040end.
4141```
4242
4343Die Unit subDateiEinlesen.pas liest die Textdatei mit den Fragen ein.\
4444Die Datei mit den Fragen hat folgendes Format:\
4545* Die Datei mit den Fragen ist eine csv-Datei ohne Kopfzeile und ohne Größenbegrenzung.
4646
4747- Das Trennzeichen zwischen der Frage und den möglichen Antworten ist das Semikolon.
4848- Die erste Antwort, die nach der Fage kommt ist die richtige Antwort.
4949
5050``` pascal
5151unit uDateiEinLesen;
5252
5353{$mode objfpc}{$H+}
5454{$IMPLICITEXCEPTIONS OFF}
5555
5656interface
5757
5858uses
5959 SysUtils, uSpielLogik;
6060
6161var
6262 intSemikolonZaehler: integer = 0;
6363
6464procedure subDateiEinlesen;
6565
6666implementation
6767
6868procedure subArrayZuWeisen(strDateiInhalt: string);
6969var
7070 intI: integer = 0;
7171 //intSemikolonZaehler: integer = 0;
7272 intarrLaenge: integer = 0;
7373
7474begin
7575
7676 // prüft, ob ein leerer String übergeben wurde
7777 if strDateiInhalt = '' then
7878 Exit;
7979
8080 // setzt den Semikolonzähler wieder auf 0
8181 intSemikolonZaehler := 0;
8282
8383 // Legt die neue Grösse des Arrays fest
8484 intarrLaenge := length(arrTrivial);
8585 SetLength(arrTrivial, intarrLaenge + 1);
8686
8787 for intI := 0 to length(strDateiInhalt) do
8888 begin
8989
9090 if strDateiInhalt[intI] = ';' then
9191 intSemikolonZaehler := intSemikolonZaehler + 1
9292 else
9393 begin
9494
9595 case intSemikolonZaehler of
9696 0:
9797 arrTrivial[intarrLaenge].strFrage :=
9898 arrTrivial[intarrLaenge].strFrage + strDateiInhalt[intI];
9999 1:
100100 arrTrivial[intarrLaenge].strAntwort1 :=
101101 arrTrivial[intarrLaenge].strAntwort1 + strDateiInhalt[intI];
102102 2:
103103 arrTrivial[intarrLaenge].strAntwort2 :=
104104 arrTrivial[intarrLaenge].strAntwort2 + strDateiInhalt[intI];
105105 3:
106106 arrTrivial[intarrLaenge].strAntwort3 :=
107107 arrTrivial[intarrLaenge].strAntwort3 + strDateiInhalt[intI];
108108 end;
109109
110110 end;
111111
112112 end;
113113
114114end;
115115
116116procedure subDateiEinlesen;
117117var
118118 datDatei: TextFile;
119119 strDateiInhalt: string;
120120
121121begin
122122
123123 // öffnet die Datei
124124 AssignFile(datDatei, 'Trivial.txt');
125125 // setzt den Dateizeiger auf den Anfang der Datei
126126 Reset(datDatei);
127127
128128 // liest die Datei bis zu ihrem Ende ein
129129 while not EOF(datDatei) do
130130 begin
131131 ReadLn(datDatei, strDateiInhalt);
132132 if strDateiInhalt <> '' then
133133 subArrayZuWeisen(strDateiInhalt);
134134 end;
135135
136136 //Schliesst die Datei
137137 CloseFile(datDatei);
138138
139139end;
140140
141141end.
142142```
143143
144144Die Unit uSpiellogik.pas enthält die Spielsteuerung.
145145
146146Hier befindet sich auch die Anweisung für den Programmabbruch.
147147
148148Die Tasten \<ESC\>, oder \<E\> beenden das Programm.
149149
150150``` pascal
151151unit uSpielLogik;
152152
153153{$mode objfpc}{$H+}
154154{$IMPLICITEXCEPTIONS OFF}
155155
156156interface
157157
158158uses
159159 SysUtils, crt;
160160
161161type
162162 TTrivial = record
163163 strFrage: string;
164164 strAntwort1: string;
165165 strAntwort2: string;
166166 strAntwort3: string;
167167 end;
168168
169169type
170170 TAntwort = record
171171 strAntwort1: string;
172172 strAntwort2: string;
173173 strAntwort3: string;
174174 end;
175175
176176var
177177 arrTrivial: array of TTrivial;
178178 typeAntwort: TAntwort;
179179
180180const
181181 // Die Konstanten sind typisierte Konstanten
182182 conintZufallszahlAntwort: integer = 0;
183183 conintZufallszahlArray: integer = 0;
184184
185185procedure subFragenReihenfolge;
186186procedure subEingabe;
187187
188188implementation
189189
190190uses
191191 uAusgabe;
192192
193193procedure subZufallszahlArray;
194194begin
195195 randomize;
196196 conintZufallszahlArray := random(length(arrTrivial));
197197end;
198198
199199procedure subZufallszahlAntwort;
200200begin
201201 randomize;
202202
203203 // Da die Verteilung der Zufallszahlen bei random(2) + 1 zu ungenau ist,
204204 // wurde dieser Lösungsansatz gewählt:
205205 conintZufallszahlAntwort := random(29) + 1;
206206
207207 if (conintZufallszahlAntwort mod 3) = 0 then
208208 conintZufallszahlAntwort := 3
209209 else if (conintZufallszahlAntwort mod 2) = 0 then
210210 conintZufallszahlAntwort := 2
211211 else
212212 conintZufallszahlAntwort := 1;
213213
214214 // Alternativ zu obigen Weg geht auch dieser Weg:
215215 {case conintZufallszahlAntwort of
216216 3, 6, 9, 12, 15, 18, 21, 24, 27, 30:
217217 conintZufallszahlAntwort := 3;
218218 2, 4, 8, 10, 14, 16, 20, 22, 26, 28:
219219 conintZufallszahlAntwort := 2;
220220 else
221221 conintZufallszahlAntwort := 1;
222222 end;}
223223
224224end;
225225
226226procedure subFragenReihenfolge;
227227begin
228228 // Wählt die Frage aus
229229 subZufallszahlArray;
230230 // Wählt aus, an welcher Stelle
231231 // die richtige Antwort erscheinen soll
232232 subZufallszahlAntwort;
233233
234234 case conintZufallszahlAntwort of
235235 1:
236236 begin
237237 typeAntwort.strAntwort1 := arrTrivial[conintZufallszahlArray].strAntwort1;
238238 typeAntwort.strAntwort2 := arrTrivial[conintZufallszahlArray].strAntwort2;
239239 typeAntwort.strAntwort3 := arrTrivial[conintZufallszahlArray].strAntwort3;
240240 end;
241241 2:
242242 begin
243243 typeAntwort.strAntwort1 := arrTrivial[conintZufallszahlArray].strAntwort2;
244244 typeAntwort.strAntwort2 := arrTrivial[conintZufallszahlArray].strAntwort3;
245245 typeAntwort.strAntwort3 := arrTrivial[conintZufallszahlArray].strAntwort1;
246246 end;
247247 3:
248248 begin
249249 typeAntwort.strAntwort1 := arrTrivial[conintZufallszahlArray].strAntwort3;
250250 typeAntwort.strAntwort2 := arrTrivial[conintZufallszahlArray].strAntwort1;
251251 typeAntwort.strAntwort3 := arrTrivial[conintZufallszahlArray].strAntwort2;
252252 end;
253253 else
254254 begin
255255 typeAntwort.strAntwort1 := ' Fehler ' + IntToStr(conintZufallszahlAntwort);
256256 typeAntwort.strAntwort2 := ' Fehler ' + IntToStr(conintZufallszahlAntwort);
257257 typeAntwort.strAntwort3 := ' Fehler ' + IntToStr(conintZufallszahlAntwort);
258258 end;
259259 end;
260260end;
261261
262262procedure subEingabe;
263263var
264264 chrEingabe: char = ' ';
265265
266266begin
267267
268268 // Wandelt Tastatureingabe in Kleinbuchstaben um
269269 chrEingabe := LowerCase(Readkey);
270270
271271 // Überschreibt den Inhalt der Statuszeile und
272272 // setzt die Farbe für die Schrift wieder auf Hellgrau
273273 subStatuszeile(' ',
274274 LightGray);
275275
276276 case chrEingabe of
277277 #27, 'q', 'e':
278278 begin
279279 // Gibt an der Statuszeile das Programmende aus und
280280 // setzt die Farbe für die Schrift auf Hellgrau
281281 subStatuszeile('Das Programm Trivial wurde beendet.', LightGray);
282282 halt;
283283 end;
284284
285285 'a':
286286 begin
287287 begin
288288 if typeAntwort.strAntwort1 =
289289 arrTrivial[conintZufallszahlArray].strAntwort1 then
290290 subStatuszeile('Richtig', LightGreen)
291291 else
292292 subStatuszeile('Falsch', LightRed);
293293 end;
294294 end;
295295
296296 'b':
297297 begin
298298 begin
299299 if typeAntwort.strAntwort2 =
300300 arrTrivial[conintZufallszahlArray].strAntwort1 then
301301 subStatuszeile('Richtig', LightGreen)
302302 else
303303 subStatuszeile('Falsch', LightRed);
304304 end;
305305 end;
306306
307307 'c':
308308 begin
309309 if typeAntwort.strAntwort3 =
310310 arrTrivial[conintZufallszahlArray].strAntwort1 then
311311 subStatuszeile('Richtig', LightGreen)
312312 else
313313 subStatuszeile('Falsch', LightRed);
314314 end;
315315 end;
316316
317317end;
318318
319319end.
320320```
321321
322322Die Unit uAusgabe.pas ist für die Anzeige des Spiels an der Konsole zuständig.
323323
324324``` pascal
325325unit uAusgabe;
326326
327327{$mode objfpc}{$H+}
328328{$IMPLICITEXCEPTIONS OFF}
329329
330330interface
331331
332332uses
333333 SysUtils, crt, uSpielLogik;
334334
335335const
336336 constrCopyright = '(c) 2015 by Olaf';
337337 constrVersion = 'Version: 0.4.0';
338338 conintStatuszeile = 14;
339339
340340procedure subAusgabe;
341341procedure subStatuszeile(strUebergabe: string; intFarbe: integer);
342342
343343implementation
344344
345345function funTextZentrieren(strText: string): integer;
346346begin
347347 Result := Trunc((80 - length(strText)) / 2);
348348end;
349349
350350procedure subTitel;
351351begin
352352 ClrScr;
353353 GOTOXY(funTextZentrieren('TRIVIAL'), 1);
354354 Write('TRIVIAL');
355355 GOTOXY(funTextZentrieren(constrVersion), 2);
356356 Write(constrVersion);
357357 GOTOXY(funTextZentrieren(constrCopyright), 3);
358358 Write(constrCopyright);
359359end;
360360
361361procedure subKoerper;
362362begin
363363 GOTOXY(1, 6);
364364 Write(arrTrivial[conintZufallszahlArray].strFrage);
365365 GOTOXY(1, 8);
366366 Write('a) ' + typeAntwort.strAntwort1);
367367 GOTOXY(1, 9);
368368 Write('b) ' + typeAntwort.strAntwort2);
369369 GOTOXY(1, 10);
370370 Write('c) ' + typeAntwort.strAntwort3);
371371 GOTOXY(1, 12);
372372end;
373373
374374procedure subStatuszeile(strUebergabe: string; intFarbe: integer);
375375begin
376376 TextColor(intFarbe);
377377 GOTOXY(1,conintStatuszeile);
378378 Write(strUebergabe);
379379 TextColor(LightGray);
380380 GOTOXY(1,conintStatuszeile + 2);
381381end;
382382
383383procedure subInfo();
384384begin
385385 GOTOXY(1,conintStatuszeile + 1);
386386 WriteLn('Die Tasten <ESC>, <q> oder <e> beenden das Programm.');
387387end;
388388
389389procedure subAusgabe;
390390begin
391391 subTitel;
392392 subKoerper;
393393 subInfo;
394394end;
395395
396396end.
397397```
398398
399399Beispiel für die Datei (Trivial.txt) die die Fragen und die Antworten enthält:
400400
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`
401+```text
402+Was ist der Pumukl?;ein Kobold;ein Klabautermann;ein Schreinermeister
403+Was ist ein Gugelhupf?;ein Kuchen;eine Froschart;ein Schnaps
404+Was sind Tapas?;kleine Appetithappen;Tiere;Gebäude
405+Was sind Tapire?;Tiere;kleine Appetithappen;Wanddekorationen
406+Was sind Tapeten?;Wanddekorationen;ein Kuchen;kleine Tiere
407+Was ist ein Wolpertinger?;ein bayerisches Fabelwesen;eine seltene Tierart;ein Einwohner des Ortes Wolpert
408+Was ist ein Tatzelwurm?;ein alpenländisches Fabeltier ählich einem Drachen;ein seltene Wurmart;eine Katze
409+Was ist ein Lindwurm?;ein Fabeltier ähnlich einer Schlange;eine seltene Wurmart;eine Schlange
410+Was ist Frau Holle?;eine Märchen- oder Sagengestalt;ein Hausmädchen;eine Putzfrau
411+Was ist ein Wal?;ein Säugetier;ein Fisch;eine Amphibie
412+Was ist ein Pinguin?;ein Vogel;ein Fisch;ein Säugetier
413+Wer nascht mehr Süsses?;Frauen;Männer;beide naschen gleich viel
414+Was ist eine Schnecke?;ein Weichtier;ein Primat;eine Pilzart
415+Wann sind die Rauhnächte?;meist zwischen dem 24.12. und dem 06.01.;zu Ostern;zwischen dem 06.7. und dem 01.08.
416+Was ist Freibier?;ein Bier das man selbst nicht zahlen mus;obergärig;untergärig
417+Was ist ein Obazter?;ein angemachter Käse;ein Raufbold;ein Kuchen
418+```
417419
418420---
419421*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