home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 14 / spiel / packmann.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1989-07-12  |  7.2 KB  |  273 lines

  1. (*********************************************************
  2.  ***                                                   ***
  3.  ***                P A C K - M A N N                  ***
  4.  ***                                                   ***
  5.  ***      analog dem bekannten Arcade-Game Pac-Man     ***
  6.  ***                                                   ***
  7.  ***       (C) 1989 by G. Brinkmann & TOOLBOX          ***
  8.  ***                                                   ***
  9.  ***  System : Ms-Dos   Sprache : Turbo Pascal 4.0/5.0 ***
  10.  ***                    Stand   : 06.04.1989           ***
  11.  *********************************************************)
  12.  
  13. PROGRAM PackMann;
  14.  
  15. USES Crt, Dos;
  16.  
  17. TYPE
  18.   BildTyp     = ARRAY[1..10] OF STRING[80];
  19.   RegisterTyp = RECORD
  20.                   al,ah,bl,bh,cl,ch : BYTE;
  21.                 END;
  22.  
  23. VAR
  24.   bild : BildTyp;
  25.   rekord,
  26.   maxpkt : INTEGER;
  27.   fkey   : BOOLEAN;
  28.   feld   : ARRAY[1..38,1..19] OF BYTE;
  29.   ch     : CHAR;
  30.  
  31. PROCEDURE Cursor (Anfangszeile,Endzeile:byte);
  32. {  setzt die Größe des Cursors  }
  33. VAR
  34.   register : Registers;
  35. BEGIN
  36.   WITH register DO BEGIN
  37.     ch := Anfangszeile;
  38.     cl := Endzeile;
  39.     ah := 1;
  40.     intr($10,register);
  41.   END;
  42. END;  (*  Cursor  *)
  43.  
  44.  
  45. PROCEDURE ReadChar ( VAR c : CHAR );
  46. {  liest ein Zeichen von Tastatur ein und setzt
  47.    bei einer Funktionstaste fkey auf TRUE       }
  48. BEGIN
  49.   c := ReadKey;
  50.     IF KeyPressed AND (c=#0) THEN
  51.       BEGIN
  52.         c := ReadKey;
  53.         fkey := TRUE;
  54.       END
  55.     ELSE fkey := FALSE;
  56. END;  (*  ReadChar  *)
  57.  
  58.  
  59. PROCEDURE FirstInit;
  60. {  initialisiert den Aufbau des Spielfelds. Es werden
  61.    die ASCII-Zeichen 219,221,222 und 254 verwendet   }
  62. VAR
  63.   i, j : INTEGER;
  64.   c : CHAR;
  65. BEGIN
  66.   bild[ 1] := '▐█████████████████████████████████████';
  67.   bild[ 2] := '▐██ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ▐█';
  68.   bild[ 3] := '▐██ ■ ▐███████████████████▌ ■ ▐█▌ ■ ▐█';
  69.   bild[ 4] := '▐██ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ▐█▌ ■ ▐█';
  70.   bild[ 5] := '▐██ ■ ▐█▌ ■ ▐█▌ ■ ▐███████▌ ■ ▐█▌ ■ ▐█';
  71.   bild[ 6] := '▐██ ■ ▐█▌ ■ ▐█▌ ■ ▐█▌ ■ ▐█▌ ■ ▐█▌ ■ ■ ';
  72.   bild[ 7] := '▐██ ■ ▐█▌ ■ ▐█▌ ■ ▐█▌ ■ ▐█▌ ■ ▐█▌ ■ ▐█';
  73.   bild[ 8] := '▐██ ■ ▐█▌ ■ ■ ■ ■ ▐█▌ ■ ▐█▌ ■ ■ ■ ■ ▐█';
  74.   bild[ 9] := '▐██ ■ ▐█▌ ■ ▐█▌ ■ ▐█▌ ■ ▐█▌ ■ ▐█▌ ■ ▐█';
  75.   bild[10] := '  ■ ■ ▐█▌ ■ ▐█▌ ■ ■ ■ ■ ■ ■ ■ ▐█▌ ■ ■ ';
  76.  FOR i:=1 TO 10 DO
  77.    FOR j:=37 DOWNTO 1 DO BEGIN
  78.      c:=bild[i][j];
  79.      CASE c OF
  80.       '▐' : c := '▌';
  81.       '▌' : c := '▐';
  82.      END;
  83.      bild [i] := bild[i] + c;
  84.    END;
  85. END;  (*  FirstInit  *)
  86.  
  87.  
  88. PROCEDURE Bild_malen;
  89. {  gibt das Spielfeld auf dem Bildschirm aus  }
  90. VAR
  91.   i, j : INTEGER;
  92.   s    : STRING[20];
  93. BEGIN
  94.   ClrScr;
  95.   Gotoxy(26,1);
  96.   TextColor(White);
  97.   Write('P  A  C  K  -  M  A  N  N');
  98.   Gotoxy(1,4);
  99.   FOR i := 1 TO 10 DO BEGIN
  100.     FOR j:=1 TO Length(bild[i]) DO BEGIN
  101.       IF bild[i][j] = '■' THEN TextColor(Yellow)
  102.                           ELSE TextColor(Red);
  103.       Write(bild[i][j]);
  104.     END;
  105.     WriteLn;
  106.   END;
  107.   FOR i := 9 DOWNTO 1 DO BEGIN
  108.     FOR j:=1 TO Length(bild[i]) DO BEGIN
  109.       IF bild[i][j] = '■' THEN TextColor(Yellow)
  110.                           ELSE TextColor(Red);
  111.       Write(bild[i][j]);
  112.     END;
  113.     WriteLn;
  114.   END;
  115.   Gotoxy( 1,23); Write('Punkte : ');
  116.   Gotoxy(30,23); Write('Level : ');
  117.   Gotoxy(62,23); Write('Rekord : ');
  118.   TextColor(White);
  119.   Write(rekord);
  120.   s := 'von  Gerd Brinkmann';
  121.   FOR i:=1 TO 19 DO BEGIN
  122.     Gotoxy(77,i+3);
  123.     Write(s[i]);
  124.   END;
  125.   TextColor(White);
  126. END;  (*  Bild_malen  *)
  127.  
  128.  
  129. PROCEDURE Init;
  130. VAR
  131.   i, j, hilf : INTEGER;
  132. BEGIN
  133.   maxpkt := 292;
  134.   FOR i:=1 TO 10 DO
  135.     FOR j:=1 TO 38 DO BEGIN
  136.       IF bild[i][2*j-1] IN [#219,#221,#222] THEN hilf :=255
  137.                                             ELSE hilf :=  1;
  138.       feld[j,i]    := hilf;
  139.       feld[j,20-i] := hilf;
  140.     END;
  141. END;  (*  Init  *)
  142.  
  143.  
  144. PROCEDURE Male_Laeufer ( x, y, farbe : INTEGER );
  145. BEGIN
  146.   Gotoxy(2*x-2,y+3);
  147.   CASE farbe OF
  148.     0 : Write('   ');
  149.     1 : Write('«≡»');
  150.   END;
  151. END;  (*  Male_Laeufer  *)
  152.  
  153.  
  154. PROCEDURE Male_Monster ( x, y, farbe : INTEGER );
  155. BEGIN
  156.   Gotoxy(2*x-2,y+3);
  157.   CASE farbe OF
  158.     0 : IF feld[x,y] = 1 THEN BEGIN
  159.           TextColor(Yellow);
  160.           Write(' ■ ');
  161.           TextColor(White);
  162.         END
  163.         ELSE Write('   ');
  164.     1 : Write('╠═╣');
  165.   END;
  166. END;  (*  Male_Monster  *)
  167.  
  168.  
  169. PROCEDURE Monster_neu ( VAR mx, my : INTEGER ; x, y : INTEGER );
  170. BEGIN
  171.   Male_Monster(mx,my,0);
  172.   IF x > mx THEN IF feld[SUCC(mx),my] <> 255 THEN
  173.                    mx := SUCC(mx);
  174.   IF x < mx THEN IF feld[PRED(mx),my] <> 255 THEN
  175.                    mx := PRED(mx);
  176.   IF y > my THEN IF feld[mx,SUCC(my)] <> 255 THEN
  177.                    my := SUCC(my);
  178.   IF y < my THEN IF feld[mx,PRED(my)] <> 255 THEN
  179.                    my := PRED(my);
  180.   Male_Monster(mx,my,1);
  181. END;  (*  Monster_neu  *)
  182.  
  183.  
  184. PROCEDURE laufen;
  185. {  steuert den Spielablauf  }
  186. CONST
  187.   monster = 4;
  188. VAR
  189.   ch                     : CHAR;
  190.   punkte, x, y, i, level : INTEGER;
  191.   mx, my, mzaehler       : ARRAY[1..monster] OF INTEGER;
  192. BEGIN
  193.   level := -1;
  194.   punkte := 0;
  195.   REPEAT
  196.     Init;
  197.     Bild_malen;
  198.     level := level + 1;
  199.     x   :=  3; y   := 2;       { Startposition   : Spieler }
  200.     mx[1] := 36; my[1] := 18;  { Startpositionen : Monster }
  201.     mx[2] := 36; my[2] :=  2;
  202.     mx[3] :=  3; my[3] := 18;
  203.     mx[4] := 20; my[4] := 10;
  204.     FOR i:=1 TO monster DO BEGIN
  205.       mzaehler[i] := i*10 - i*level;
  206.       Male_monster(mx[i],my[i],1);
  207.     END;
  208.     punkte := punkte + 1;
  209.     Male_Laeufer(x, y, 1);
  210.     feld[x,y] := 0;
  211.     Gotoxy(10,23); Write(Punkte);
  212.     Gotoxy(39,23); Write(level);
  213.     WHILE KeyPressed DO ReadChar(ch);
  214.     REPEAT
  215.       IF KeyPressed THEN BEGIN
  216.         ReadChar(ch);
  217.         IF fkey AND (ch IN [#72,#75,#77,#80]) THEN BEGIN
  218.           Male_Laeufer(x,y,0);
  219.           CASE ch OF
  220.             #72 : IF feld[x,y-1] <> 255 THEN y := y-1;
  221.             #75 : IF feld[x-1,y] <> 255 THEN BEGIN
  222.                     x := x-1;
  223.                     IF x < 2 THEN x := 37;
  224.                   END;
  225.             #77 : IF feld[x+1,y] <> 255 THEN BEGIN
  226.                     x := x+1;
  227.                     IF x > 37 THEN x := 2;
  228.                   END;
  229.             #80 : IF feld[x,y+1] <> 255 THEN y := y+1;
  230.           END;
  231.           Male_Laeufer(x,y,1);
  232.           IF feld[x,y] = 1 THEN BEGIN
  233.             punkte := punkte + 1;
  234.             feld[x,y] := 0;
  235.             sound(1000);
  236.           END ELSE sound(100);
  237.           Gotoxy(10,23); Write(punkte);
  238.         END;
  239.       END;
  240.       DELAY(30);
  241.       nosound;
  242.       FOR i:=1 TO monster DO BEGIN
  243.         mzaehler[i] := PRED (mzaehler[i]);
  244.         IF mzaehler[i] < 0 THEN BEGIN
  245.           mzaehler[i] := i*10 - i*level;
  246.           Monster_neu (mx[i],my[i],x,y);
  247.         END;
  248.         IF x = mx[i] THEN IF y = my[i] THEN ch := #27;
  249.       END;
  250.     UNTIL (ch = #27) OR (punkte MOD maxpkt = 0);
  251.     IF rekord < punkte THEN rekord := punkte;
  252.   UNTIL ch = #27;
  253. END;  (*  laufen  *)
  254.  
  255.  
  256. BEGIN { main }
  257.   Cursor(16,16);
  258.   firstInit;
  259.   rekord := 0;
  260.   REPEAT
  261.     laufen;
  262.     Gotoxy(20,25);
  263.     Write('Wollen Sie nochmal spielen ? (J/N)  < >',#7,#8,#8);
  264.     REPEAT
  265.       ReadChar(ch);
  266.       ch := UpCase(ch);
  267.     UNTIL ch IN ['J','N'];
  268.   UNTIL ch = 'N';
  269.   Gotoxy(20,25);
  270.   Write('E n d e   d e s   S p i e l s');ClrEoL;
  271.   Cursor(11,12);
  272. END.  { main }
  273.