PROCEDURE Spielerzug; (* SpielerZug abfragen *) LABEL exit; VAR SpZug : tstr; Y,Z,offs :integer; num:tzug; gueltig,kein_Zug_moeglich:boolean; PROCEDURE invertiere; VAR i:0..23; h:tStat; BEGIN h[Spieler]:=Feld.Status[Rechner]; h[Rechner]:=Feld.Status[Spieler]; Feld.Status:=h; FOR i:=0 TO 23 DO IF Feld.Brett[i]=Rechner THEN Feld.Brett[i]:=Spieler ELSE IF Feld.Brett[i]=Spieler THEN Feld.Brett[i]:=Rechner END; BEGIN gotoxy(27,24); write('H(alt) S(pielstaerke) V(orschlag)'); WITH Feld DO BEGIN zeige_Status(Spieler); REPEAT REPEAT gotoxy(35,22); write('Zug : '); ClrEol; read(SpZug); FOR Z:=1 TO length(SpZug) DO SpZug[Z]:=upcase(SpZug[Z]); WHILE pos(' ',SpZug)>0 DO delete(SpZug,pos(' ',SpZug),1); IF SpZug='S' THEN hole_Spielstaerke; IF SpZug='V' THEN BEGIN invertiere; gotoxy(57,17); ClrEol; gotoxy(57,16); ClrEol; Schachtlung_Rechner; Feld.Zug:=BestZug; gotoxy(57,16); write('Vorschlag: '); Writemove; ClrEol; invertiere; END; IF SpZug='H' THEN BEGIN Spiel_ist_aus:=Antwort_Ja('Spiel beenden'); IF Spiel_ist_aus THEN GOTO exit; END; UNTIL (SpZug<>'S') AND (SpZug<>'H') AND (SpZug<>'V'); Schl_Nr:=-1; k:=-1; L:=-1; Zug_ermitteln(Spieler); kein_Zug_moeglich:=Feld.Anzahl=0; offs:=ord(Status[Spieler].Modus=Setzen); fillchar(num,SizeOf(num),-1); FOR Z:=0 TO 2-offs DO FOR Y:=0 TO 23 DO IF posit[Y]=copy(SpZug,2*Z+1,2) THEN num[Z+offs]:=Y; REPEAT gueltig:=true; FOR Z:=offs TO 1+ord(Muehle) DO gueltig:=gueltig AND (num[Z]=Zug[Z]); IF NOT muehle THEN gueltig:=gueltig AND (num[2]=-1); IF NOT gueltig THEN Zug_ermitteln(Spieler); UNTIL gueltig OR (Anzahl=0); IF NOT gueltig AND NOT kein_Zug_moeglich THEN BEGIN gotoxy(35,23); LowVideo; write(' Unguelter Zug '#7#7); delay(1000); gotoxy(35,23); HighVideo; ClrEol; END; UNTIL gueltig OR kein_Zug_moeglich; IF kein_Zug_moeglich THEN verloren(Spieler) ELSE mache_Zug(Spieler,zeigen); END; exit: gotoxy(1,24); ClrEol; END; PROCEDURE Rechnerzug; (* Naechsten RechnerZug ermitteln *) BEGIN (* Rechnerzug *) gotoxy(19,22); write('':8); gotoxy(57,16); ClrEol; gotoxy(57,17); ClrEol; zeige_Status(Rechner); gotoxy(19,22); Schachtlung_Rechner; gotoxy(57,17); ClrEol; gotoxy(57,16); IF abs(minmax[1])<32000 THEN write('Bewertung : ',minmax[1]) ELSE write(steine[tstein(1+ord(minmax[1]<0))], ' verliert in ',(maxint-abs(minmax[1])-1) DIV 2); ClrEol; gotoxy(19,22); write(#7); IF minmax[1]=-maxint+1 THEN verloren(Rechner) ELSE BEGIN Feld.Zug:=BestZug; WriteMove; mache_Zug(Rechner,zeigen); IF minmax[1]=maxint-2 THEN BEGIN zeige_Status(Spieler); verloren(Spieler) END; END; END;