Demo entry 5982407

SCHACH

   

Submitted by anonymous on Sep 12, 2016 at 14:13
Language: QBasic. Code size: 25.2 kB.

  
  KAPITEL 5
  
  
  
  10	PRINT	"  ************************"
  20	PRINT	"  ** CSS-SCHACHPROGRAMM **"
  30	PRINT	"  ************************"
  40	PRINT	"   VON DIETER STEINWENDER "
  50	PRINT
  60	REM
  70	DIM B(119), S(10,4) : REM						10x12-BRETT, STATUS
  80	DIM O(15), OA(6), OE(6), L(6), Z(200,6)
  90	DIM ZT(9,8), BV(8), BL(2,9), TL(2,9): REM		FELDVARIABLEN
 100	DIM T7(2), BA(2), KR(2), KL(2): REM				FUER BEWERTUNGSFUNKTION

 200	RESTORE
 210	REM
 220	REM :  *********************
 230	REM :  * INITIALISIERUNGEN *
 240	REM :  *********************
 250	REM
 260	REM : BRETT-INITIALISIERUNG
 270	FOR I=0 TO 119
 280		B(I) = 100 : REM							SETZE RANDFELDER
 290	NEXT I
 300	FOR I=9 TO 2 STEP -1
 310		FOR J=1 TO 8
 320			READ B(I*10+J) : REM					LIES GRUNDSTELLUNG
 330		NEXT J
 340	NEXT I
 350	DATA	-2,-4,-3,-5,-6,-3,-4,-2	: REM			SCHWARZE FIGUREN
 360	DATA	-1,-1,-1,-1,-1,-1,-1,-1	: REM			SCHWARZE BAUERN
 370	DATA	 0, 0, 0, 0, 0, 0, 0, 0
 380	DATA	 0, 0, 0, 0, 0, 0, 0, 0 : REM			LEERFELDER
 390	DATA	 0, 0, 0, 0, 0, 0, 0, 0
 400	DATA	 0, 0, 0, 0, 0, 0, 0, 0
 410	DATA	 1, 1, 1, 1, 1, 1, 1, 1 : REM			WEISSE BAUERN
 420	DATA	 2, 4, 3, 5, 6, 3, 4, 2 : REM			WEISSE BAUERN
 430	F=1 : REM										WEISS AM ZUG
 440	FOR I=1 TO 4
 450		S(0,I)=1 : REM								ALLE ROCHADEN LEGAL
 460	NEXT I
 470	S(0,0)=0 : REM									KEIN E.P.-FELD
 480	M(0)=0 : REM									MATERIAL AUSGEGLICHEN
 490	REM
 500	REM : FIGUREN-TABELLEN
 510	FOR I = 0 TO 6
 520	READ A$(I), U(I) : REM							LIES DRUCKSYMBOL, MATERIALWERT
 530	NEXT I
 540	DATA ".",0,"B",100,"T",500,"L",350
 550	DATA"S",325,"D",900,"K",20000
 560	M0 = 48100 : REM								MATERIAL DER GRUNDSTELLUNG
 570	REM
 580	REM : FARBSYMBOLE
 590	F$(0) = "." : REM								SCHWARZ
 600	F$(1) = "." : REM								LEERFELD
 610	F$(2) = "*"	: REM								WEISS
 620	REM
 630	REM: ZUGGENERAATOR-TABELLEN
 640	FOR I=0 TO 15
 650		READ O(I): REM								ZUG-OFFSETS FUER 10x1-BRETT
 660	NEXT I
 670	DATA	-9, -11, 9, 11, -1, 10, 1, -10, 19, 21, 12, -8, -19, -21, -12, 8
 680	REM
 690	FOR I=1 TO 6
 700		READ OA(I), OE(I), L(I): REM				OFFSET-ANFANG, -ENDE, LANGSCHRITT
 710	NEXT I
 720	DATA	0, 3, 0, 4, 7, 1, 0, 3, 1, 8, 15, 0, 0, 7, 1, 0, 7, 0
 730	REM
 740	REM: ROCHADE-TABELLEN
 750	FOR I=1 TO 4
 760		READ R1(I), R2(I), R3(I), R4(I), R5(I), R6(I), R7(I)
 770	NEXT I
 780	DATA	96, 97, 95, 97, 95, 97, 98
 790	DATA	92, 94, 93, 95, 95, 93, 91
 800	DATA	26, 27, 25, 27, 25, 27, 28
 810	DATA	22, 24, 23, 25, 25, 23, 21
 820	REM
 830	REM:	BEWERTUNGS-TABELLEN
 840	FOR J = 1 TO 8: REM				FUER ALLE FELDER
 850	FOR I = 2 TO 9:	REM				DES SPIELBRETTES
 860	ZT(I,J)=12-4*(ABS(5.5-I)+ABS(4.5-J)): REM	ZENTRUMSTABELLE
 870	NEXT I
 880	READ BV(J): REM					BAUERNVORMARSCH-TABELLE
 890	NEXT J
 900	DATA 0,0,4,6,7,2,0,0
 910	REM
 920	REM: STEUERDATEN
 930	MZ=0: REM										MEHRFACH-ZUEGE
 940	G1(0)=1: REM									GRENZE DES ZUGSTAPELS
 950	T0=1: REM										VOREINSTELLUNG RECHENTIEFE

