home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 08 / fliege.inc < prev    next >
Encoding:
Text File  |  1987-07-10  |  23.8 KB  |  589 lines

  1. (****************************************************************************)
  2. (*                             FLIEGE.INC                                   *)
  3. (*                       Prozeduren und Funktionen                          *)
  4. (*                                                                          *)
  5. (****************************************************************************)
  6.  
  7. (*--------------------------------------------------------------------------*)
  8. (*                            mehrfach benoetigte                           *)
  9. (*--------------------------------------------------------------------------*)
  10.  
  11. PROCEDURE OWNWRITE (CH: CHAR; SP,ZE: INTEGER) ;
  12.  
  13. BEGIN
  14.    IF (SP IN [1..SPALTEN]) AND (ZE IN [1..ZEILEN])
  15.    THEN BEGIN                      (* ausserhalb Schirm nicht zulassen *)
  16.       IF (SP <> SPALTEN) OR (ZE <> ZEILEN)
  17.       THEN BEGIN                   (* Punkt rechts unten nicht ausgeben *)
  18.          GotoXY (SP,ZE) ;          (* Cursor positionieren, HOME ist 1,1 *)
  19.                                    (* horizontal an SP, vertikal an ZE *)
  20.          Write (CH) ;              (* und Zeichen ausgeben *)
  21.       END ;
  22.       SCHIRM [SP,ZE] := CH ;       (* internen Bildspeicher aufdatieren *)
  23.    END ;
  24. END ;                              (* OWNWRITE *)
  25.  
  26. (*..........................................................................*)
  27.  
  28. PROCEDURE OWNSOUND (FREQU,ZEIT: INTEGER) ;
  29.  
  30. BEGIN
  31.    IF DAT_FILE [MITSOUND] = 'J'
  32.    THEN SOUND (FREQU) ;            (* Geraeusch ausgeben *)
  33.    IF ZEIT > 0
  34.    THEN Delay (ZEIT) ;             (* warten, Zeit in Millisekunden *)
  35.    IF DAT_FILE [MITSOUND] = 'J'
  36.    THEN NOSOUND ;                  (* Geraeusch stoppen *)
  37. (* CP/M-Version der Prozedur:
  38.    WriteLn(Chr(BELL));
  39. *)
  40. END ;                              (* OWNSOUND *)
  41.  
  42. (*..........................................................................*)
  43.  
  44. FUNCTION JA_NEIN (ALT: CHAR) : CHAR ;
  45.  
  46. VAR                                (* fordert Eingabe von J oder N *)
  47.    CH : CHAR ;                     (* eingelesener Character *)
  48.  
  49. BEGIN
  50.    Write (' ( Ja / Nein / <Return> ) : ') ;
  51.    Write (ALT) ;
  52.    REPEAT
  53.       Read (Kbd, CH) ;             (* lese ohne Echo *)
  54.       IF CH = Chr (13)             (* bei Return *)
  55.       THEN CH := ALT ;             (* alten Wert uebernehmen *)
  56.       CH := UpCase (CH) ;          (* mache Grossbuchstabe *)
  57.       Write (Chr(BACKSPACE),CH) ;  (* alten Wert ueberschreiben *)
  58.    UNTIL (CH = 'J') OR (CH = 'N') ;
  59.    JA_NEIN := CH ;                 (* und als Funktionswert uebergeben *)
  60. END ;                              (* JA_NEIN *)
  61.  
  62. (*..........................................................................*)
  63.  
  64. PROCEDURE ZUFALLSRICHTUNG (ZUFALL: INTEGER; VAR WEM: BEWEGLICH) ;
  65.  
  66. VAR
  67.    RI: INTEGER ;
  68.  
  69. BEGIN
  70.    RI := Random (ZUFALL) ;              (* diese Art der Zuweisungen ist *)
  71.    IF RI = 0 THEN WEM.RICHTUNG := LI ;  (* umstaendlich aber leichter zu *)
  72.    IF RI = 1 THEN WEM.RICHTUNG := RE ;  (* verstehen als verschachtelte *)
  73.    IF RI = 2 THEN WEM.RICHTUNG := HO ;  (* IF's, und CASE lohnt sich nur *)
  74.    IF RI = 3 THEN WEM.RICHTUNG := RU ;  (* bei komplexeren Aktionen *)
  75. END ;                              (* ZUFALLSRICHTUNG *)
  76.  
  77. (*..........................................................................*)
  78.  
  79. PROCEDURE GENERIERE (VAR WAS: BEWEGLICH) ;
  80.  
  81.  
  82. VAR
  83.    SP, ZE, VON, BIS: INTEGER ;
  84.  
  85. BEGIN
  86.    VON := L_RAND + 1 ;             (* Grenzwerte, damit SP im *)
  87.    BIS := R_RAND - 1 ;             (* Spielfeld liegt *)
  88.    REPEAT
  89.       ZE := Random (ZEILEN - 2) + 2 ;        (* ist in [1 .. ZEILEN-1] *)
  90.       SP := Random (BIS - VON + 1) + VON ;   (* ist in [VON .. BIS] *)
  91.    UNTIL (SCHIRM [SP,ZE] = Chr (SPACE)) ;
  92.    WAS.Pos.S := SP ;               (* setze Position in Type BEWEGLICH *)
  93.    WAS.Pos.Z := ZE ;
  94.    ZUFALLSRICHTUNG (4, WAS) ;
  95. END ;                              (* GENERIERE *)
  96.  
  97. (*..........................................................................*)
  98.  
  99. PROCEDURE START_WERTE ;
  100.  
  101. BEGIN
  102.    PUNKTE := 0 ;
  103.    P_S := Round ((SPALTEN / 2) - 2 ) ;
  104.    P_Z := Round ((ZEILEN - 1 ) / 2 ) ;
  105.    L_RAND := 2 ;
  106.    R_RAND := SPALTEN - 1 ;
  107.    WIEVIELE := Ord(DAT_FILE[ANZAHL]) - Ord('0') ;
  108.    TRAEGE := 13 - (Ord(DAT_FILE[BEWEGE]) - Ord('0')) ;
  109.    WARTEZAHL := (9 - (Ord(DAT_FILE[WARTEN]) - Ord('0'))) * 8 + 1 ;
  110.    WIELANGE := (10 - (Ord (DAT_FILE [LAENGE]) - Ord ('0'))) ;
  111.    WIELANGE := Round (MAXRUNDEN / WIELANGE) ;
  112. END ;                              (* START_WERTE *)
  113.  
  114. (*..........................................................................*)
  115.  
  116. PROCEDURE START_BILD ;
  117.  
  118. (*                  lokale Prozeduren fuer START_BILD                       *)
  119.  
  120. PROCEDURE BOX (CH: CHAR; S_VON,Z_VON,S_BIS,Z_BIS: INTEGER; FILL: BOOLEAN) ;
  121.  
  122. VAR                                (* mache eine Box mit Begrenzung CH,     *)
  123.    Z, S: INTEGER ;                 (* Grenzen seien S und Z, fuelle sie mit *)
  124.  
  125. BEGIN                              (* CH aus, wenn FILL true ist *)
  126.    IF (S_VON <= S_BIS) AND (Z_VON <= Z_BIS)
  127.    THEN BEGIN                      (* nur was machen, wenn Grenzen O.k. *)
  128.       IF FILL = TRUE
  129.       THEN                         (* mit fuellen Zeile fuer Zeile *)
  130.          FOR S := S_VON TO S_BIS
  131.          DO FOR Z := Z_VON TO Z_BIS
  132.             DO OWNWRITE (CH,S,Z)
  133.       ELSE BEGIN
  134.          FOR S := S_VON TO S_BIS
  135.          DO BEGIN
  136.             OWNWRITE (CH,S,Z_VON) ;     (* oberer Rand *)
  137.             OWNWRITE (CH,S,Z_BIS) ;     (* unterer Rand *)
  138.             END ;
  139.          FOR Z := Z_VON TO Z_BIS   (* Eckpunkte werden doppelt gezeichnet, *)
  140.          DO BEGIN                  (* wodurch der Algorithmus einfacher ist *)
  141.             OWNWRITE (CH,S_VON,Z) ;     (* linker Rand *)
  142.             OWNWRITE (CH,S_BIS,Z) ;     (* rechter Rand *)
  143.          END ;
  144.       END ;
  145.    END ;
  146. END ;                              (* BOX *)
  147.  
  148. (*                                                                          *)
  149.  
  150. PROCEDURE OWNLOESCHE ;
  151.  
  152. VAR                                (* loescht Bildschirm und internen *)
  153.    CH : CHAR ;                     (* Bildspeicher *)
  154.    Z, S: INTEGER ;
  155.  
  156. BEGIN
  157.    CH := Chr (SPACE) ;
  158.    FOR Z := 1 TO ZEILEN
  159.    DO FOR S := 1 TO SPALTEN
  160.       DO SCHIRM [S,Z] := CH ;      (* loesche internen Bildspeicher *)
  161.    ClrScr ;                        (* und jetzt Bildschirm tatsaechlich *)
  162. END ;                              (* OWNLOESCHE *)
  163.  
  164. (*                       jetzt folgt START_BILD                             *)
  165.  
  166. BEGIN
  167.    OWNLOESCHE ;
  168.    BOX (Chr(GRENZE),L_RAND,1,R_RAND,ZEILEN,FALSE) ;
  169.    BOX (Chr(MITTE),P_S-9,P_Z-2,P_S+9,P_Z+2,TRUE) ;
  170.    GotoXY (P_S - 2, P_Z) ;         (* nur die Anzahl Punkte wird waehrend *)
  171.    Write (PUNKTE:4) ;              (* des Spiels nicht mit OWNWRITE gesetzt *)
  172.    GENERIERE (YOU) ;
  173.    OWNWRITE (Chr(SPIELER), YOU.Pos.S, YOU.Pos.Z) ;
  174.    FOR INDEX := 1 TO WIEVIELE
  175.    DO BEGIN                        (* generiere gewaehlte Anzahl *)
  176.       GENERIERE (FLY[INDEX]) ;
  177.       WITH FLY[INDEX]
  178.       DO OWNWRITE (Chr(FLIEGE), Pos.S, Pos.Z) ;
  179.    END ;
  180. END ;                              (* START_BILD *)
  181.  
  182. (*..........................................................................*)
  183.  
  184. FUNCTION AN_NEUER_POS (VAR SP, ZE: INTEGER; WEM: BEWEGLICH) : CHAR ;
  185.  
  186. BEGIN                              (* uebergibt char an vorraussichtlich *)
  187.    WITH WEM                        (* neuer Position und diese in SP, ZE *)
  188.    DO BEGIN
  189.       SP := Pos.S ;
  190.       ZE := Pos.Z ;
  191.       IF RICHTUNG = LI THEN SP := SP - 1 ;   (* Vorteil dieser mehrfachen *)
  192.       IF RICHTUNG = RE THEN SP := SP + 1 ;   (* IF ist, dass benoetigte *)
  193.       IF RICHTUNG = HO THEN ZE := ZE - 1 ;   (* Zeit fast immer gleich ist *)
  194.       IF RICHTUNG = RU THEN ZE := ZE + 1 ;
  195.    END ;
  196.    AN_NEUER_POS := SCHIRM [SP,ZE] ;
  197. END ;                              (* AN_NEUER_POS *)
  198.  
  199. (*..........................................................................*)
  200.  
  201. PROCEDURE SETZE_NEU (CH: CHAR; SP, ZE: INTEGER; VAR WEN: BEWEGLICH) ;
  202.  
  203. BEGIN
  204.    WITH WEN
  205.    DO BEGIN
  206.       OWNWRITE (Chr(SPACE), Pos.S, Pos.Z) ;  (* an alter Position loeschen *)
  207.       OWNWRITE (CH, SP, ZE) ;      (* an neuer Position setzen *)
  208.       Pos.S := SP ;                (* neue Werte fuer Spalte und Zeile *)
  209.       Pos.Z := ZE ;
  210.       END ;
  211. END ;                              (* SETZE_NEU *)
  212.  
  213. (*..........................................................................*)
  214.  
  215. FUNCTION INKEY : CHAR ;            (* liefert character, von gedrueckter *)
  216.                                    (* Taste oder chr (0) *)
  217. VAR
  218.    CH : CHAR ;
  219.  
  220. BEGIN
  221.    IF KeyPressed
  222.    THEN Read (Kbd,CH)              (* lese ohne Echo auf Bildschirm *)
  223.    ELSE CH := Chr (0) ;
  224.    INKEY := CH ;
  225. END ;                              (* INKEY *)
  226.  
  227. (*..........................................................................*)
  228.  
  229. PROCEDURE SPIELERRICHTUNG ;
  230.  
  231. VAR
  232.    CH : CHAR ;
  233.  
  234. BEGIN
  235.    CH := INKEY ;                   (* schaue nach, ob Taste gedrueckt *)
  236.    CH := UpCase (CH) ;             (* wenn Buchstabe, dann Grossbuchstabe *)
  237.    WITH YOU
  238.    DO BEGIN                        (* mehrfache IF wegen Zeitgleichheit *)
  239.       IF CH = DAT_FILE[T_LI] THEN RICHTUNG := LI ;
  240.       IF CH = DAT_FILE[T_RE] THEN RICHTUNG := RE ;
  241.       IF CH = DAT_FILE[T_HO] THEN RICHTUNG := HO ;
  242.       IF CH = DAT_FILE[T_RU] THEN RICHTUNG := RU ;
  243.    END ;
  244. END ;                              (* SPIELERRICHTUNG *)
  245.  
  246. (*--------------------------------------------------------------------------*)
  247. (*                            initialisiere                                 *)
  248. (*--------------------------------------------------------------------------*)
  249.  
  250. PROCEDURE INIT_ALLES ;
  251.  
  252. (*..........................................................................*)
  253. (*             lokale Prozeduren und Funktionen fuer INIT_ALLES             *)
  254. (*..........................................................................*)
  255.  
  256. PROCEDURE START_TEXT ;
  257.  
  258. VAR
  259.    X_CENTER : INTEGER ;            (* nur zum Zentrieren am Begin *)
  260.    CH : CHAR ;                     (* wird als dummy fuer warten benutzt *)
  261.  
  262. BEGIN
  263.    X_CENTER := Round ((SPALTEN-14)/2) - 5 ;
  264.    ClrScr ;                        (* loesche Bildschirm *)
  265.    GotoXY (X_CENTER,1) ;     Write ('**************') ;
  266.    GotoXY (X_CENTER,2) ;     Write ('*            *') ;
  267.    GotoXY (X_CENTER,3) ;     Write ('*   FLIEGE   *') ;
  268.    GotoXY (X_CENTER,4) ;     Write ('*            *') ;
  269.    GotoXY (X_CENTER,5) ;     Write ('**************') ;
  270.    GotoXY (6,10) ;
  271.    Write ('Sie bewegen die Spielfigur ') ;
  272.    Write (Chr (SPIELER)) ;
  273.    Write (' mit Tasten auf dem Bildschirm.') ;
  274.    GotoXY (6,11) ;
  275.    Write ('Dabei sollen Sie Fliegen ') ;
  276.    Write (Chr (FLIEGE)) ;
  277.    Write (' fangen, die sich auch bewegen.') ;
  278.    GotoXY (6,12) ;
  279.    Write ('Jede gefangene Fliege bleibt als Hindernis ') ;
  280.    Write (Chr (HINDERNIS)) ;
  281.    Write (' stehen. Die Spiel-') ;
  282.    GotoXY (6,13) ;
  283.    Write ('feldgrenze ') ;
  284.    Write (Chr (GRENZE)) ;
  285.    Write (' kann nicht betreten werden und ist fest vorgegeben.') ;
  286.    GotoXY (10,16) ;
  287.    Write ('Weiter mit beliebiger Taste ... ') ;
  288.    Read (Kbd, CH) ;
  289. END ;                              (* START_TEXT *)
  290.  
  291. (*..........................................................................*)
  292.  
  293. FUNCTION ZIFFER_CHAR (VON, BIS, ALT: CHAR) : CHAR ;
  294.  
  295. VAR                                (* fordert Eingabe von Ziffer oder char *)
  296.    CH : CHAR ;                     (* eingelesener Character *)
  297.  
  298. BEGIN
  299.    Write (' ( von ') ;
  300.    Write (VON) ;                   (* Wert ausgeben *)
  301.    Write (' bis ') ;
  302.    Write (BIS) ;                   (* Wert ausgeben *)
  303.    Write (' ) : ') ;
  304.    Write (ALT) ;                   (* bisherigen Wert ausgeben *)
  305.    REPEAT
  306.       CH := INKEY ;                (* lese ohne Echo *)
  307.       CH := UpCase (CH) ;          (* falls Buchstabe, so Grossbuchstabe *)
  308.       IF CH = Chr (13)             (* bei Return *)
  309.       THEN CH := ALT ;             (* alten Wert uebernehmen *)
  310.    UNTIL (Ord(CH) >= Ord(VON)) AND (Ord(CH) <= Ord(BIS)) ;
  311.    Write (Chr(BACKSPACE),CH) ;     (* alten Wert ueberschreiben *)
  312.    ZIFFER_CHAR := CH ;             (* und als Funktionswert uebergeben *)
  313. END ;                              (* ZIFFER_CHAR *)
  314.  
  315. (*..........................................................................*)
  316.  
  317. FUNCTION R_W_FLYCOM (R_W: INTEGER) : BOOLEAN ;
  318.                                    (* lese bzw. schreibe Daten fuer Spiel, *)
  319. VAR                                (* Ergebnis zeigt mit oder ohne Erfolg *)
  320.    F : FILE OF CHAR ;
  321.    RES, DAT_OK : BOOLEAN ;
  322.  
  323. (*             lokale Prozeduren und Funktionen fuer R_W_FLYCOM             *)
  324.  
  325. PROCEDURE CHECKIO (VAR RESULT: BOOLEAN) ;
  326.                                     (* Seiteneffekt kuerzer als Funktion *)
  327. BEGIN
  328.    IF IOResult <> 0 THEN RESULT := FALSE ;
  329. END ;                              (* CHECKIO *)
  330.  
  331. (*                                                                          *)
  332.  
  333. FUNCTION R_W_FEHLER : CHAR ;       (* meldet R/W Error und fragt ob noch *)
  334.                                    (* ein Versuch unternommen werden soll *)
  335. BEGIN
  336.    WriteLn ;
  337.    Write ('  R/W Error !!!   nochmals versuchen ???') ;
  338.    R_W_FEHLER := JA_NEIN ('J') ;
  339. END ;
  340.  
  341. (*                       jetzt folgt R_W_FLYCOM                             *)
  342.  
  343. BEGIN
  344.    Assign (F,'FLYCOM.DAT') ;
  345.    REPEAT
  346.       RES := TRUE ;                (* Preset ist kein Fehler *)
  347.       {$I-}                        (* check IO ausschalten *)
  348.       IF R_W = LESE THEN ReSet (F) (* Zeiger auf Anfang setzen *)
  349.       ELSE ReWrite (F) ;           (*    ... *)
  350.       CHECKIO (RES) ;              (* bei Fehler wird RES zu FALSE *)
  351.       FOR INDEX := 1 TO 9          (* Grenzen koennten berechnet werden *)
  352.       DO BEGIN                     (* aber so ist keine Anpassung noetig *)
  353.          IF R_W=LESE
  354.          THEN Read (F,DAT_FILE [INDEX])
  355.          ELSE Write (F,DAT_FILE [INDEX]) ;
  356.          CHECKIO (RES) ;           (* bei Fehler wird RES zu FALSE *)
  357.       END ;
  358.       Close (F) ;                  (* am Ende File schliessen *)
  359.       CHECKIO (RES) ;              (* bei Fehler wird RES zu FALSE *)
  360.       {$I+}                        (* check IO wieder einschalten *)
  361.       IF RES = TRUE
  362.       THEN DAT_OK := TRUE          (* kein Fehler, dann O.k. *)
  363.       ELSE DAT_OK := (R_W_FEHLER = 'N') (* Abfrage, ob noch ein Versuch *)
  364.    UNTIL DAT_OK;
  365.    R_W_FLYCOM := RES ;             (* setze Resultat *)
  366. END ;                              (* R_W_FLYCOM *)
  367.  
  368. (*..........................................................................*)
  369.  
  370. FUNCTION UEBERNEHMEN : CHAR ;      (* zeigt gelesene Daten und fragt, ob *)
  371.                                    (* sie uebernommen werden sollen *)
  372. BEGIN                              (* loesche Bildschirm *)
  373.    ClrScr ;
  374.    WriteLn ;
  375.    Write ('   Anzahl der Fliegen ..........') ; WriteLn (DAT_FILE[ANZAHL]) ;
  376.    Write ('   Beweglichkeit der Fliegen ...') ; WriteLn (DAT_FILE[BEWEGE]) ;
  377.    Write ('   Schnelligkeit des Spiels ....') ; WriteLn (DAT_FILE[WARTEN]) ;
  378.    Write ('   Laenge des Spiels ...........') ; WriteLn (DAT_FILE[LAENGE]) ;
  379.    Write ('   Spiel mit Geraeuschen .......') ; WriteLn (DAT_FILE[MITSOUND]) ;
  380.    Write ('   Taste fuer Spieler links ....') ; WriteLn (DAT_FILE[T_LI]) ;
  381.    Write ('   Taste fuer Spieler rechts ...') ; WriteLn (DAT_FILE[T_RE]) ;
  382.    Write ('   Taste fuer Spieler hoch .....') ; WriteLn (DAT_FILE[T_HO]) ;
  383.    Write ('   Taste fuer Spieler runter ...') ; WriteLn (DAT_FILE[T_RU]) ;
  384.    WriteLn ;
  385.    Write ('   sollen diese Daten uebernommen werden') ;
  386.    UEBERNEHMEN := JA_NEIN ('J') ;
  387. END ;                              (* UEBERNEHMEN *)
  388.  
  389. (*..........................................................................*)
  390.  
  391. PROCEDURE MACHE_FILE ;             (* fragt Daten ab und versucht file *)
  392.                                    (* zu generieren *)
  393. VAR                                (* fuer korrekten Aufruf von R_W_FLYCOM *)
  394.    ALL_OK : BOOLEAN ;
  395.  
  396. (*                  lokale Funktion fuer MACHE_FILE                         *)
  397.  
  398. FUNCTION TASTEN_OK : BOOLEAN ;     (* TRUE wenn Tasten alle verschieden *)
  399. BEGIN
  400.    TASTEN_OK := (DAT_FILE[T_LI] <> DAT_FILE[T_RE]) AND
  401.                 (DAT_FILE[T_LI] <> DAT_FILE[T_HO]) AND
  402.                 (DAT_FILE[T_LI] <> DAT_FILE[T_RU]) AND
  403.                 (DAT_FILE[T_RE] <> DAT_FILE[T_HO]) AND
  404.                 (DAT_FILE[T_RE] <> DAT_FILE[T_RU]) AND
  405.                 (DAT_FILE[T_HO] <> DAT_FILE[T_RU]);
  406. END ;                              (* TASTEN_OK *)
  407.  
  408. (*                       jetzt folgt MACHE_FILE                             *)
  409.  
  410. BEGIN
  411.    ClrScr ;                        (* loesche Bildschirm *)
  412.    WriteLn ;
  413.    Write (' Anzahl der Fliegen ...................') ;
  414.    DAT_FILE[ANZAHL] := ZIFFER_CHAR ('1','9','3') ;
  415.    WriteLn ;
  416.    Write (' Beweglichkeit der Fliegen ............') ;
  417.    DAT_FILE[BEWEGE] := ZIFFER_CHAR ('1','9','4') ;
  418.    WriteLn ;
  419.    Write (' Schnelligkeit des Spiels .............') ;
  420.    DAT_FILE[WARTEN] := ZIFFER_CHAR ('1','9','7') ;
  421.    WriteLn ;
  422.    Write (' Laenge des Spiels ....................') ;
  423.    DAT_FILE[LAENGE] := ZIFFER_CHAR ('1','9','2') ;
  424.    WriteLn ;
  425.    Write (' Spiel mit Geraeuschen .......') ;
  426.    DAT_FILE[MITSOUND] := JA_NEIN ('J') ;
  427.    REPEAT
  428.       WriteLn ;
  429.       Write (' Taste fuer Spieler links .............') ;
  430.       DAT_FILE[T_LI] := ZIFFER_CHAR ('A','Z','A') ;
  431.       WriteLn ;
  432.       Write (' Taste fuer Spieler rechts ............') ;
  433.       DAT_FILE[T_RE] := ZIFFER_CHAR ('A','Z','D') ;
  434.       WriteLn ;
  435.       Write (' Taste fuer Spieler hoch ..............') ;
  436.       DAT_FILE[T_HO] := ZIFFER_CHAR ('A','Z','E') ;
  437.       WriteLn ;
  438.       Write (' Taste fuer Spieler runter ............') ;
  439.       DAT_FILE[T_RU] := ZIFFER_CHAR ('A','Z','X') ;
  440.    UNTIL TASTEN_OK ;               (* bis Tasten eindeutig *)
  441.    ALL_OK := R_W_FLYCOM (SCHREIBE) ;    (* und speicher in file *)
  442. END ;                              (* MACHE_FILE *)
  443.  
  444. (*..........................................................................*)
  445. (*        Ende der lokalen Prozeduren und Funktionen fuer INIT_ALLES        *)
  446. (*..........................................................................*)
  447.  
  448. BEGIN                              (* von INIT_ALLES *)
  449.    START_TEXT ;
  450.    IF R_W_FLYCOM (LESE)            (* versuche file FLYCOM.DAT zu lesen *)
  451.    THEN BEGIN
  452.       IF UEBERNEHMEN = 'N'         (* wenn lesbar und Daten nicht *)
  453.       THEN MACHE_FILE ;            (* uebernommen werden sollen *)
  454.    END
  455.    ELSE MACHE_FILE ;               (* bei Lesefehler auch eingeben *)
  456. END ;
  457.  
  458. (*--------------------------------------------------------------------------*)
  459. (*                            bewege alle Fliegen                           *)
  460. (*--------------------------------------------------------------------------*)
  461.  
  462. PROCEDURE ALLE_FLIEGEN ;
  463.  
  464. VAR
  465.    SP, ZE, INDEX: INTEGER ;
  466.  
  467. BEGIN
  468.    FOR INDEX := 1 TO WIEVIELE
  469.    DO BEGIN
  470.       ZUFALLSRICHTUNG (TRAEGE, FLY[INDEX]) ; (* waehle evtl. neue Richtung *)
  471.       IF AN_NEUER_POS (SP, ZE, FLY[INDEX]) = Chr (SPACE)
  472.       THEN SETZE_NEU (Chr(FLIEGE), SP, ZE, FLY[INDEX]) ;
  473.       OWNSOUND (NOTE_C, 5) ;       (* gebe ein kurzes Geraeusch aus *)
  474.       SPIELERRICHTUNG ;            (* fuer mehrfache Abfrage, ob Taste fuer *)
  475.    END ;                           (* eine neue Richtung gedrueckt ist *)
  476. END ;
  477.  
  478. (*--------------------------------------------------------------------------*)
  479. (*        bewege Spieler und ueberpruefe, ob eine Fliege gefangen           *)
  480. (*--------------------------------------------------------------------------*)
  481.  
  482. PROCEDURE BEWEGE_SPIELER ;
  483.  
  484. VAR
  485.    CH: CHAR ;
  486.    SP, ZE: INTEGER ;
  487.  
  488. (*..........................................................................*)
  489. (*                  lokale Prozeduren fuer BEWEGE_SPIELER                   *)
  490. (*..........................................................................*)
  491.  
  492. PROCEDURE GEFANGEN ;
  493. VAR
  494.    GEFUNDEN : BOOLEAN ;
  495.  
  496. (*                       lokale Prozedur fuer GEFANGEN                      *)
  497.  
  498. PROCEDURE BLINK (SP, ZE : INTEGER) ;
  499.  
  500. VAR                                (* laesst Fliege blinken und gibt ein *)
  501.    ZAEHLER : INTEGER ;             (* Sirenenartiges Geraeusch aus *)
  502.  
  503. BEGIN
  504.    OWNWRITE (Chr(SPIELER),SP,ZE) ;
  505.    GotoXY (P_S + 2, P_Z) ;         (* Parkposition des Cursors *)
  506.    FOR ZAEHLER := 120 TO 170 DO OWNSOUND (10*ZAEHLER,3) ;
  507.    OWNWRITE (Chr(FLIEGE),SP,ZE) ;
  508.    GotoXY (P_S + 2, P_Z) ;         (* Parkposition des Cursors *)
  509.    FOR ZAEHLER := 170 DOWNTO 120 DO OWNSOUND (10*ZAEHLER,3) ;
  510.    OWNWRITE (Chr(SPACE),SP,ZE) ;
  511.    GotoXY (P_S + 2, P_Z) ;         (* Parkposition des Cursors *)
  512.    FOR ZAEHLER := 120 TO 170 DO OWNSOUND (10*ZAEHLER,3) ;
  513.    OWNWRITE (Chr(SPIELER),SP,ZE) ;
  514.    GotoXY (P_S + 2, P_Z) ;         (* Parkposition des Cursors *)
  515.    FOR ZAEHLER := 170 DOWNTO 120 DO OWNSOUND (10*ZAEHLER,3) ;
  516.    OWNWRITE (Chr(HINDERNIS),SP,ZE) ;
  517. END ;                              (* BLINK *)
  518.  
  519. (*                       jetzt folgt GEFANGEN                               *)
  520.  
  521. BEGIN
  522.    INDEX := 0 ;
  523.    GEFUNDEN := FALSE ;
  524.    REPEAT                          (* suche alle Fliegen ab, welche *)
  525.       INDEX := INDEX + 1 ;         (* gefangen worden ist *)
  526.       IF (SP = FLY[INDEX].Pos.S)   (* SP und ZE sind wegen vorherigem *)
  527.       AND (ZE = FLY[INDEX].Pos.Z)  (* Aufruf von AN_NEUER_POS bekannt *)
  528.       THEN GEFUNDEN := TRUE ;
  529.    UNTIL (INDEX = WIEVIELE) OR GEFUNDEN = TRUE ;
  530.    IF GEFUNDEN
  531.    THEN BEGIN                      (* normalerweise ist index bekannt *)
  532.       BLINK (SP, ZE) ;
  533.       PUNKTE := PUNKTE + 1 ;
  534.       GotoXY (P_S - 2, P_Z) ;      (* nur die Anzahl Punkte wird waehrend *)
  535.       Write (PUNKTE:4) ;           (* des Spiels nicht mit OWNWRITE gesetzt *)
  536.       GENERIERE (FLY[INDEX]) ;
  537.    END
  538.    ELSE BEGIN                      (* darf normalerweise nicht vorkommen *)
  539.       GotoXY (P_S - 8, P_Z + 1) ;  (* wurde waehrend Testphase benoetigt *)
  540.       Write ('interner Fehler') ;  (* und kann evtl. weggelassen werden *)
  541.    END ;
  542. END ;                              (* GEFANGEN *)
  543.  
  544. (*..........................................................................*)
  545. (*             Ende der lokalen Prozeduren  fuer BEWEGE_SPIELER             *)
  546. (*..........................................................................*)
  547.  
  548. BEGIN                              (* von BEWEGE_SPIELER *)
  549.    SPIELERRICHTUNG ;               (* bei Tastendruck evtl. neue Richtung *)
  550.    CH := AN_NEUER_POS (SP, ZE, YOU) ;
  551.    IF CH = Chr(SPACE)
  552.    THEN SETZE_NEU (Chr(SPIELER), SP, ZE, YOU)
  553.    ELSE IF CH = Chr (FLIEGE) THEN GEFANGEN ;
  554. END ;                              (* BEWEGE_SPIELER *)
  555.  
  556. (*--------------------------------------------------------------------------*)
  557. (*                            warte einige Zeit                             *)
  558. (*--------------------------------------------------------------------------*)
  559.  
  560. PROCEDURE WARTE_ETWAS ;
  561.  
  562. VAR
  563.    INDEX : INTEGER ;               (* Zaehler fuers Warten *)
  564.  
  565. BEGIN
  566.    GotoXY (P_S + 2, P_Z) ;         (* Parkposition des Cursors *)
  567.    FOR INDEX := 1 TO WARTEZAHL     (* anstatt nur DELAY auszufuehren wird *)
  568.    DO BEGIN                        (* auch laufend die Tastatur abgefragt. *)
  569.       SPIELERRICHTUNG ;
  570.       Delay (2) ;
  571.    END;
  572. END ;                              (* Dies leert Tastaturbuffer *)
  573.  
  574. (*--------------------------------------------------------------------------*)
  575. (*                            Spiel ist beendet                             *)
  576. (*--------------------------------------------------------------------------*)
  577.  
  578. PROCEDURE ENDEBILD ;
  579. BEGIN
  580.    GotoXY (P_S - 4, P_Z - 1) ;
  581.    Write ('Sie haben') ;
  582.    GotoXY (P_S - 7, P_Z + 1) ;
  583.    Write ('Punkte erreicht') ;
  584.    GotoXY (17, ZEILEN) ;
  585.    Write ('noch ein Spielchen') ;
  586. END ;                              (* ENDEBILD *)
  587. (* ----------------------------------------------------------------------- *)
  588. (*                          Ende von FLIEGE.INC                            *)
  589.