C 64
Anwendung des Monats

Schachmeister

Viele Schachspieler zeichnen ihre Partien auf und überprüfen sie hinterher. Oder sie spielen berühmte Partien nach. Der C64 übernimmt nicht nur die Rolle des Protokollanten — er splelt mit Hilfe dieses Programms gespeicherte Partien mit guter grafischer Darstellung nach.

Nach dem Start dös Programms muß man einen Augenblick warten, bis der Computer die neuen Multicolor-Zeichen definiert hat und diverse Felder und Listen aufgestellt hat (zirka 20 Sekunden). Darauf kann man eine der gespeicherten Partien auswählen und das Schachbrett baut sich auf.

Am rechten Rand werden die Namen der Spieler, das Jahr, die Zugnummer und der Zug sowie verschiedene Meldungen wie »Schach«, »Matt«, »Rochade« … ausgegeben. Das Schachbrett nimmt zirka % des Bildschirms ein.

Durch Drücken der F7-Taste nach einem Zug wird das Bild bis zu einem erneuten Tastendruck »eingefroren«. Durch Drücken einer anderen Taste nach einem Zug wird der Ablauf beschleunigt. Durch anhaltendes Drücken der Space-Taste kann man so eine Art »Blitzschach« erreichen. Nach Spielende führt ein Tastendruck wieder zum Auswahlmenü.

Eingeben eigener Schachpartien:

  1. Zuerst werden die Namen der Spieler und das Jahr eingegeben: 10000 DATA SPIELER 1, SPIELER 2, 1984.

  2. Die Eingabe der Züge:

    Beispiel für einen normalen Zug: 10010 DATA E2E4, E7E5, G1F3 …
    Wenn eine Figur eine gegnerische schlägt, braucht man das nicht anzugeben; der Computer erkennt das von selbst.

  3. Sonderregeln:
    • Aufgabe eines Spielers:

      10020 DATA …,SA (Schwarz gibt auf) 10020 DATA …, WA (Weiß gibt auf)

    • Rochaden:

      10020 DATA …, KR (kurze Rochade) 10020 DATA …, LR (lange Rochade) Es braucht nicht angegeben zu werden, welcher der beiden Spieler rochiert.

    • Schach, Matt, Remis:

      Um dem Computer einen dieser drei Zustände anzuzeigen, muß ein S (Schach), ein M (Matt) oder ein R (Remis) dem jeweiligen Zug angehängt werden: 10020 DATA …, D6E6S (Schach wird geboten) 10030 DATA …, F6E6M (Schachmatt) 10020 DATA …, E5E6R (Remis)

    • Dametausch:

      Wenn ein Bauer in eine Dame umgetauscht wird, so ist dem jeweiligen Zug ein D anzufügen: 10020 DATA …, A7A8D (weißer Bauer wird in Dame getauscht)

Wichtig:
Nach Ende jeder Partie muß unbedingt ein E angefügt werden, damit der Computer eine Liste der Partien aufstellt. Nach der letzten Partie ist statt dem E ein X anzufügen: 19999 DATA …,F6E6M,E 19999 DATA …,F6E6M,X

Die Programmlänge ohne gespeicherte Partien beträgt zirka 7,5 KByte pro gespeicherter Partie werden zusätzlich zirka 0,5 KByte benötigt.

Da der Bildschirmspeicher verschoben wird, muß nach einem RUN STOP-RESTORE blind RUN eingetippt werden, um das Programm wieder auflisten zu lassen.

(Thomas Behrend/rg)
A$-Feld : Speicherung der sechs Schachfiguren
A(x,y)-Feld : Spielfeld (Figuren)
B(x,y)-Feld : Spielbrett
P-Feld : Zähler zum Überspringen der DATA-Zeilen bis zur gewählten Partie
P$-Feld : Namen der Spieler (weiß)
P1$-Feld : Namen der Spieler (schwarz)
P : Anzahl der gespeicherten Partien
DA : Zähler zum Überspringen der ersten DATA-Zeilen
AW : Flag für verschiedene Spielzustände (Matt, Remis…)

Wichtige Programmzeilen und Programmteile:

