home *** CD-ROM | disk | FTP | other *** search
-
- (* ------------------------------------------- *)
- (* Summe & Produkt *)
- (* Spiel mit Multiplikation und Addition *)
- (* *)
- (* (c) 1989 TOOLBOX & Berthold Freier *)
- (* ------------------------------------------- *)
-
-
- PROGRAM deckeln;
-
-
- USES Crt,Graph,Drivers; (* benötigte Units *)
-
- (* =========================================== *)
- (* Deklarationen *)
- TYPE
- feldtyp = RECORD
- x : BYTE;
- y : BYTE;
- zahl : BYTE;
- wert : BYTE;
- haeufig : BYTE;
- END;
- zweipointer = ARRAY[1..2] OF Pointer;
-
- (* =========================================== *)
- (* Konstanten *)
- CONST
- feld : ARRAY [1..20] OF feldtyp =
- ((x:1 ; y:1 ; zahl: 1 ; wert:0 ; haeufig:1),
- (x:2 ; y:1 ; zahl: 2 ; wert:0 ; haeufig:3),
- (x:3 ; y:1 ; zahl: 3 ; wert:0 ; haeufig:4),
- (x:4 ; y:1 ; zahl: 4 ; wert:0 ; haeufig:6),
- (x:1 ; y:2 ; zahl: 5 ; wert:0 ; haeufig:6),
- (x:2 ; y:2 ; zahl: 6 ; wert:0 ; haeufig:9),
- (x:3 ; y:2 ; zahl: 7 ; wert:0 ; haeufig:6),
- (x:4 ; y:2 ; zahl: 8 ; wert:0 ; haeufig:7),
- (x:1 ; y:3 ; zahl: 9 ; wert:0 ; haeufig:5),
- (x:2 ; y:3 ; zahl:10 ; wert:0 ; haeufig:5),
- (x:3 ; y:3 ; zahl:11 ; wert:0 ; haeufig:2),
- (x:4 ; y:3 ; zahl:12 ; wert:0 ; haeufig:5),
- (x:1 ; y:4 ; zahl:15 ; wert:0 ; haeufig:2),
- (x:2 ; y:4 ; zahl:16 ; wert:0 ; haeufig:1),
- (x:3 ; y:4 ; zahl:18 ; wert:0 ; haeufig:2),
- (x:4 ; y:4 ; zahl:20 ; wert:0 ; haeufig:2),
- (x:1 ; y:5 ; zahl:24 ; wert:0 ; haeufig:2),
- (x:2 ; y:5 ; zahl:25 ; wert:0 ; haeufig:1),
- (x:3 ; y:5 ; zahl:30 ; wert:0 ; haeufig:2),
- (x:4 ; y:5 ; zahl:36 ; wert:0 ; haeufig:1));
-
- (* =========================================== *)
- (* Variablen *)
- VAR
- name : ARRAY [1..2] OF STRING[8];
- punkte : ARRAY [1..2] OF INTEGER;
- augenzahl : ARRAY [1..2] OF BYTE;
- deckel : zweipointer;
- ch: CHAR;
- zahlwert : STRING[2];
- rundenzahl,
- gespielt,
- weggenommen,
- spielerzahl,
- spielstaerke,
- spieler,
- summe,
- produkt,
- wurfzahl,
- wurfaugen : BYTE;
- i,
- kontrolle,
- wuerfelx : INTEGER;
- beenden : BOOLEAN;
-
- (* =========================================== *)
-
- PROCEDURE erklaerung;
-
- BEGIN
- ClrScr;
- TextColor(11);
- GotoXY(30,1);
- Write('D E C K E L N');
- GotoXY(30,3);
- Write('Spielerklärung');
- TextColor(7);
- GotoXY(1,5);
- Write('Dieses Spiel können 2 Personen gegen');
- Write('einander oder 1 Person gegen den PC');
- Write(' spielen.');
- GotoXY(1,7);
- Write('Ein Feld mit 20 Abteilungen enthält ');
- Write('jeweils eine Zahl und einen Wert.');
- GotoXY(1,9);
- Write('Es wird mit zwei Würfeln geworfen, ');
- Write('anschließend wählt der Spieler, ob er');
- GotoXY(1,10);
- Write('lieber die Summe oder das Produkt der');
- Write(' erzielten Augen "deckeln" will.');
- GotoXY(1,12);
- Write('"Deckeln" heißt, daß der angegebene ');
- Write('Wert dem Spieler gutgeschrieben wird');
- Write(' und ');
- GotoXY(1,13);
- Write('zugleich ein Deckel über das gewählte');
- Write(' Feld gestülpt wird, damit ist es ');
- Write('nicht');
- GotoXY(1,14);
- Write('mehr wählbar.');
- GotoXY(1,16);
- Write('Gewonnen hat, wer am Ende der Runde');
- Write(' die meisten Punkte erreicht hat.');
- Delay(2000);
- TextColor(3);
- GotoXY(3,18);
- Write('Und jetzt bitte einige Vorgaben zum');
- Write(' Spiel:');
- END;
-
- (* =========================================== *)
-
- PROCEDURE spielereingaben;
-
- VAR eingabe : STRING;
-
- BEGIN
- GotoXY(3,20); (* Spielerzahl *)
- Write('Wieviele Spieler wollen teilnehmen ');
- Write('( 1 oder 2 ) ?');
- REPEAT
- ch:=ReadKey;
- UNTIL ((ch='1') OR (ch='2'));
- Val(ch,spielerzahl,kontrolle);
- Write (' ',spielerzahl);
- GotoXY(1,22);
- Write('Bitte den Namen des ersten Spielers ');
- Write('eingeben (bis 8 Buchstaben) : ');
- Readln(eingabe);
- name[1]:=Copy(eingabe,1,8);
-
- (* ------------------------------------------- *)
-
- IF spielerzahl=2 THEN (* Namenseingabe *)
- BEGIN
- GotoXY(1,23);
- Write('Bitte den Namen des zweiten Spieler');
- Write('s eingeben (bis 8 Buchstaben) : ');
- Readln(eingabe);
- name[2]:=Copy(eingabe,1,8);
- END
- ELSE
- name[2]:='Computer';
-
- (* ------------------------------------------- *)
-
- IF spielerzahl=1 THEN (* Spielstärke PC *)
- BEGIN
- GotoXY(1,23);
- Write('Wie soll der Computer spielen ?');
- Write(' 1 = schwach 2 = stark');
- REPEAT
- ch:=ReadKey;
- UNTIL ((ch='1') OR (ch='2'));
- Val(ch,spielstaerke,kontrolle);
- Write (' ',spielstaerke);
- END;
- GotoXY(1,25);
- Write('Nach wieviel Runden wird abgebrochen ');
- Write('( 10 - 50 ) ? Mit ENTER abschließen !');
- REPEAT
- GotoXY(75,25);
- Readln(eingabe);
- Val(eingabe,rundenzahl,kontrolle);
- UNTIL ((rundenzahl>9) AND (rundenzahl<51));
- END;
-
- (* =========================================== *)
-
- PROCEDURE initialisierung (*Graphiktreiber *);
-
- VAR
- GraphDriver,GraphMode : INTEGER;
-
- (* ------------------------------------------- *)
-
- PROCEDURE Abort(Msg : STRING);
- BEGIN
- Writeln(Msg, ': ', GraphErrorMsg(GraphResult));
- Halt(1);
- END;
-
- (* ------------------------------------------- *)
-
- BEGIN
- IF RegisterBGIdriver(@CGADriverProc) < 0 THEN
- Abort('CGA');
- GraphDriver:=CGA;
- GraphMode:=CGAC1;
- InitGraph(GraphDriver,GraphMode,'');
- IF GraphResult <> 0 THEN
- BEGIN
- Write ('Fehler bei Initialisierung der ');
- Write ('Graphik :',GraphDriver);
- Writeln ('Bitte RETURN drücken ');
- Readln;halt;
- END;
- END;
-
- (* =========================================== *)
-
- PROCEDURE deckeleinlesen;
-
- VAR groesse : INTEGER;
-
- BEGIN
- ClearViewPort;
- FOR i:=1 TO 2 DO
- BEGIN
- SetColor(i);
- SetFillStyle(CloseDotFill,i);
- Ellipse(i*30,40,0,360,14,19);
- FloodFill(i*30,40,i);
- groesse:=ImageSize(i*30-14,21,i*30+14,59);
- GetMem(deckel[i],groesse);
- GetImage(i*30-14,21,i*30+14,59,deckel[i]^);
- END;
- END;
-
- (* =========================================== *)
-
- PROCEDURE wertbelegung;
-
- BEGIN
- FOR i:=1 TO 20 DO
- feld[i].wert:=random(5)+1;
- END;
-
- (* =========================================== *)
-
- PROCEDURE spielfeld;
-
- BEGIN
- SetTextJustify(CenterText,CenterText);
- FOR i:=1 TO 20 DO
- BEGIN
-
- (* ------------------------------------------- *)
-
- SetColor(1); (* Wertmarke *)
- Str(feld[i].wert,zahlwert);
- OutTextXY(feld[i].x*30-15,feld[i].y*40-12,
- zahlwert);
- Circle(feld[i].x*30-15,feld[i].y*40-13,8);
-
- (* ------------------------------------------- *)
-
- SetColor(2); (* Zahl *)
- Str(feld[i].zahl,zahlwert);
- OutTextXY(feld[i].x*30-15,feld[i].y*40-27,
- zahlwert);
-
- (* ------------------------------------------- *)
-
- SetColor(3); (* Rahmen *)
- Ellipse(feld[i].x*30-15,feld[i].y*40-21,0,
- 360,14,19);
- END;
-
- (* ------------------------------------------- *)
-
- SetColor(1); (* Würfelrahmen *)
- SetTextJustify(LeftText,BottomText);
- OutTextXY(152,48,'╔═════╗ ╔═════╗');
- FOR i:=7 TO 10 DO
- OutTextXY(152,i*8,'║ ║ ║ ║');
- OutTextXY(152,88,'╚═════╝ ╚═════╝');
-
- (* ------------------------------------------- *)
-
- SetColor(3); (* Titelausgabe *)
- OutTextXY(180,8,'D E C K E L N');
-
- (* ------------------------------------------- *)
-
- SetColor(1); (* Namenausgabe *)
- OutTextXY(156,22,name[1]);
- OutTextXY(156,32,'0 Punkte'); (* Punkte *)
- SetColor(2);
- OutTextXY(252,22,name[2]);
- OutTextXY(252,32,'0 Punkte');
- END;
-
- (* =========================================== *)
-
- PROCEDURE punktausgabe;
-
- BEGIN
- SetViewPort(148,24,165,32,ClipOn);
- ClearViewPort;
- SetViewPort(244,24,261,32,ClipOn);
- ClearViewPort;
- SetViewPort(0,0,319,199,ClipOn);
- SetColor(1);
- Str(punkte[1]:2,zahlwert);
- OutTextXY(148,32,zahlwert);
- SetColor(2);
- Str(punkte[2]:2,zahlwert);
- OutTextXY(244,32,zahlwert);
- END;
-
- (* =========================================== *)
-
- PROCEDURE wuerfelloeschen;
-
- BEGIN
- SetViewPort(wuerfelx,48,wuerfelx+40,80,ClipOn);
- ClearViewPort;
- SetViewPort(0,0,319,199,ClipOn);
- END;
-
- (* =========================================== *)
-
- PROCEDURE wuerfelaugen;
-
- BEGIN
-
- CASE wurfzahl OF (* Wievielter Wurf *)
- 1 : wuerfelx:=161;
- 2 : wuerfelx:=257;
- END;
- wuerfelloeschen;
- SetColor(2);
-
- (* ------------------------------------------- *)
-
- CASE wurfaugen OF (* Augenzahl darstellen *)
- 1 : OutTextXY(wuerfelx,68,' O ');
- 2 : BEGIN
- OutTextXY(wuerfelx,56,'O ');
- OutTextXY(wuerfelx,80,' O');
- END;
- 3 : BEGIN
- OutTextXY(wuerfelx,56,'O ');
- OutTextXY(wuerfelx,68,' O ');
- OutTextXY(wuerfelx,80,' O');
- END;
- 4 : BEGIN
- OutTextXY(wuerfelx,56,'O O');
- OutTextXY(wuerfelx,80,'O O');
- END;
- 5 : BEGIN
- OutTextXY(wuerfelx,56,'O O');
- OutTextXY(wuerfelx,68,' O ');
- OutTextXY(wuerfelx,80,'O O');
- END;
- 6 : BEGIN
- OutTextXY(wuerfelx,56,'O O');
- OutTextXY(wuerfelx,68,'O O');
- OutTextXY(wuerfelx,80,'O O');
- END;
- END;
- END;
-
- (* =========================================== *)
-
- PROCEDURE wuerfeln;
- VAR text : STRING;
- BEGIN
- SetColor(spieler); (* Aufruf Spieler *)
- text:=ConCat(name[spieler],' ist dran!');
- OutTextXY(156,104,text);
- OutTextXY(140,118,'Würfeln mit Leertaste!');
- REPEAT
- ch:=ReadKey;
- UNTIL ch=' ';
- sound(320);delay(50);nosound;delay(40);
- sound(260);delay(50);nosound;delay(40);
- sound(220);delay(50);nosound;
- wurfzahl:=1;
- wurfaugen:=Random(6)+1;;
- augenzahl[1]:=wurfaugen;
- wuerfelaugen;
- wurfzahl:=2;
- wurfaugen:=Random(6)+1;;
- augenzahl[2]:=wurfaugen;
- wuerfelaugen;
- summe:=augenzahl[1]+augenzahl[2];
- produkt:=augenzahl[1]*augenzahl[2];
- END;
-
- (* =========================================== *)
-
- PROCEDURE meldungloeschen;
- BEGIN
- SetViewPort(140,93,319,199,ClipOn);
- ClearViewPort;
- SetViewPort(0,0,319,199,ClipOn);
- END;
-
- (* =========================================== *)
-
- PROCEDURE spielerzug;
- BEGIN
- SetColor(2); (* Auswahl anbieten *)
- OutTextXY(180,140,'S');
- OutTextXY(180,150,'P');
- OutTextXY(180,160,'V');
- SetColor(3);
- OutTextXY(190,140,'umme');
- OutTextXY(190,150,'rodukt');
- OutTextXY(190,160,'erzichten');
- OutTextXY(140,174,'S , P oder V drücken!');
- REPEAT (* und auswählen *)
- ch:=ReadKEY;
- ch:=UpCase(ch);
- UNTIL ch in ['S','P','V'];
-
- (* ------------------------------------------- *)
-
- CASE ch OF (* Verzweigung *)
- 'S' : BEGIN
- IF feld[summe].wert<>0 THEN
- BEGIN
- punkte[spieler]:=punkte[spieler]+
- feld[summe].wert;
- feld[summe].wert:=0;
- PutImage(feld[summe].x*30-29,
- feld[summe].y*40-40,deckel[spieler]^,
- NormalPut);
- INC(weggenommen,1);
- END;
- END;
-
- 'P' : BEGIN
- IF produkt>12 THEN
- BEGIN
- FOR i:=13 TO 20 DO
- BEGIN
- IF feld[i].zahl=produkt THEN produkt:=i;
- END;
- END;
- IF feld[produkt].wert<>0 THEN
- BEGIN
- punkte[spieler]:=punkte[spieler]+
- feld[produkt].wert;
- feld[produkt].wert:=0;
- PutImage(feld[produkt].x*30-29,
- feld[produkt].y*40-40,deckel[spieler]^,
- NormalPut);
- INC(weggenommen,1);
- END;
- END;
-
- 'V' : BEGIN
- OutTextXY(180,190,'Schade !');
- Delay(2000);
- END;
- END; (* CASE-Block *)
- punktausgabe;
- END;
-
- (* =========================================== *)
-
- PROCEDURE weitermitleer;
- BEGIN
- SetColor(3);
- OutTextXY(140,190,'Weiter mit Leertaste!');
- REPEAT
- ch:=ReadKey;
- UNTIL ch=' ';
- END;
-
- (* =========================================== *)
-
- PROCEDURE computerzug;
-
- BEGIN
- IF produkt>12 THEN (* Ergebnis anpassen *)
- BEGIN
- FOR i:=13 TO 20 DO
- BEGIN
- IF feld[i].zahl=produkt THEN produkt:=i;
- END;
- END;
-
- (* ------------------------------------------- *)
-
- IF ((feld[summe].wert=0) AND (* Nichts geht *)
- (feld[produkt].wert=0)) THEN
- BEGIN
- OutTextXY(140,170,'Ich muß verzichten');
- weitermitleer;
- punktausgabe;
- Exit;
- END;
-
- (* ------------------------------------------- *)
-
- IF feld[summe].wert>feld[produkt].wert THEN
- BEGIN
- OutTextXY(140,170,'Ich nehme die Summe.');
- weitermitleer;
- punkte[2]:=punkte[2]+feld[summe].wert;
- feld[summe].wert:=0;
- PutImage(feld[summe].x*30-29,
- feld[summe].y*40-40,deckel[2]^,NormalPut);
- INC(weggenommen,1);
- punktausgabe;
- Exit;
- END;
-
- (* ------------------------------------------- *)
-
- IF feld[produkt].wert>feld[summe].wert THEN
- BEGIN
- OutTextXY(140,170,'Ich nehme das Produkt.');
- weitermitleer;
- punkte[2]:=punkte[2]+feld[produkt].wert;
- feld[produkt].wert:=0;
- PutImage(feld[produkt].x*30-29,
- feld[produkt].y*40-40,deckel[2]^,NormalPut);
- INC(weggenommen,1);
- punktausgabe;
- Exit;
- END;
-
- (* ------------------------------------------- *)
-
- IF feld[produkt].wert=feld[summe].wert THEN
- BEGIN
- IF spielstaerke=2 THEN
- BEGIN
- IF feld[summe].haeufig<
- feld[produkt].haeufig THEN
- BEGIN
- MoveTo(140,170);
- OutText('Ich nehme die Summe.');
- weitermitleer;
- punkte[2]:=punkte[2]+feld[summe].wert;
- feld[summe].wert:=0;
- PutImage(feld[summe].x*30-29,
- feld[summe].y*40-40,deckel[2]^,
- NormalPut);
- INC(weggenommen,1);
- END
-
- ELSE
- BEGIN
- MoveTo(140,170);
- OutText('Ich nehme das Produkt.');
- weitermitleer;
- punkte[2]:=punkte[2]+
- feld[produkt].wert;
- feld[produkt].wert:=0;
- PutImage(feld[produkt].x*30-29,
- feld[produkt].y*40-40,deckel[2]^,
- NormalPut);
- INC(weggenommen,1);
- END;
- END;
- punktausgabe;
- END;
- END;
-
- (* =========================================== *)
-
- PROCEDURE hauptsteuerung;
-
- BEGIN
- spieler:=2; (* Voreinstellungen *)
- gespielt:=0;
- weggenommen:=0;
- punkte[1]:=0;
- punkte[2]:=0;
-
- (* ------------------------------------------- *)
-
- REPEAT (* Steuerteil *)
- spieler:=3-spieler;
- sound(400);delay(40);nosound;
- IF spieler=2 THEN INC(gespielt,1);
- wuerfeln;
- IF ((spielerzahl=1) AND (spieler=2)) THEN
- computerzug
- ELSE
- spielerzug;
- meldungloeschen;
- wuerfelx:=161;
- wuerfelloeschen;
- wuerfelx:=257;
- wuerfelloeschen;
- UNTIL ((weggenommen=20) OR
- (gespielt=rundenzahl));
- END;
-
- (* =========================================== *)
-
- PROCEDURE ergebnismeldung;
- BEGIN
- TextMode(LastMode);
- ClrScr;
- TextBackGround(8);
- TextColor(11);
- GotoXY(30,1);
- Write('D E C K E L N');
- GotoXY(30,3);
- Write('Endergebnis :');
- TextColor(7);
- GotoXY(25,8);
- Write(name[1],' erreichte ',punkte[1]);
- Write(' Punkte.');
- GotoXY(25,10);
- Write(name[2],' erreichte ',punkte[2]);
- Write(' Punkte.');
- TextColor(2);
- GotoXY(25,14);
-
- (* ------------------------------------------- *)
-
- IF punkte[1]=punkte[2] THEN (* Auswertung *)
- Write('Es gab ein Unentschieden !');
- IF punkte[1]>punkte[2] THEN
- BEGIN
- Write(name[1],' hat gewonnen !');
- GotoXY(25,20);
- TextColor(7);
- Write('Herzlichen Glückwunsch !');
- END;
- IF punkte[1]<punkte[2] THEN
- BEGIN
- Write(name[2],' hat gewonnen !');
- GotoXY(25,20);
- TextColor(7);
- Write('Herzlichen Glückwunsch !');
- END;
- END;
-
- (* =========================================== *)
-
- PROCEDURE wiederholungsfrage;
-
- BEGIN
- TextColor(2);
- GotoXY(25,23);
- Write('Noch ein Spiel ( J / N ) ?');
- REPEAT
- ch:=ReadKey;
- ch:=UpCase(ch);
- UNTIL ch in ['N','J'];
- CASE ch OF
- 'N' : beenden:=TRUE;
- 'J' : beenden:=FALSE;
- END;
- SetGraphMode(CGAC1);
- END;
-
- (* =========================================== *)
-
- BEGIN (* Hauptprogramm *)
- TextMode (C80);
- Randomize;
- beenden:=FALSE;
- erklaerung;
- spielereingaben;
- initialisierung;
- deckeleinlesen;
-
- (* ------------------------------------------- *)
-
- REPEAT (* Hauptschleife *)
- SetColor(1);
- ClearViewPort;
- wertbelegung;
- spielfeld;
- hauptsteuerung;
- ergebnismeldung;
- wiederholungsfrage;
- UNTIL beenden=TRUE;
-
- (* ------------------------------------------- *)
-
- CloseGraph; (* Abschlußarbeiten *)
- TextMode(LastMode);
- ClrScr;
- END. (* Ende des Quelltextes *)
-
- (* =========================================== *)