1800	T=0 : REM										AKTUELLE TIEFE IM SPIELBAUM
1810	REM
1990	REM : ***************
2000	REM : * SPIELER-ZUG *
2010	REM : ***************
2020	PRINT "  IHR ZUG"; : INPUT E$ : REM				BENUTZER-EINGABE
2030	REM
2040	REM : KOMMANDOS
2050	IF E$<>"AN" THEN 2070
2060		GOTO 200 : REM								NEUER PARTIEANFANG
2070	IF E$<>"EN" THEN 2090							
2080		GOTO 15000 : REM							SPIELENDE
2090	IF E$<>"BR" THEN 2120
2100		GOSUB 4000 : REM							BRETTAUSGABE
2110		GOTO 2000
2120	IF E$<>"PB" THEN 2150
2130		GOSUB 5000 : REM							PROBLEMEINGABE
2140		GOTO 2000
2150	IF E$<>"SP" THEN 2170: REM						SPIELEN
2160		GOTO 3500: REM								BERECHNE COMPUTERZUG
2170	IF E$<>"MZ" THEN 2210: REM						MEHRFACHZUEGE
2180		PRINT "MEHRFACH-ZUEGE: ";
2190	IF MZ=0 THEN MZ=1: PRINT "EIN": GOTO 2000
2200		MZ=0: PRINT "AUS": GOTO 2000
2210	IF E$<>"ZL" THEN 2260: REM						ZUGLISTE
2220		ZO=Z1: REM									RETTE AKTUELLEN ZUG
2230	GOSUB 6500: REM									AUSGABE DER ZUEGE
2240	Z1=ZO: REM										RESTAURIERE AKTUELLEN ZUG
2250	GOTO 2000
2260	IF E$ <> "ZU" THEN 2330: REM					ZUG ZURUECKNEHMEN
2270	IF T=1 THEN 2300: REM							NUR FUER TIEFE 1 MOEGLICH
2280	PRINT "  LEIDER NICHT MOEGLICH"
2290	GOTO 2000: REM									FERTIG
2300	GOSUB 9600: REM									NIMM LETZTEN ZUG ZURUECK
2310	PRINT "  OK"
2320	GOTO 2000: REM									FERTIG
2330	IF E$<>"TI" THEN 3000:	REM						EINSTELLEN DER RECHENTIEFE
2340	PRINT "	RECHENTIEFE=";TO;:REM					AUSGABE ALTE RECHENTIEFE
2350	INPUT T0:	REM									EINGABE NEUE RECHENTIEFE
2360	T0=ABS(T0):	REM									KEINE NEGATIVEN WERTE
2370	GOTO 2000:	REM									ANFANG SPIELERZUG
2380	REM

3000	REM : ZUGEINGABE-ENTSCHLUESSELUNG
3010	IF LEN(E$) < 4 THEN 2000 : REM					ZUG-EINGABE ZU KURZ
3020	V1 = ASC(E$) - 64 + 10 * (ASC( MID$(E$,2,1) ) -47) : REM		VON
3030	N1 = ASC( MID$(E$,3,1) ) - 64 + 10 * (ASC( MID$(E$,4,1) ) -47) : REM	NACH
3040	GOSUB 8800: REM									AKTUELLE STELLUNG WIRD WURZEL
3050	GOSUB 7000: REM									ERZEUGE ALLE ZUEGE
3060	FOR Z1=1 TO G-1: REM							VERGLEICHE MIT EINGABE
3070		IF Z(Z1,1) <> V1 THEN 3090
3080		IF Z(Z1,2) = N1 THEN 3120
3090	NEXT Z1
3100	PRINT "  ILLEGALER ZUG"
3110	GOTO 2000
3120	IF Z(Z1,4) = 0 THEN 3170: REM					BAUERNUMWANDLUNG

3140	IF RIGHT$ (E$,1) = "S" THEN Z1=Z1+1: REM		SPRINGER
3150	IF RIGHT$ (E$,1) = "L" THEN Z1=Z1+2: REM		LAEUFER
3160	IF RIGHT$ (E$,1) = "T" THEN Z1=Z1+3: REM		TURM
3170	PRINT "  IHR ZUG: ";
3180	GOSUB 6000: REM									GIB DEN ZUG AUS
3190	GOSUB 9000 : REM								FUEHRE DEN ZUG AUS
3200	GOSUB 7000: REM									PRUEFE AUF LEGALITAET
3210	IF MT = 0 THEN 3300: REM						KANN KOENIG GESCHLAGEN WERDEN?
3220	GOSUB 9600: REM									NIMM DEN ZUG WIEDER ZURUECK
3230	GOTO 3100: REM									MELDE ILLEGALEN ZUG


3300	IF MZ=1 THEN 2000: REM							MEHRFACHZUEGE?
3310	REM

3490	REM:	***************
3500	REM:	* COMPUTERZUG *
3510	REM:	***************
3520	GOSUB 8800:	REM									AKTUELLE STELLUNG WIRD WURZEL
3530	GOSUB 10000:	REM								COMPUTERZUG BERECHNEN
3540	IF Z2=0 THEN 3650: REM							KEIN ZUG GEFUNDEN?
3545	IF W=1 THEN 3660:  REM							COMPUTER IST PATT

3550	IF W=-32766 THEN 3630: REM						COMPUTER IST MATT?
3560	Z1=Z2:		REM									BESTER ZUG
3570	PRINT "	MEIN ZUG: ";
3580	GOSUB 6000:	REM									GIB DEN ZUG AUS
3590	GOSUB 9000:	REM									FUEHRE IHN AUS
3595	IF W=-2 THEN 3660: REM							SPIELER IST PATT
3600	IF W<32765 THEN 3670
3610	PRINT " MATT":	REM								SPIELER IST MATT
3620	GOTO 3670
3630	PRINT " SIE HABEN GEWONNEN"
3640	GOTO 3670
3650	IF T0=0 THEN 3670: REM							KEINE VORAUSRECHNUNG?
3660	PRINT " PATT"
3670	PRINT " WERT=";W;" UNTERSUCHTE STELLUNGEN=";C1
3680	GOTO 2000:	REM									ANFANG SPIELERZUG
3690	REM

3990	REM : ---------------------
4000	REM :   STELLUNGS-AUSGABE
4010	REM	: ---------------------
4020	PRINT
4030	FOR I=9 TO 2 STEP -1 : REM						FUER ALLE REIHEN
4040		PRINT "  "; I-1; "  "; : REM				REIHENKOORDINATEN
4050		FOR J=1 TO 8 : REM							FUER ALLE LINIEN
4060			A1 = B(1*10+J) : REM					AUSZUGEBENDER STEIN
4070			F1 = SGN(A1) : REM						FARBE
4080			A1 = ABS(A1) : REM						FIGURENTYP
4090			PRINT F$(F1+1); A$(A1); "  "; : REM		SCHREIBE FARBE, STEIN
4100		NEXT J
4110		PRINT : PRINT : REM							LEERZEILE
4120	NEXT I
4130	PRINT
4140	PRINT "     ";
4150	FOR J=1 TO 8
4160		PRINT CHR$(64+J);"  "; : REM				LINIENKOORDINATEN
4170	NEXT J
4180	PRINT : PRINT : REM								LEERZEILE
4190	PRINT "  MATERIAL-BILANZ= "; M(T)
4200	PRINT "  EN PASSANT-FELD= "; S(T,0)
4210	PRINT "  ROCHADE-STATUS = "; S(T,1); S(T,2); S(T,3); S(T,4)
4220	PRINT "  AM ZUG		= ";
4230	IF F=1 THEN PRINT "WEISS": GOTO 4250
4240		PRINT "SCHWARZ"
4250	RETURN
4260	REM

4990	REM : --------------------
5000	REM :   STELLUNGSEINGABE
5010	REM : --------------------
5020	T=0 : REM										STELLUNG WIRD BAUMWURZEL
5030	PRINT "  BRETT LOESCHEN (J/N) ";
5040	INPUT E$
5050	IF E$="N" THEN 5130
5060	IF E$<>"J" THEN 5030
5070	FOR I=2 TO 9 : REM								FUER ALLE REIHEN
5080		FOR J=1 TO 8 : REM							FUER ALLE LINIEN
5090			B(I*10+J)=0 : REM						BRETT LOESCHEN
5100		NEXT J
5110	NEXT I
5120	M(0)=0 : REM									MATERIAL AUSGEGLICHEN
5130	PRINT "  WEISS ";
5140	F=1 : REM										FARBE WEISS
5150	GOSUB 5500 : REM								LIES WEISSE STEINE
5160	PRINT "  SCHWARZ ";
5170	F=-1 : REM										FARBE SCHWARZ
5180	GOSUB 5500 : REM								LIES SCHWARZE STEINE
5190	PRINT "  AM ZUG (W/S) ";
5200	INPUT E$
5210	IF E$ = "S" THEN 5240
5220	IF E$<>"W" THEN 5190
5230	F=1 : REM										FARBE WEISS
5240	PRINT "  STATUSAENDERUNGEN (J/N) ";
5250	INPUT E$
5260	IF E$ = "N" THEN 5320
5270	IF E$<> "J" THEN 5240
5280	PRINT "  EP-LINIE ";: INPUT E$
5290	S(0,0)= F * 15 + ASC(E$) -9 : REM				SETZE E.P.-FELD
5300	PRINT "  ROCHADESTATUS ";
5310	INPUT S(0,1), S(0,2), S(0,3), S(0,4) : REM		SETZE ROCHADE-STATUS
5320	GOSUB 4000 : REM								GIB DIE STELLUNG AUS
5330	RETURN
5340	REM

