app/misc-games/unknown/src/LINDWURM.ELA

Raw file
Back to index

PACKET lind wurm DEFINES lindwurm:
deklaration; 
LET max = 500,zeilen = 23,spalten = 77;
 
PROC kriech :
  speicher := stelle;
  REP
   putline(""1"Punkte:"+text(punkte + bonus) + ""6""0""30"Zeit:" + zeit);
   IF punkte <> 0 
      THEN ende INCR 1;
           IF ende > max THEN ende := 1 FI;
           laenge := laenge + 1 - zaehler;
           IF laenge > max THEN laenge := 1 FI;
           wurm(ende) := speicher;
           IF zaehler = 0 AND wurm(laenge) >= basis AND wurm(laenge) < (basis+(spalten*zeilen)) 
              THEN poke(wurm(laenge),leerzeichen) 
           FI;
           IF speicher >= basis AND speicher < (basis+(spalten*zeilen)) THEN 
              poke(speicher,char1)
           FI
      ELSE IF speicher >= basis AND speicher < (basis+(spalten*zeilen)) 
              THEN poke (speicher,leerzeichen)
           FI;
   FI;
   zaehler := 0;
   speicher INCR richtung;
   IF peek(speicher) <> leerzeichen THEN nahrung oder gift FI; 
   IF speicher >= basis AND speicher < (basis+(spalten*zeilen)) THEN poke(speicher,char2) FI;
   tastaturabfrage;
   IF punkte > begrenzung THEN x := int(zeit); index := 1 FI;
   IF zeit > stopzeit THEN index := 2 FI;
  UNTIL index <> 0 PER
ENDPROC kriech;

PROC nahrung oder gift :
     IF peek(speicher) <> char 3 THEN index := 3 
       ELSE punkte INCR 10; zaehler := 1
     FI;
ENDPROC nahrung oder gift;

PROC tastaturabfrage :
    taste := incharety(9 DIV geschwindigkeit);
    feuer := taste = ""13"";
    IF feuer THEN richtung := 0
    ELIF taste = ""10"" THEN richtung INCR spalten
    ELIF taste = ""8""  THEN richtung DECR 1 
    ELIF taste = ""2""  THEN richtung INCR 1
    ELIF taste = ""3""  THEN richtung DECR spalten
    FI
ENDPROC tastatur abfrage;

PROC bonus erreicht :
     x := (int(stopzeit)-x) * schwierigkeit;
     cspalte := 10;
     czeile  := 10;
     cursorpositionieren;
     putline("B O N U S ! ! !");
     line;
     putline(""15"          "+text(x)+" Punkte !!!"14"");
     bonus := bonus + punkte + x;
ENDPROC bonus erreicht;

PROC poke (INT CONST stelle,wert) :
     INT VAR x pos := 1 + ((stelle - basis) MOD spalten),
             y pos := 1 + ((stelle - basis) DIV spalten); 
     cursor(x pos,y pos);
     IF wert = 126 THEN out(""15""8""14"") ELSE
        out(code(wert));
     FI;
     bildschirm (x pos)(y pos) := wert;
ENDPROC poke;

INT PROC peek (INT CONST stelle) :
    INT VAR x pos := 1 + ((stelle - basis) MOD spalten),
            y pos := 1 + ((stelle - basis) DIV spalten);
    bildschirm (x pos)(y pos)
ENDPROC peek;

PROC cursorpositionieren :
     bildschirm zeile := basis + spalten*czeile;
     cursor(cspalte+1,czeile+1);
ENDPROC cursor positionieren;

PROC highscore und platznummer :
     punkte := punkte + bonus;
     bonus := 0;
     IF punkte > highscore THEN highscore := punkte FI;
     player counter INCR 1;
     q := player counter + 1;
     spieler punkte(playercounter) := punkte;
     FOR i FROM 1 UPTO playercounter REP
         IF punkte > spielerpunkte (i) THEN q DECR 1 FI;
     PER;
     c spalte :=10;
     czeile := 10;
     cursorpositionieren;
     putline("Hoechstpunktzahl "+text(highscore));line;
     putline("           Punkte :"+text(punkte));
     putline("           Platznr.:"+text(q-1));
     IF q-1 >= 10 THEN inchar(hilf)
        ELSE put("Name des Gewinners:");
        getline(hilf);
        disablestop;
        FOR i FROM playercounter DOWNTO q REP
            spielername(i+1) := spielername(i);
            IF iserror THEN clearerror; spielername(i+1) := "" FI;
        PER;
        enablestop;
        spielername(q-1) := "(" +text(punkte) + " Punkte: " + hilf+")";
     FI;
     page;
     putline("Die ersten 10 Gewinner :");
     disablestop;
     FOR i FROM 1 UPTO min(playercounter,10) REP
         putline(text(i)+"."+spielername(i));
         IF iserror THEN clearerror;spielername(i) := "" FI
     PER;
     enablestop;
     putline("Druecken Sie eine Taste");
     inchar(hilf);
ENDPROC highscore und platznummer;

PROC explosion :
   out(""7"");
   FOR i FROM ende DOWNTO laenge +1REP
       IF wurm (i) >= basis AND wurm(i) < (basis+spalten*zeilen) THEN poke(wurm(i),leerzeichen);
       FI;
   PER;
   highscore und platznummer
ENDPROC explosion;

PROC lindwurm :
   bonus := 0;

   REP
    clearscreen;
    out(""14""1""4"");
    IF bonus = 0 THEN neues spiel FI;
    IF bonus > 0 THEN bonusspiel FI;
    page;
    rahmen;
    lebensraum generieren;
    lindwurm kopf setzen;
    reset time;
    kriech;
    SELECT index OF 
       CASE 1 : bonus erreicht
       CASE 2 : highscore und platznummer
       CASE 3 : explosion
    ENDSELECT
  UNTIL bonus<= 0 COR no(""1""4""10""10"Noch ein Spiel") PER

ENDPROC lindwurm;

PROC neues spiel :
     basis := 0;
     stelle := basis + spalten*zeilen DIV 2;
     schwierigkeit := 4;
     geschwindigkeit :=9;
     char 1:= 126;
     char 2:= 79;
     char 3:= 42;
     char 4:= 124;
     leerzeichen := 32;
     index := 0;
     ende := 0;
     laenge := 0;
     richtung := 0;
     zaehler := 0;
     bonus := 0;
     punkte := 0;
     stopzeit :="3:00";
     vorwahl;
     begrenzung := 120 * schwierigkeit;
ENDPROC neues spiel;

PROC liste aller spieler :
     page;
     FOR i FROM 1 UPTO playercounter REP
        putline(text(i)+"."+spielername(i));
        IF i > 24 THEN pause(20) FI;
     PER;
     putline("ENDE");
     inchar(hilf);
     page;
ENDPROC liste aller spieler;


PROC vorwahl :
     spielregeln;
     page;
     REP
       out(""1"");
       putline(""142"                                    Lindwurm                               "143"");
       czeile :=12;
       cspalte:=3;
       cursorpositionieren;
       putline("Schwierigkeitsgrad (1/2) "+ text(schwierigkeit,3));
       czeile :=14;
       cspalte:=3;
       cursorpositionieren;
       putline("Geschwindigkeit    (3/4) "+ text(geschwindigkeit,3));
       czeile :=16;
       cspalte:=3;
       cursorpositionieren;
       putline("Liste aller Spieler (5)  ");
       czeile :=18;
       cspalte:=3;
       cursorpositionieren;
       putline("Start mit RETURN");
       x := 0;
       inchar(hilf);
       IF hilf = ""13""THEN LEAVE vorwahl
       ELIF hilf = "1" THEN schwierigkeit INCR 1
       ELIF hilf = "2" THEN schwierigkeit DECR 1
       ELIF hilf = "3" THEN geschwindigkeit INCR 1
       ELIF hilf = "4" THEN geschwindigkeit DECR 1
       ELIF hilf = "5" THEN liste aller spieler 
       ELSE out(""7"") 
       FI;
       IF schwierigkeit > 26 THEN schwierigkeit := 1 
       ELIF schwierigkeit < 1 THEN schwierigkeit := 26 FI; 
       IF geschwindigkeit > 9 THEN geschwindigkeit := 1 
       ELIF geschwindigkeit < 1 THEN geschwindigkeit := 9 FI; 
     PER

ENDPROC vorwahl;

