{***************************************************************************} {* Endabrechnung, Computer- und Menschenzug, Utilities *} {***************************************************************************} PROCEDURE Abrechnung(Ende: boolean); VAR w,s,i,j: byte; BEGIN w:=0; s:=0; FOR i:=1 TO Groesse DO FOR j:=1 TO Groesse DO CASE Feld[i,j] OF computer: w:=succ(w); mensch : s:=succ(s) END; gotoxy(50,11); write(ComputerZeichen,' hat ',w,' Felder.'); gotoxy(50,12); write(MenschZeichen,' hat ',s,' Felder.'); gotoxy(50,13); ClrEol; gotoxy(50,14); IF Ende THEN BEGIN IF w>s THEN write('Ich habe') ELSE IF s>w THEN write('Sie haben') ELSE write('Keiner hat'); write(' gewonnen!'); gotoxy(50,15); ClrEol END END; FUNCTION KannZiehen(s: Spieler; VAR l: ZugListe):boolean; BEGIN GenZugListe(Feld,s,l); KannZiehen:=l.Anzahl>0; END; PROCEDURE SchreibZugListe(AmZug: Spieler; VAR ZL: ZugListe); VAR i: byte; BEGIN gotoxy(1,24); IF AmZug=Mensch THEN write('Ihre') ELSE write('Meine'); write(' moeglichen Zuege: '); WITH ZL DO BEGIN FOR i:=1 TO Anzahl DO write(chr(64+Zuege[i].Spalte),Zuege[i].Zeile,'/'); ClrEol; END END; PROCEDURE SchreibZugNummer(Nr: byte); BEGIN gotoxy(68,1); write('Zug-Nr.:',1+Nr DIV 2:2) END; PROCEDURE MenschenZug(VAR Pos: Zug; ZL: ZugListe); VAR i : byte; erlaubt: boolean; PROCEDURE LiesZug; VAR c: char; PROCEDURE Change; VAR i,j: byte; t : Belegung; BEGIN FOR i:=1 TO Groesse DO FOR j:=1 TO Groesse DO IF Feld[i,j]=Mensch THEN Feld[i,j]:=Computer ELSE IF Feld[i,j]=Computer THEN Feld[i,j]:=Mensch END; {Change} BEGIN {LiesZug} gotoxy(50,16); ClrEol; gotoxy(50,6); write('Ihr Zug: '); ClrEol; REPEAT write(^G); gotoxy(61,6); read(kbd,c); c:=upcase(c); CASE c OF ^Q : halt; 'V' : BEGIN Change; Suche(Pos,ZL,Feld); Change; gotoxy(50,10); write('Mein Vorschlag: ',chr(Pos.Spalte+64),Pos.Zeile:2); REPEAT UNTIL keypressed; gotoxy(50,10); ClrEol END; 'L' : BEGIN gotoxy(7,1); REPEAT read(kbd,c) UNTIL c IN [#13,'0'..'9']; IF c<>#13 THEN BEGIN LEVEL:=ord(c)-48; write(c) END END; 'R' : IF ZugNummer>1 THEN BEGIN ZugNummer:=ZugNummer-2; SchreibZugNummer(ZugNummer); Feld:=Spiel[ZugNummer]; SchreibSpielFeld(Feld); GenZugListe(Feld,Mensch,ZL); SchreibZugListe(Mensch,ZL) END; 'W' : BEGIN Abrechnung(false); REPEAT UNTIL keypressed; gotoxy(50,11); ClrEol; gotoxy(50,12); ClrEol; gotoxy(50,13); ClrEol; gotoxy(50,14); ClrEol END END UNTIL c IN ['A'..chr(64+Groesse)]; write(c,' '); Pos.Spalte:=ord(c)-64; REPEAT read(kbd,c) UNTIL c IN ['1'..chr(48+Groesse)]; write(c); Pos.Zeile:=ord(c)-48 END; {LiesZug} BEGIN {MenschenZug} SchreibZugListe(Mensch,ZL); WITH ZL DO REPEAT LiesZug; erlaubt:=false; FOR i:=1 TO Anzahl DO WITH Zuege[i] DO IF (Pos.Spalte=Spalte) AND (Pos.Zeile=Zeile) THEN erlaubt:=true UNTIL erlaubt END; {MenschenZug} PROCEDURE ComputerZug(VAR Pos: Zug; ZL: ZugListe); BEGIN SchreibZugListe(Computer,ZL); gotoxy(50,8); ClrEol; write('Mein Zug: '); Suche(Pos,ZL,Feld); gotoxy(61,8); write(chr(64+Pos.spalte),' ',Pos.zeile); END; FUNCTION SpielEnde(VAR SF: SpielFeld):boolean; VAR i,j: 1..maxzahl; BEGIN FOR i:=1 TO Groesse DO FOR j:=1 TO Groesse DO IF SF[i,j]=leer THEN BEGIN SpielEnde:=false; exit END; SpielEnde:=true END; PROCEDURE NeuesSpielfeld(VAR SF: SpielFeld); VAR m: 1..maxzahl; BEGIN fillchar(SF,sizeof(SF),0); m:=Groesse DIV 2; SF[m,m]:=Computer; SF[m+1,m+1]:=Computer; SF[m,m+1]:=Mensch; SF[m+1,m]:=Mensch END;