5490	REM : ----------------------------------------
5500	REM :   LIES FIGUREN-AUFSTELLUNG EINER SEITE
5510	REM : ----------------------------------------
5520	INPUT E$
5530	IF E$ = "" THEN 5660 : REM						NUR RETURN-TASTE GEFRUECKT?
5540	IF LEN(E$) <> 3 THEN 5590 : REM					LAENGE DER EINGABE FALSCH
5550	REM : BESTIMMTE FIGURENTYP
5560	FOR I=0 TO 6 : REM								VON LEERFELD BIS KOENIG
5570		IF LEFT$(E$,1) = A$(I) THEN A=I: GOTO 5600
5580	NEXT I
5590	PRINT " FEHLERHAFTE EINGABE": GOTO 5520
5600	REM : BESTIMMTE POSITION DES STEINES
5610	N = ASC( MID$(E$,2,1) ) - 64 + 10 * ( ASC( MID$(E$,3,1) ) - 47)
5620	M(0) = M(0) - SGN( B(N) ) * U( ABS( B(N) ) ) : REM	AENDERE MATERIALWERT
5630	B(N) = F * A : REM								SETZE DEN STEIN AUF DAS BRETT
5640	M(0) = M(0) + F * U(A) : REM					ERHOEHE DIE MATERIALBILANZ
5650	GOTO 5520
5660	RETURN
5670	REM

5990	REM: --------------
6000	REM:   ZUGAUSGABE
6010	REM: --------------
6020	A$ = A$ (ABS( B( Z(Z1,1) ) ) ): REM				ZIEHE FIGUR
6030	FOR J=1 TO 2: REM								FUER VON UND NACH
6040		RE = INT( Z( Z1,J) / 10 ): REM				REIHE
6050		LI = Z(Z1,J) - 10 * RE: REM					LINIE
6060		A$ = A$ + CHR$(64+LI) + CHR$(47 + RE): REM	ALS ZEICHENKETTE
6070	NEXT J
6080	IF Z(Z1,4)=0 THEN 6100
6090	A$ = A$ + "=" + A$( Z(Z1,4) ): REM				BAUERNUMWANDLUNG
6100	PRINT A$
6110	RETURN
6120	REM
6130	REM: -----------------------------

6500	REM:   AUSGABE DER LEGALEN ZUEGE
6510	REM: -----------------------------
6520	GOSUB 7000: REM									ERZEUGE ALLE ZUEGE
6530	IF MT=0 THEN 6560: REM							MATT?
6540	PRINT "  KOENIG KANN GESCHLAGEN WERDEN"
6550	RETURN
6560	PRINT G-G1(T);" PSEUDOLEGALE ZUEGE"
6570	FOR Z1=G1(T) TO G-1
6580		GOSUB 6000: REM								GIB DIE ZUEGE AUS
6590	NEXT Z1
6600	RETURN
6610	REM
6620	REM: ------------------

7000	REM:   ZUGGENERIERUNG
7010	REM: ------------------
7020	MT=0: REM										INITIALISIERUNG: KEIN MATT
7030	G=G1(T): REM									SETZE ANFANG DER ZUGLISTE
7040	FOR V=21 TO 98
7050		A = B(V): REM								FELDINHALT
7060		IF A = 100 THEN 7490: REM					RAND?
7070		IF SGN(A) <> F THEN 7490: REM				FALSCHE FARBE ODER LEER?
7080		A = ABS(A): REM								ART DER FIGUR