150- 190 : MC-Programm zur Beschleunigung der Zeichendefinition
200- 260 : Zeichendefinition
300- 860 : Zeichen-DATA (Multicolor)
900-1050 : Felder aufstellen und Variablen definieren
1100,1110 : Multicolor-Modus einschalten
1170-1250 : Partienanfänge einlesen und Tabelle aufstellen
1290-1350 : Auswahlmenü
1390-1660 : Bildschirmaufbau
1730-1910 : Hauptprogramm (normaler Zug)
1950-2410 : Besondere Regeln (Rochade, Dametausch, Matt, Remis…)
2470-2490 : Einzelnes Feld löschen
2530-2580 : Figur drucken
2620 : Koordinaten errechnen
2660-2720 : Zeitschlaufe mit Unterbrechung und Verkürzung
2760-2800 : Grundstellung der Figuren
2840-2850 : Bildschirmpositionierung
2890-2910 : Spielende
10000- : DATAs für die Partien

Alle REM-Zeilen dienen nur zur Anschaulichkeit und können entfernt werden.

Programmbeschreibung zum »Schachmeister«
10 rem ********************************
20 rem *      >> schachmeister <<     *
30 rem *                              *
40 rem * thomas behrend               *
50 rem * in der wanne 16    7900 ulm  *
60 rem *     (8.1984)                 *
70 rem ********************************
80 rem
90 rem  -- alle rem-zeilen koennen  --
100 rem -- weggelassen werden       --
110 rem
120 rem -- neue zeichen --
130 rem
140 poke53281,6:poke53280,1:print"{clr}"chr$(5)
150 data120,169,51,133,1,169,0,133,95,133,90,133,88,169,208,133,96,169,240,133
160 data89,169,224,133,91,32,191,163,169,55,133,1,88,96
170 rem -- mc-programm --
180 j=4097:fori=832to865:reada:j=j-a:pokei,a:next
190 ifj<>0thenprint"data-fehler in zeile 15-20":stop
200 sys832:poke850,160:sys832:poke56576,peek(56576)and252:poke53272,8
210 poke648,192:print"{down}"tab(5)"> schachmeister <"
220 print"{down}{down}"tab(5)"bitte einen moment warten..."
230 ad=57344:fori=64to91:b=ad+i*8:forj=0to7:readc:pokeb+j,c:next:next
240 fori=192to219:b=ad+i*8:forj=0to7:readc:pokeb+j,c:next:next
250 i=175:b=ad+i*8:forj=0to7:readc:pokeb+j,c:next
260 poke56,130
270 rem
280 rem -- data fuer schachfiguren --
290 rem
300 data0,0,60,60,255,255,60,60
310 data0,0,0,0,0,0,0,0
320 data0,0,0,0,60,255,255,255
330 data255,255,60,60,60,60,60,60
340 data0,0,3,3,15,10,0,0
350 data60,255,255,255,255,170,0,0
360 data0,0,192,192,240,160,0,0
370 data0,0,3,3,3,3,3,3
380 data0,0,60,60,60,255,255,255
390 data0,0,192,192,192,192,192,192
400 data3,0,0,0,0,0,0,0
410 data255,60,60,60,60,60,60,60
420 data255,255,255,255,255,255,255,255
430 data192,0,0,0,0,0,0,0
440 data0,0,60,60,240,195,255,255
450 data255,255,255,255,255,170,0,0
460 data0,0,0,0,192,192,0,0
470 data0,0,0,0,0,3,3,15
480 data0,48,48,63,255,207,207,255
490 data0,0,0,0,192,192,192,192
500 data63,63,63,60,0,0,0,3
510 data255,207,15,63,63,255,255,255
520 data192,192,0,0,0,0,0,192
530 data3,3,3,3,15,10,0,0
540 data192,240,240,240,240,160,0,0
550 data0,0,12,15,3,3,3,3
560 data0,0,48,240,192,192,192,192
570 data0,0,0,0,3,3,0,0
580 data85,85,125,125,255,255,125,125
590 data85,85,85,85,85,85,85,85
600 data85,85,85,85,125,255,255,255
610 data255,255,125,125,125,125,125,125
620 data85,85,87,87,95,90,85,85
630 data125,255,255,255,255,170,85,85
640 data85,85,213,213,245,165,85,85
650 data85,85,87,87,87,87,87,87
660 data85,85,125,125,125,255,255,255
670 data85,85,213,213,213,213,213,213
680 data87,85,85,85,85,85,85,85
690 data255,125,125,125,125,125,125,125
700 data255,255,255,255,255,255,255,255
710 data213,85,85,85,85,85,85,85
720 data85,85,125,125,245,215,255,255
730 data255,255,255,255,255,170,85,85
740 data85,85,85,85,213,213,85,85
750 data85,85,85,85,85,87,87,95
760 data85,117,117,127,255,223,223,255
770 data85,85,85,85,213,213,213,213
780 data127,127,127,125,85,85,85,87
790 data255,223,95,127,127,255,255,255
800 data213,213,85,85,85,85,85,213
810 data87,87,87,87,95,90,85,85
820 data213,245,245,245,245,165,85,85
830 data85,85,93,95,87,87,87,87
840 data85,85,117,245,213,213,213,213
850 data85,85,85,85,87,87,85,85
860 data126,189,215,231,231,215,189,126
870 rem
880 rem -- variablen und felder --
890 rem
900 b$(1)="abaacadef":rem bauer
910 b$(2)="ghijlmdof":rem turm
920 b$(3)="anaakadef":rem laeufer
930 b$(4)="qrstuvwox":rem pferd
940 b$(5)="yhzacadef":rem dame
950 b$(6)="[@pjcmdef":rem koenig
960 fori=1to6:forj=0to2:fork=1to3
970 a$=mid$(b$(i),j*3+k,1):a$(i)=a$(i)+chr$(asc(a$)+128):next
980 a$(i)=a$(i)+"{down}{left}{left}{left}":next:next
990 dimb(8,8)
1000 fori=7to1step-2:forj=1to7step2:b(i,j)=1:next:next
1010 fori=8to2step-2:forj=2to8step2:b(i,j)=1:next:next
1020 dima(8,8)
1030 gosub2760
1040 z1$="{rvon}{cyn} {red}             "
1050 :
1060 rem
1070 rem -- multicolor-modus --
1080 rem -- einschalten      --
1090 rem
1100 poke53281,6:poke53282,7:poke53283,5
1110 poke53270,peek(53270)or16
1120 rem
1130 rem -- liste der partien --
1140 rem -- aufstellen        --
1150 rem
1160 data-1
1170 restore:da=0
1180 da=da+1:reada:ifa=-1then1200
1190 goto1180
1200 dimp(20),p$(20),p1$(20),ja$(20):p=0:d=0
1210 p=p+1:readp$(p),p1$(p),ja$(p):d=d+3
1220 reada$:d=d+1:ifa$="e"ora$="x"then1240
1230 goto1220
1240 ifa$="x"then1290
1250 p(p)=d:goto1210
1260 rem
1270 rem -- auswahlmenue --
1280 rem
1290 restore:fori=1toda:reada:next
1300 printchr$(5)"{clr}{down}   - auswahl -"
1310 print:print
1320 fori=1top:printi;tab(5)p$(i)tab(16)p1$(i),ja$(i):next
1330 poke198,0:input"{down}{down}";w:ifw<1orw>pthen1330
1340 print"{clr}":ifw=1then1390
1350 fori=1top(w-1):reada$:next
1360 rem
1370 rem -- spielbrett --
1380 rem
1390 fori=1to24:printchr$(159)tab(0)"{rvon} "tab(25)z1$:next
1400 printchr$(5)"{home}";
1410 fory=8to1step-1:x=1:gosub2840:print"{down}{left}{left}"y:x=8:gosub2840
1420 print"{down}{rght}{rght}"y:next
1430 fory=8to1step-1:forx=1to8
1440 gosub2470
1450 next:next
1460 print"{home}"
1470 rem
1480 rem -- anfangsstellung --
1490 rem
1500 fory=7to8:forx=1to8
1510 gosub2530:next:next
1520 fory=1to2:forx=1to8:gosub2530:next:next
1530 printchr$(159)"{home}":printtab(27)"{rvon} spieler 1 "
1540 printtab(27)"{rvon}           {rvof}"
1550 printtab(27)"{up}{rvon}           "
1560 poke214,18:print:printtab(27)chr$(30)"{rvon} spieler 2 "
1570 printtab(27)"{rvon}           {rvof}"
1580 printtab(27)"{up}{rvon}           "
1590 poke214,5:print:printtab(27)chr$(5)"{rvon}zug:{rvof}  1"
1600 poke214,7:print:printtab(28)chr$(158)"{rvon}       {rvof}"
1610 poke214,9:print:printtab(27)chr$(5)"{rvon}          "
1620 printtab(27)"{rvon}          "
1630 printtab(27)"{up}{rvon}          "
1640 reada$:a$=left$(a$,9):poke214,20:print:printtab(28)"{rvon}"a$
1650 reada$:a$=left$(a$,9):poke214,2:print:printtab(28)"{rvon}"a$
1660 reada$:poke214,15:print:printtab(28)a$
1670 zu=1:z1=-1:aw=0
1680 rem
1690 rem ************************
1700 rem *  -- hauptprogramm -- *
1710 rem ************************
1720 rem
1730 print"{home}":z1=z1+1:ifz1=2thenz1=0:zu=zu+1:poke214,5:print:printtab(32)chr$(5)zu
1740 reada$:iflen(a$)<>4then1950
1750 rem
1760 rem -- normaler zug --
1770 rem
1780 b$=left$(a$,2):gosub2620:x=x2:y=y2
1790 b2$=b$
1800 b$=right$(a$,2):gosub2620
1810 o$="-":ifa(x2,y2)<>0theno$="/"
1820 a$=b2$+o$+b$
1830 poke214,7:print:printtab(29)chr$(5)"{rvon}"a$
1840 fori=1to4:gosub2530:gosub2470:next
1850 a1=a(x,y):a(x,y)=0:a(x2,y2)=a1
1860 x=x2:y=y2:fori=1to4:gosub2470:gosub2530:next
1870 ifaw=3thenaw=0:return
1880 ifaw=2then2890:rem-matt oder remis-
1890 gosub2660
1900 ifaw=1thenaw=0:poke214,11:print:printtab(27)chr$(5)"{rvon}        "
1910 goto1730
1920 rem
1930 rem -- besondere situationen --
1940 rem
1950 ifa$="e"then2890
1960 ifa$="sa"then2100
1970 ifa$="wa"then2120
1980 ifa$="kr"then2190
1990 ifa$="lr"then2250
2000 printchr$(5)
2010 b$=right$(a$,1):a$=left$(a$,4)
2020 ifb$="s"thenaw=1:poke214,11:print:printtab(27)"{rvon}schach !":goto1780
2030 ifb$="m"thenaw=2:poke214,11:print:printtab(27)"{rvon} matt !":goto1780
2040 ifb$="r"thenaw=2:poke214,11:print:printtab(27)"{rvon} remis !":goto1780
2050 ifb$="d"then2340
2060 print"{clr}datafehler !!!":stop
2070 rem
2080 rem -- aufgeben --
2090 rem
2100 a$="{rvon}schwarz"
2110 goto2130
2120 a$="{rvon}weiss"
2130 poke214,9:print:printtab(29)a$
2140 printtab(27)"{rvon}gibt auf !"
2150 goto2890
2160 rem
2170 rem -- kurze rochade --
2180 rem
2190 y=1:t=0:ifz1=1theny=8:t=6
2200 a(5,y)=0:a(8,y)=0:a(6,y)=8-t:a(7,y)=12-t:x=5:gosub2470:x=8:gosub2470
2210 x=6:gosub2530:x=7:gosub2530:goto2280
2220 rem
2230 rem -- lange rochade --
2240 rem
2250 y=1:t=0:ifz1=1theny=8:t=6
2260 a(1,y)=0:a(5,y)=0:a(3,y)=12-t:a(4,y)=8-t
2270 x=1:gosub2470:x=5:gosub2470:x=3:gosub2530:x=4:gosub2530
2280 poke214,11:print:printtab(29)chr$(5)"{rvon}rochade"
2290 gosub2660
2300 poke214,11:print:printtab(29)"{rvon}       ":goto1730
2310 rem
2320 rem -- dametausch --
2330 rem
2340 aw=3:gosub1780
2350 ify2=8thena(x2,8)=11:goto2370
2360 a(x2,1)=5
2370 x=x2:y=y2:gosub2530
2380 poke214,10:print:printtab(29)chr$(5)"{rvon}dame-"
2390 printtab(29)"{rvon}tausch"
2400 gosub2660:poke214,10:print:printtab(29)"{rvon}     "
2410 printtab(29)"{rvon}      ":goto1730
2420 rem ****** unterprogramme ******
2430 rem
2440 rem -- einzelne felder --
2450 rem -- drucken         --
2460 rem
2470 ifb(x,y)=1then2490
2480 gosub2840:poke646,15:print"{rvon}AAA{down}{left}{left}{left}AAA{down}{left}{left}{left}AAA":return
2490 gosub2840:print"   {down}{left}{left}{left}   {down}{left}{left}{left}   ":return
2500 rem
2510 rem -- figur drucken --
2520 rem
2530 f=a(x,y):iff=0thenreturn
2540 gosub2840
2550 poke646,9:iff>6andb(x,y)=0then:print"{rvon}"a$(f-6)"{up}":return
2560 iff>6andb(x,y)=1then:print"{rvof}"a$(f-6)"{up}":return
2570 poke646,8:ifb(x,y)=1thenprint"{rvof}"a$(f)"{up}":return
2580 print"{rvon}"a$(f)"{up}":return
2590 rem
2600 rem -- umrechnen --
2610 rem
2620 b1$=left$(b$,1):x2=asc(b1$)-64:y2=val(right$(b$,1)):return
2630 rem
2640 rem -- zeitschlaufe --
2650 rem
2660 poke198,0:fort=1to250:ifpeek(197)<>64then2680
2670 next:return
2680 ifpeek(197)=3then2700
2690 return
2700 ifpeek(197)<>64then2700
2710 ifpeek(197)=64then2710
2720 return
2730 rem
2740 rem -- grundstellung --
2750 rem
2760 a(1,1)=8:a(2,1)=10:a(3,1)=9:a(4,1)=11:a(5,1)=12:a(6,1)=9
2770 a(7,1)=10:a(8,1)=8
2780 fori=1to8:a(i,8)=a(i,1)-6:next
2790 forx=1to8:a(x,2)=7:a(x,7)=1:next
2800 return
2810 rem
2820 rem -- bildschirmposition --
2830 rem
2840 ify=8thenprint"{home}"tab((x-1)*3+1);:return
2850 x1=(x-1)*3+1:y1=(8-y)*3-1:poke214,y1:print:printtab(x1);:return
2860 rem
2870 rem -- spielende ---
2880 rem
2890 poke198,0:fori=1to10000:ifpeek(197)=64thennext
2900 fori=1to8:forj=1to8:a(i,j)=0:next:next
2910 gosub2760:goto1290
10000 rem
10010 rem -----  data fuer die   ------
10020 rem -----  partien         ------
10030 rem
10040 rem ** demo-partie 1 **
10050 datasiff,kashdan,1948
10060 datad2d4,g8f6,c2c4,e7e6,b1c3,f8b4,d1c2,d7d5,a2a3,b4e7,c4d5,e6d5,c1f4,c7c6
10070 datah2h3,kr,e2e3,f8e8,f1d3,b8d7,g1f3,d7f8,f3e5,e7d6,kr,f8e6,f4h2,g7g6
10080 datae5f3,e6g7,h2d6,d8d6,f1c1,c8f5,f3d2,e8e7,b2b4,a8e8,a1b1,f5h3,g2h3,e7e3
10090 datad3f1,g7f5,f2e3,d6g3s,f1g2,g3e3s,g1h1,f5g3s,h1h2,e3f4,d2f3,e8e2,c3e2
10100 datag3e2s,h2h1,f6h5,c2d2,h5g3s,h1h2,g3f1s,h2h1,f4h2s,f3h2,f1g3m
10110 datae
10120 rem ** demo-partie 2 **
10130 datageller,euwe,1953
10140 datad2d4,g8f6,c2c4,e7e6,b1c3,f8b4,e2e3,c7c5,a2a3,b4c3,b2c3,b7b6,f1d3,c8b7
10150 dataf2f3,b8c6,g1e2,kr,kr,c6a5,e3e4,f6e8,e2g3,c5d4,c3d4,a8c8,f3f4,a5c4
10160 dataf4f5,f7f6,f1f4,b6b5,f4h4,d8b6,e4e5,c4e5,f5e6,e5d3,d1d3,b6e6,d3h7s
10170 datag8f7,c1h6,f8h8,h7h8,c8c2,a1c1,c2g2s,g1f1,e6b3,f1e1,b3f3,wa
10180 datae
10190 rem ** demo-partie 3 **
10200 datarossetto,stahlberg,1947
10210 datae2e4,e7e6,d2d4,d7d5,b1c3,g8f6,c1g5,f8e7,e4e5,f6d7,h2h4,c7c5,c3b5,f7f6
10220 dataf1d3,a7a6,d1h5s,e8f8,h1h3,a6b5,g5h6,d8a5s,h6d2,a5c7,h3g3,c5d4,g1f3
10230 datad7e5,g3g7,h7h6,d3h7,f8g7,h5h6s,g7f7,h6h5s,f7g7r
10240 datax
Listing »Schachmeister«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →