program Sokoban(input,output); { SOKOBAN fuer den JOYCE/PCW Spezieller Angleich an die Grafik-Routinen. Und Programm noch etwas optimiert, allerdings koennten die Grafik-Routinen (Linie()) durch Primitive (Horizontale/Vertikale Linie) noch vereinfacht werden. De-Compiliert von W. Cirsovius SOKOBAN urspruenglich fuer die KC85/4 Maschine - laut TURBO Kompilat Quelle: http://www.iee.et.tu-dresden.de/~kc-club/index.html -> http://www.iee.et.tu-dresden.de/~kc-club/09/RUBRIK17.HTM Sehr hilfreich: http://www.iee.et.tu-dresden.de/~kc-club/05/BOOK06/0506-000.HTML } {$ISOKOGRAF.INC} {$ISOKOBANJ.INC} procedure Bewegung(x,y:integer); { Spieler bewegen } Begin BewegeSpieler(AltX,AltY,NeuX,NeuY); if (SpielFeld[Spalte+x,Zeile+y]=KISTENLAGER) then KistenPlatz(AltX,AltY); End; BEGIN { M A I N } GraphInit; HideCursor; Eingabe1:=0; Eingabe2:=0; BildNr:=0; NeuesSpielEinlesen; if (BildNr<>0) then repeat AktuellesZeichenLesen; case AktuellesZeichen of LINKS : begin case SpielFeld[Spalte-1,Zeile] of LEERFELD : begin NeuX:=AltX-12; SchubNr:=succ(SchubNr); Spalte:=pred(Spalte); end; KISTENFELD : begin case SpielFeld[Spalte-2,Zeile] of KISTENLAGER : begin SchiebeKiste(LINKS); SpielFeld[Spalte-1,Zeile]:=HINDERNISFELD; SpielSteine:=pred(SpielSteine); end; LEERFELD : begin SchiebeKiste(LINKS); SpielFeld[Spalte-1,Zeile]:=KISTENFELD; end; end; end; KISTENLAGER : begin NeuX:=AltX-12; Video(Aus); KistenPlatz(AltX,AltY); SchubNr:=succ(SchubNr); Spalte:=pred(Spalte); end; HINDERNISFELD : begin case SpielFeld[Spalte-2,Zeile] of KISTENLAGER: begin SchiebeKiste(LINKS); SpielFeld[Spalte, Zeile]:=KISTENLAGER; SpielFeld[Spalte-1,Zeile]:=HINDERNISFELD; end; LEERFELD : begin SchiebeKiste(LINKS); SpielFeld[Spalte, Zeile]:=KISTENLAGER; SpielFeld[Spalte-1,Zeile]:=KISTENFELD; SpielSteine:=succ(SpielSteine); end; end; end; end; Bewegung(1,0); end; RECHTS : begin case SpielFeld[Spalte+1,Zeile] of LEERFELD : begin NeuX:=AltX+12; SchubNr:=succ(SchubNr); Spalte:=succ(Spalte); end; KISTENFELD : begin case SpielFeld[Spalte+2,Zeile] of KISTENLAGER : begin SchiebeKiste(RECHTS); SpielFeld[Spalte+1,Zeile]:=HINDERNISFELD; SpielSteine:=pred(SpielSteine); end; LEERFELD : begin SchiebeKiste(RECHTS); SpielFeld[Spalte+1,Zeile]:=KISTENFELD; end; end; end; KISTENLAGER : begin NeuX:=AltX+12; Video(Aus); KistenPlatz(AltX,AltY); SchubNr:=succ(SchubNr); Spalte:=succ(Spalte); end; HINDERNISFELD : begin case SpielFeld[Spalte+2,Zeile] of KISTENLAGER : begin SchiebeKiste(RECHTS); SpielFeld[Spalte, Zeile]:=KISTENLAGER; SpielFeld[Spalte+1,Zeile]:=HINDERNISFELD; end; LEERFELD : begin SchiebeKiste(RECHTS); SpielFeld[Spalte, Zeile]:=KISTENLAGER; SpielFeld[Spalte+1,Zeile]:=KISTENFELD; SpielSteine:=succ(SpielSteine); end; end; end; end; Bewegung(-1,0); end; HOCH : begin case SpielFeld[Spalte,Zeile-1] of LEERFELD : begin NeuY:=AltY+12; SchubNr:=succ(SchubNr); Zeile:=pred(Zeile); end; KISTENFELD : begin case SpielFeld[Spalte,Zeile-2] of KISTENLAGER : begin SchiebeKiste(HOCH); SpielFeld[Spalte,Zeile-1]:=HINDERNISFELD; SpielSteine:=pred(SpielSteine); end; LEERFELD : begin SchiebeKiste(HOCH); SpielFeld[Spalte,Zeile-1]:=KISTENFELD; end; end; end; KISTENLAGER : begin NeuY:=AltY+12; Video(Aus); KistenPlatz(AltX,AltY); SchubNr:=succ(SchubNr); Zeile:=pred(Zeile); end; HINDERNISFELD : begin case SpielFeld[Spalte,Zeile-2] of KISTENLAGER : begin SchiebeKiste(HOCH); SpielFeld[Spalte, Zeile]:=KISTENLAGER; SpielFeld[Spalte,Zeile-1]:=HINDERNISFELD; end; LEERFELD : begin SchiebeKiste(HOCH); SpielFeld[Spalte, Zeile]:=KISTENLAGER; SpielFeld[Spalte,Zeile-1]:=KISTENFELD; SpielSteine:=succ(SpielSteine); end; end; end; end; Bewegung(0,1); end; RUNTER : begin case SpielFeld[Spalte,Zeile+1] of LEERFELD : begin NeuY:=AltY-12; SchubNr:=succ(SchubNr); Zeile:=succ(Zeile); end; KISTENFELD: begin case SpielFeld[Spalte,Zeile+2] of KISTENLAGER : begin SchiebeKiste(RUNTER); SpielFeld[Spalte,Zeile+1]:=HINDERNISFELD; SpielSteine:=pred(SpielSteine); end; LEERFELD : begin SchiebeKiste(RUNTER); SpielFeld[Spalte,Zeile+1]:=KISTENFELD; end; end; end; KISTENLAGER: begin NeuY:=AltY-12; Video(Aus); KistenPlatz(AltX,AltY); SchubNr:=succ(SchubNr); Zeile:=succ(Zeile); end; HINDERNISFELD: begin case SpielFeld[Spalte,Zeile+2] of KISTENLAGER : begin SchiebeKiste(RUNTER); SpielFeld[Spalte,Zeile ]:=KISTENLAGER; SpielFeld[Spalte,Zeile+1]:=HINDERNISFELD; end; LEERFELD : begin SchiebeKiste(RUNTER); SpielFeld[Spalte,Zeile ]:=KISTENLAGER; SpielFeld[Spalte,Zeile+1]:=KISTENFELD; SpielSteine:=succ(SpielSteine); end; end; end; end; Bewegung(0,-1); end; GAME : begin write(^G); NeuesSpielEinlesen; end; end; AltX:=NeuX; AltY:=NeuY; if (AktuellesZeichen<>GAME) then StandAusgeben(Aktuell); if (SpielSteine=0) then begin BildNr:=succ(BildNr); Eingabe1:=succ(Eingabe1); if (Eingabe1>9) then begin Eingabe2:=succ(Eingabe2); Eingabe1:=0; end; if ((Eingabe1=1) or (Eingabe1=6)) then begin PIClesen(DateiOk); Eingabe1:=1; end; if DateiOk then PICdekodieren; end; until ((BildNr=0) or (not DateiOk)); BEENDEN(' beendet'); END.