7100		REM: BAUERNZUEGE
7110		IF A <> 1 THEN 7360: REM					BAUER?
7120		N = V + (F*10): REM							EIN SCHRITT GERADEAUS
7130		IF B(N) <> 0 THEN 7210: REM					NUR AUF LEERES FELD
7140		GOSUB 7900: REM								NOTIERE DEN ZUG
7150		IF ( INT(V / 10) - 5.5) * F <> -2.5 THEN 7210: REM	AUF 2. REIHE?
7160		N = V + (F * 20): REM						DANN DOPPELSCHRITT
7170		IF B(N) <> 0 THEN 7210: REM					NUR AUF LEERES FELD
7180		GOSUB 8500: REM								NOTIERE DEN ZUG
7190		Z( G-1,6 ) = ( V+N ) * 0.5: REM				SETZE EP-FELD
7200		REM
7210		REM: BAUERN-SCHLAGZUEGE
7220		FOR I=1 TO 2: REM							FUER BEIDE RICHTUNGEN
7230			N = V + O(F+I): REM						SCHLAGFELD
7240			IF B(N)=100 THEN 7330: REM				RAND?
7250			IF N = S(T,0) THEN 7300: REM			SCHLAGFELD IST EP-FELD?
7260			IF SGN( B(N) ) <> - F THEN 7330: REM	NUR GEGNERISCHE STEINE
7270			IF B(N) = -F * 6 THEN MT=1: GOTO 7810: REM KOENIG GESCHLAGEN?
7280			GOSUB 7900: REM							NOTIERE SCHLAGZUG
7290			GOTO 7330
7300			GOSUB 8500: REM							NOTIERE EP-SCHLAGZUG
7310			Z(G-1,3) = 1: REM						BAUER GESCHLAGEN
7320			Z(G-1,6) = N - 10 * F: REM				POSITION DES BAUERN
7330		NEXT I: REM									ANDERE SCHLAGRICHTUNG
7340		GOTO 7490
7350		REM
7360		REM: FIGUREN-ZUEGE
7370		FOR I=OA(A) TO OE(A): REM					FUER ALLE RICHTUNGEN
7380			LA = L(A): REM							1 FUER LANGSCHRITTLER
7390			N = V: REM								INITIALISIERE ZIELFELD
7400			N = N+O(I): REM							EIN SCHRITT WEITER
7410			IF B(N) = 100 THEN 7480: REM			RAND?
7420			IF SGN( B(N) ) = F THEN 7480: REM		EIGENE FIGUR?
7430			IF B(N)=0 THEN 7460: REM				LEERFELD?
7440			IF B(N) = -F * 6 THEN MT=1: GOTO 7810: REM KOENIG GESCHLAGEN?
7450			LA=0: REM								SCHLAGZUG: BEENDE DIESE RICHTUNG
7460			GOSUB 8500: REM							NOTIERE DEN ZUG
7470			IF LA=1 THEN 7400: REM					DIESE RICHTUNG FORTSETZEN?
7480		NEXT I: REM									NAECHSTE RICHTUNG
7490	NEXT V: REM										NAECHSTES VON-FELD
7500	REM
7510	REM: ROCHADEN
7520	FOR I=F+2 TO F+3: REM							K- UND D-SEITE
7530		IF S(T,I) = 0 THEN 7790: REM				ROCHADE ILLEGAL?
7540		FOR J=R1(I) TO R2(I): REM					FELDER ZWISCHEN KOENIG UND TURM
7550			IF B(J) <> 0 THEN 7790: REM				DUERFEN NICHT BESETZT SEIN
7560		NEXT J
7570		REM: TEST AUF BEDROHUNG VON ZWISCHENFELDERN
7580		FOR J=R3(I) TO R4(I): REM					FUER BESTIMMTE FELDER
7590			FOR K=0 TO 7: REM						FUER ALLE GERADEN UND DIAGONALEN
7600				N=J: REM							BEGINNE MIT DEM ZWISCHENFELD
7610				N = N + O(K): REM					GEHE EINEN SCHRITT WEITER
7620				IF B(N) = 100 THEN 7700: REM		RAND?
7630				IF SGN( B(N) )=F THEN 7700: REM		EIGENE FIGUR?
7640				IF B(N) = 0 THEN 7610: REM			LEERFELD?
7650				IF OA( ABS(B(N) ) ) > K THEN 7700: REM	GEGNERISCHER STEIN MIT
7660				IF OE( ABS(B(N) ) ) < K THEN 7700: REM	GLEICHER SCHLAGRICHTUNG
7670				IF N=J+O(K) THEN 7790: REM			ZWISCHENFELD J BEDROHT
7680				IF L( ABS( B(N) ) ) <> 1 THEN 7700: REM	LANGSCHRITTFELDER?
7690				GOTO 7790: REM						ZWISCHENFELD J BEDROHT
7700			NEXT K: REM								NAECHSTE RICHTUNG
7710			FOR K=8 TO 15: REM						PRUEFE BEDROHUNG
7720				IF B( J+O(K) ) = -F * 4 THEN 7790: REM	DURCH SPRINGER
7730			NEXT K: REM								NAECHSTE SPRINGER-RICHTUNG
7740		NEXT J: REM									NAECHSTES ZWISCHENFELD
7750		V = R5(I): REM								KOENIG VON-FELD
7760		N = R6(I): REM								KOENIG NACH-FELD
7770		GOSUB 8500: REM								NOTIERE DEN KOEGNIGSZUG
7780		Z( G-1,5 ) = I: REM							NOTIERE ROCHADE
7790	NEXT I: REM										AENDERE ROCHADE
7800	G1(T+1)=G: REM									MERKE ENDE DER ZUGLISTE
7810	RETURN
7820	REM

7890	REM: ---------------------
7900	REM:   NOTIERE BAUERNZUG
7910	REM: ---------------------
7920	IF ( INT(N/10) -5.5) * F <> 3.5 THEN GOSUB 8500: GOTO 7980
7930	REM: ZUG AUF DIE 8. REIHE
7940	FOR I2=5 TO 2 STEP -1
7950		GOSUB 8500: REM								GENERIERE UMWANDLUNGSZUEGE
7960		Z( G-1,4 ) = I2: REM						SETZE UMWANDLUNGS-FIGUR
7970	NEXT I2
7980	RETURN
7990	REM

8490	REM: ---------------------------------------------
8500	REM:   LEGE GENERIERTEN ZUG AUF DEM ZUGSTABEL AB
8510	REM: ---------------------------------------------
8520	Z(G,1) = V: REM									VON-FELD
8530	Z(G,2) = N: REM									NACH-FELD
8540	Z(G,3) = ABS( B(N) ): REM						GESCHLAGENE FIGUR
8550	FOR I1 = 4 TO 6
8560		Z(G,I1)=0
8570	NEXT I1
8580	IF G=200 THEN 8600
8590	G = G+1: REM									ERHOEHE STAPELGRENZE
8600	RETURN
8610	REM

8790	REM: ---------------------------
8800	REM:   INITIALISIERE SPIELBAUM
8810	REM: ---------------------------
8820	IF T=0 THEN 8880: REM							NUR WENN TIEFE > 0
8830	FOR I=0 TO 4
8840		S(0,I) = S(1,I): REM						INITIALISIERE STATUS
8850	NEXT I
8860	M(0)=M(1): REM									INITIALISIERE MATERIAL
8870	T=0: REM										SETZE TIEFE = 0
8880	RETURN
8890	REM