PROC spielregeln :
     putline(code(char1)+" = Rahmen (Mauer)");
     line;
     putline(code(char2)+" = Lindwurmkopf");
     line;
     putline(code(char3)+" = Nahrung");
     line;
     putline(""15""8""14" = Lindwurm"); 
     line;
     putline(". = Gift");
     line;
     putline ("Ziel des Spiels ist es, den Wurm mit Nahrung zu versorgen. Gift ist tödlich.");
     line;
     putline ("Der Wurm kann mit den Pfeiltasten gesteuert werden. Wird eine Taste mehrmals");
     line;
     putline ("gedrückt, wird der Wurm schneller. Vorsicht: Der Wurm darf nicht auf eine");
     line;
     putline ("Mauer treffen. Mit jedem gefressenen Nahrungsteilchen wird der Wurm etwas");
     line;
     putline ("länger. Du hast 3 Minuten Zeit, den Wurm zu füttern.");
     line;
     putline ("Viel Erfolg. Bitte drücke jetzt eine Taste.");
     pause(6000);
ENDPROC spielregeln;

PROC bonusspiel :
    stelle := basis+zeilen*spaltenDIV2;
    index := 0;
    punkte := 0;
    richtung := 0;
    zaehler := 0;
    ende := 0;
    laenge := 0;
    schwierigkeit INCR 1;
    IF schwierigkeit > 26 THEN schwierigkeit := 26 FI;
    begrenzung := 120 * schwierigkeit 

ENDPROC bonusspiel;

PROC lebensraum generieren :
    FOR i FROM 1 UPTO 16 * schwierigkeit REP
        REP
           x := int(random * real((zeilen-2)*spalten) + real(spalten));
        UNTIL peek(basis+x) = leerzeichen PER;
        poke(basis+x,char3)
    PER;
    FOR i FROM 1 UPTO schwierigkeit REP
        REP
           x := int(random * real((zeilen-2)*spalten) + real(spalten));
        UNTIL peek(basis+x) = leerzeichen PER;
        poke(basis+x,46)
    PER;
ENDPROC lebensraum generieren;

PROC lindwurmkopf setzen :
    WHILE peek(stelle) <> leerzeichen REP stelle INCR 1 PER;
    poke(stelle,char2);
    out(""7"");

ENDPROC lindwurmkopf setzen;

PROC rahmen :
   FOR i FROM basis UPTO basis + spalten-1 REP
       poke(i,char4);
       poke(i+(zeilen-1)*spalten,char4);
   PER;
   i := basis + spalten;
   REP poke(i ,char4); 
       poke(i+spalten-1,char4);
       i INCR spalten
   UNTIL i >( basis + (zeilen-1)*spalten )PER

ENDPROC rahmen;

PROC clearscreen :
   INT VAR x,y;
       putline ("Nun markiert der Wurm sein Revier.");
       line ;
       put("Es ist");put(spalten);put("qm gross.");line;
       FOR x FROM 1 UPTO spalten REP
           cout(x);
           FOR y FROM 1 UPTO zeilen REP
               bildschirm(x)(y) := leerzeichen
           PER
       PER
ENDPROC clearscreen;

TEXT PROC zeit :
     subtext(time(clock(1)-uhr),5,8)
ENDPROC zeit;

PROC reset time :
     uhr := clock(1)
ENDPROC reset time;.

deklaration :
   ROW spalten ROW zeilen INT VAR bildschirm;
   ROW 300 INT VAR spielerpunkte;
   ROW 300 TEXT VAR spielername;
   ROW max INT VAR wurm;
   TEXT VAR hilf,taste,stopzeit;
   INT VAR basis:=0,playercounter:=0,highscore:=0,q:=0,i:=0,x:=0,y:=0,stelle:=1000,richtung,
           punkte:=0,bonus:=0,index:=0,cspalte,czeile,bildschirmzeile,zaehler:=0,ende:=0,
           laenge:=0,speicher:=1,leerzeichen:=32,begrenzung:=480,schwierigkeit:=4,
           geschwindigkeit:=9,c:=90,char1:=90,char2:=90,char3:=90,char4:=90;

   REAL VAR uhr;
   BOOL VAR feuer;
ENDPACKET lindwurm