8990	REM: ------------------
9000	REM:   ZUG AUSFUEHREN
9010	REM: ------------------
9020	T=T+1: REM										EINE STUFE TIEFER IM BAUM
9030	S(T,0)= 0: REM									LOESCHE EP-STATUS
9040	FOR I=1 TO 4
9050		S(T,I) = S(T-1, I): REM						RETTE ROCHADE-STATUS
9060	NEXT I
9070	M(T) = M(T-1): REM								RETTE MATERIAL-BILANZ
9080	V = Z(Z1,1): REM								VON-FELD
9090	N = Z(Z1,2): REM								NACH-FELD
9100	IF Z(Z1,6)=0 THEN 9160: REM						ENPASSANT?
9110	IF Z(Z1,3)=0 THEN 9140: REM						SCHLAGZUG?
9120	B( Z(Z1,6) )=0: REM								SCHLAGE ENPASSANT
9130	GOTO 9430
9140	S(T,0) = Z( Z1,6 ): REM							B-DOPPELSCHRITT: SETZE EP-STATUS
9150	GOTO 9430
9160	REM: -- SETZE ROCHADE-STATUS --
9170	IF V <> R5(F+2) THEN 9210: REM					ZUG VON KOENIGSFELD?
9180	S( T,F+2 ) = 0: REM								0-0 ILLEGAL
9190	S(T,F+3)=0: REM									0-0-0 ILLEGAL
9200	GOTO 9360
9210	IF V <> R7(F+2) THEN 9240: REM					ZUG VON H-TURMFELD?
9220	S(T,F+2) = 0: REM								EIGENE 0-0 ILLEGAL
9230	GOTO 9260
9240	IF V <> R7(F+3) THEN 9260: REM					ZUG VON A-TURMFELD?
9250	S(T,F+3)=0: REM									EIGENE 0-0-0 ILLEGAL
9260	IF N <> R7(-F+2) THEN 9290: REM					ZUG NACH H-TURMFELD?
9270	S(T,-F+2)=0: REM								GEGNERISCHE 0-0 ILLEGAL
9280	GOTO 9310
9290	IF N <> R7(-F+3) THEN 9310: REM					ZUG NACH A-TURMFELD?
9300	S(T,-F+3)=0: REM								GEGNERISCHE 0-0-0 ILLEGAL
9310	REM: -- BAUERN-UMWANDLUNG --
9320	IF Z(Z1,4)=0 THEN 9430
9330	B(V)=Z(Z1,4)*F:		REM				WANDLE DEN BAUERN UM
9340	M(T)=M(T)+F*(U(Z(Z1,4))-100): REM			MATERIALGEWINN
9350	GOTO 9430:		REM				ROCHADE UEBERSPRINGEN
9360	REM: -- ROCHADE --
9370	RO=Z(Z1,5):		REM				ART DER ROCHADE
9380	IF RO=0 THEN 9430:	REM				KEINE ROCHADE?
9390	VO = R7(RO):		REM				TURM VON-FELD
9400	B(VO)=0:		REM				LOESCHE TURM
9410	NA = (R5(RO)+R6(RO))*0.5:	REM				TURM NACH-FELD
9420	B(NA)=2*F:		REM				SETZE TURM
9430	REM: -- SETZE FIGUR --
9440	B(N) = B(V) : REM								NEUES FELD WIRD ALTES FELD
9450	B(V) = 0 : REM									LOESCHE ALTES FELD
9460	M(T)=M(T)+F*U(Z(Z1,3)):	REM				KORRIGIERE MATERIALBILANZ
9470	F = -F: REM										FARBWECHSEL
9480	RETURN
9490	REM

9590	REM: ----------------------
9600	REM:   ZUG ZURUECKNEHMEN
9610	REM: ----------------------
9620	F=-F:			REM				FARBWECHSEL
9630	V=Z(Z1,1):		REM				VON-FELD
9640	N=Z(Z1,2):		REM				NACH-FELD
9650	IF Z(Z1,6)=0 THEN 9710:	REM				ENPASSANT?
9660	IF Z(Z1,3)=0 THEN 9820:	REM				SCHLAGZUG?
9670	B(Z(Z1,6))=-F:		REM				RESTAURIERE EP-BAUERN
9680	B(V)=F:			REM				VON-FELD = BAUER
9690	B(N)=0:			REM				NACHFELD = LEER
9700	GOTO 9840:		REM				ENDE
9710	REM: -- ROCHADE -- 
9720	RO=Z(Z1,5):		REM				ART DER ROCHADE
9730	IF RO=0 THEN 9790:	REM				KEINE ROCHADE?
9740	NA=(R5(RO)+R6(RO))*0.5:	REM				TURM NACH-FELD
9750	B(NA)=0:		REM				LOESCHE NACH-FELD
9760	VO=R7(RO):		REM				TURM VON-FELD
9770	B(VO)=2*F:		REM				SETZE TURM ZURUECK
9780	GOTO 9820:		REM				KOENIG ZURUECKSETZEN
9790	REM: -- BAUERN-UMWANDLUNG --
9800	IF Z(Z1,4)=0 THEN 9820			
9810	B(N)=F:			REM				VERWANDLE IN BAUERN ZURUECK
9820	B(V)=B(N):		REM				NIMM DEN ZUG ZURUECK
9830	B(N)=-F*Z(Z1,3):	REM				RESTAURIERE GESCHLAGENEN STEIN
9840	T=T-1:			REM				EINE STUFE HOEHER IM SPIELBAUM
9850	RETURN
9860	REM

9990	REM: ---------------------------
10000	REM:    ALPHA-BETA-BAUMSUCHE
10010	REM: ---------------------------
10020	Z2=0:		REM									INITIALISIERE BESTER ZUG
10030	C1=0:		REM									INITIALISIERE KNOTENZAEHLER
10040	W(0)=-32767:	REM								SETZE ALPHA
10050	W(1)=-32767:	REM								SETZE BETA
10060	REM
10070	IF T<T0 THEN 10110: REM							MAXIMALE TIEFE ERREICHT?
10080	GOSUB 12000:	REM								BEWERTE STELLUNG
10090	W(T+2)=W*F:	REM									AUS DER SICHT DER SEITE F
10100	GOTO 10380
10110	GOSUB 7000:	REM									GENERIERE ALLE ZUEGE
10120	IF MT=0 THEN 10150: REM							KOENIG KANN GESCHLAGEN WERDEN?
10130	W(T+2)=32767-T:	REM								SETZE MATTWERT
10140	GOTO 10380
10150	IF G>G1(T) THEN 10190: REM						KEIN PSEUDO-LEGALER ZUG?
10160	W(T+2)=0:	REM									SETZE REMISWERT
10170	GOTO 10380
10180	REM
10190	P(T)=G1(T):	REM									NIMM ERSTEN ZUG
10200	W(T+2)=W(T):	REM								INITIALISIERE STELLUNGSWERT
10210	REM
10220	Z1=P(T):	REM									ZU UNTERSUCHENDER ZUG
10230	IF T<>0 THEN 10250: REM							AUF EBENE 0 DEN GERADE
10240	GOSUB 6000:	REM									BETRACHTETEN ZUG AUSGEBEN
10250	GOSUB 9000:	REM									ZUG AUSFUEHREN
10260	C1=C1+1:	REM									EIN KNOTEN MEHR
10270	GOTO 10070:	REM									UND WIEDER VON VORN
10280	REM
10290	IF -W(T+3)<=W(T+2) THEN 10350: REM				MINIMAXING
10300	W(T+2)=-W(T+3):	REM								MERKE BESTEN WERT
10310	IF T>0 THEN 10340: REM							AUF EBENE 0
10320	PRINT "	NEUER BESTER ZUG"
10340	IF W(T+2)>=-W(T+1) THEN 10380: REM				ALPHA-BETA-SCHNITT?
10350	P(T)=P(T)+1:	REM								NIMM NAECHSTEN ZUG,
10360	IF P(T)>G1(T+1) THEN 10220: REM					FALLS ES NOCH EINEN GIBT
10370	REM
10380	IF W(T+2)>-32000 THEN 10386: REM				MATTWERT?
10381	F=-F:		REM									FARBWECHSEL
10382	GOSUB 7000:	REM									AUFRUF ZUGGENERATOR
10383	F=-F:		REM									FARBWECHSEL
10384	IF MT=1 THEN 10386: REM							KOENIG KANN GESCHLAGEN WERDEN?
10385	W(T+2)=1+T:	REM									SETZE PATTWERT
10386	IF T=0 THEN 10430: REM							SPIELBAUM-EBENE 0?
10390	Z1=P(T-1):	REM									DEN LETZTEN ZUG
10400	GOSUB 9600:	REM									ZURUECKNEHMEN
10410	GOSUB 10290:	REM								UND WERT HOCHREICHEN
10420	REM
10430	W=W(2):		REM									WERT DES BESTEN ZUGES
10440	RETURN
10450	REM

11990	REM: -----------------------
12000	REM:   BEWERTUNGSFUNKTION
12010	REM: -----------------------
12020	REM: INITIALISIERUNGEN

12030	M=0:		REM									GESAMTMATERIAL
12040	W=0:		REM									GESAMTWERT
12050	FOR I=0 TO 2
12060	T7(I)=0:	REM									TUERME AUF DER 7. REIHE
12070	BA(I)=0:	REM									BAUERN JE SEITE
12080	FOR J=0 TO 9
12090	BL(I,J)=0:	REM									BAUERN JE SEITE UND LINIE
12100	TL(I,J)=0:	REM									TUERME JE SEITE UND LINIE
12110	NEXT J
12120	NEXT I
12130	REM: MERKMALSGEWINNUNG UND ERSTE BEWERTUNGEN
12140	FOR I=2 TO 9:		REM							FUER ALLE REIHEN
12150	FOR J=1 TO 8:		REM							UND LINIEN
12160	V=I*10+J:			REM							FELDNUMMER
12170	A=ABS(B(V)):		REM							AKTUELLER FELDINHALT
12180	IF A=0 THEN 12420:	REM							FELD LEER?
12190	FA=SGN(B(V)):		REM							FARBE DER FIGUR
12200	M=M+U(A):		REM								ZAEHLE GESAMTMATERIAL
12210	ON A GOTO 12220,12270,12320,12360,12420,12390

12220	REM: BAUERN
12230	BA(FA+1)=BA(FA+1)+1:	REM						ZAEHLE BAUERN JEDER SEITE
12240	BL(FA+1,J)=BL(FA+1,J)+1:REM						ZAEHLE BAUERN JEDER LINIE
12250	W=W+FA*BV(J)*(3.5-FA*(5.5-I)): REM				BAUERNVORMARSCH
12260	GOTO 12420

12270	REM: TUERME
12280	IF (I-5.5)*FA<>2.5 THEN 12300: REM				TURM AUF 7. REIHE?
12290	T7(FA+1)=T7(FA+1)+1:	REM						ZAEHLE TUERME AUF 7. REIHE
12300	TL(FA+1,J)=TL(FA+1,J):	REM						ZAEHLE TUERME PRO LINIE
12310	GOTO 12420

12320	REM: LAEUFER
12330	IF(I-5.5)*FA<>-3.5 THEN 12420: REM				LAUEFER AUF GRUNDREIHE?
12340	W=W-FA*10
12350	GOTO 12420

12360	REM: SPRINGER
12370	W=W+FA*ZT(I,J):		REM							SPRINGER-ZENTRALISIERUNG
12380	GOTO 12420

12390	REM: KOENIG
12400	KR(FA+1)=I:		REM								MERKE KOENIGSREIHE
12410	KL(FA+1)=J:		REM								MERKE KOENIGSLINIE
12420	NEXT J
12430	NEXT I
12440	REM
12450	REM: MATERIAL
12460	FA=SGN(M(T)):		REM							FARBE DER GEWINNENDEN SEITE
12470	IF FA=0 THEN 12500:	REM							MATERIAL AUSGEGLICHEN?
12480	W=W+M(T)+INT(M(T*BA(FA+1)/(BA(FA+1)+1)*M0-M)*0.0001)
12490	REM
12500	REM: KOENIGSSTELLUNG
12510	W=W+INT(ZT(KR(2),KL(2))*(43000-M+M(T))*0.001):REM	WEISS
12520	W=W+INT(ZT(KR(0),KL(0))*(43000-M+M(T))*0.001):REM	SCHWARZ
12530	REM
12540	REM: TUERME AUF DER SIEBTEN REIHE
12550	W=W+T7(2)*T7(2)*12:	REM							WEISSE TUERME
12560	W=W+T7(0)*T7(0)*12:	REM							SCHWARZE TUERME
12570	REM
12580	REM: BAUERNSTRUKTUR UND TURMLINIEN
12590	FOR I=1 TO 8:		REM							LINIEN
12600	FOR J=0 TO 2:		REM							SEITEN
12610	FA=J-1:			REM								FARBE
12620	IF FA=0 THEN 12880:	REM							KEINE GUELTIGE FARBE
12630	IF BL(J,I)=0 THEN 12830:REM						KEIN EIG. BAUER AUF DER LINIE
12640	W=W-FA*(BL(J,I)-1)*8:	REM						DOPPELBAUERN-MALUS
12650	IS=0:			REM								NOCH KEIN ISOLANI FESTGESTELLT
12660	IF BL(J,I-1)>0 THEN 12720: REM					LINKSBESCHUETZT?
12670	IF BL(J,I+1)>0 THEN 12720: REM					RECHTSBESCHUETZT?
12680	REM: ISOLIERTER BAUER
12690	W=W-FA*20:		REM								ISOLANI-MALUS
12700	IS=1:			REM								MERKE ISOLANI
12710	IF BL(2-J,I)>0 THEN 12880: REM					BAUER MASKIERT?
12720	REM: HALBOFFENE LINIE
12730	W=W-FA*TL(2-J,I)*TL(2-J,I)*3: REM				MALUS FUER GEGN. TUERME
12740	IF BL(2-J,I-1)>0 THEN 12790: REM				LINKSBEWACHT?
12750	IF BL(2-J,I+1)>0 THEN 12790: REM				RECHTSBEWACHT?
12760	REM: FREIBAUER
12770	W=W+FA*18:		REM								FRAIBAUERN-BONUS
12780	GOTO 12890:		REM								NAECHSTE LINIE
12790	REM: BEWACHTER BAUER
12800	IF IS=0 THEN 12890:	REM							KEIN ISOLIERTER BAUER?
12810	W=W-FA*10:		REM								ZUSAETZLICHER MALUS
12820	GOTO 12890:		REM								NAECHSTE LINIE
12830	IF BL(2-J,I)>0 THEN 12880: REM					GEGN. BAUER AUF DER LINIE
12840	REM: OFFENE LINIE
12850	W=W+TL(2,I)*TL(2,I)*8:	REM						TURMBONUS FUER WEISS
12860	W=W-TL(0,I)*TL(0,I)*8:	REM						TURMBONUS FUER SCHWARZ
12870	GOTO 12890:		REM								NAECHSTE LINIE
12880	NEXT J:			REM								NAECHSTE FARBE
12890	NEXT I:			REM								NAECHSTE LINIE
12900	RETURN

15000	END : REM										PROGRAMMENDE

This snippet took 0.07 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).