-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathSCHAKEN.BAS
781 lines (781 loc) · 23.1 KB
/
SCHAKEN.BAS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
10 GOTO 1000:REM Basicode-2 subroutines
20 CLEAR:IN$=" ":SR=0:SR$="":CT=0:CN=0:OHT%=80:OVT%=24
22 KEY OFF:SCREEN 0:WIDTH OHT%:COLOR 7,0,0:CLS:RANDOMIZE TIMER*100
29 GOTO 1010
100 CLS:RETURN
110 GOSUB 111:LOCATE OVE%+1,OHO%+1:RETURN
111 OVE%=INT(VE):OHO%=INT(HO)
112 IF OVE%<0 THEN OVE%=0 ELSE IF OVE%>=OVT% THEN OVE%=OVT%-1
113 IF OHO%<0 THEN OHO%=0 ELSE IF OHO%>=OHT% THEN OHO%=OHT%-1
114 RETURN
120 HO=POS(0)-1:VE=CSRLIN-1:RETURN
200 IN$=INKEY$:RETURN
210 IN$=INPUT$(1):RETURN
250 BEEP:RETURN
260 RV=RND:RETURN
270 FR=FRE(""):RETURN
300 SR$=MID$(STR$(ABS(SR)),2):IF LEFT$(SR$,1)="." THEN SR$="0"+SR$
301 IF SR<0 THEN SR$="-"+SR$
302 RETURN
310 O#=ABS(SR)+.5*10^-CN:O!=INT(O#):O#=1+O#-O!:O$=""
311 IF CN THEN O$="."+STRING$(CN,48):IF O#>1 THEN MID$(O$,1)=MID$(STR$(O#),3)
312 O$=MID$(STR$(O!),2)+O$:IF VAL(O$)>0 AND SR<0 THEN O$="-"+O$
313 IF LEN(O$)<=CT THEN SR$=SPACE$(CT-LEN(O$))+O$:RETURN
314 SR$=STRING$(CT,42):RETURN
350 LPRINT SR$;:RETURN
360 LPRINT:RETURN
1000 A=200:GOTO 20:REM SCHAKEN
1010 GOSUB 20000:REM UITLEG
1020 REM INITIALISATIE
1030 DIM FW(10),F(99),F$(18),BS(132)
1040 DIM SK(132),ZK(132),FA(8)
1050 AL=ASC("a"):AH=ASC("A")
1055 SK=0:ZK=0:RO=0:PA=0:MT=0
1060 REM WAARDE VAN DE STUKKEN
1070 FOR A=0 TO 9:READ FW(A):NEXT A
1080 REM VIRTUELE STUKKEN
1090 FOR A=1 TO 9:F(A)=10:F(A+89)=10:NEXT A
1100 FOR A=0 TO 80 STEP 10:F(A)=10:F(A+19)=10:NEXT A
1110 REM REELE STUKKEN
1120 FOR A=18 TO 88 STEP 10
1130 READ F(A):F(A-7)=-F(A):NEXT A
1140 FOR A=12 TO 82 STEP 10
1150 F(A)=-1:F(A+5)=1:NEXT A
1160 REM STUKKEN OP HET BORD
1170 F$="KKDTTLPOO ooplttdkk"
1180 FOR A=0 TO 18
1190 F$(A)=MID$(F$,A+1,1)
1200 NEXT A
1210 REM VELDAFSTANDEN
1220 FOR A=1 TO 8:READ FA(A):NEXT A
1230 REM SCHAAKBORD
1240 GOSUB 100:VE=1
1250 FOR A=1 TO 4
1260 HO=8:GOSUB 110
1270 FOR B=1 TO 2:FOR C=1 TO 4
1280 PRINT"--- ";
1290 NEXT C
1300 HO=8:VE=VE+1:GOSUB 110
1310 NEXT B
1320 FOR B=1 TO 2:FOR C=1 TO 4
1330 PRINT" ---";
1340 NEXT C
1350 HO=8:VE=VE+1:GOSUB 110
1360 NEXT B:NEXT A
1370 HO=9:VE=0:GOSUB 110
1380 FOR A=0 TO 7
1390 PRINT CHR$(AH+A);" ";
1400 NEXT A
1410 VE=0:FOR A=8 TO 1 STEP-1
1420 HO=6:VE=VE+2:GOSUB 110:PRINT A:NEXT A
1430 REM EINDE INITIALISATIE
1440 REM SPEL-GEDEELTE
1450 GOSUB 1640:REM STUKKEN PLAATSEN
1460 GOSUB 1830:REM INVOER SPELER
1470 GOSUB 3730:REM ZET UITVOEREN
1480 GOSUB 1640:REM STUKKEN PLAATSEN
1490 GOSUB 3860:REM ZET COMPUTER
1500 IF(MT=1) OR(PA=1) THEN 1530
1510 GOSUB 3730:REM ZET UITVOEREN
1520 GOTO 1450
1530 GOSUB 7420
1540 IF PA<>1 THEN 1580
1550 HO=17:GOSUB 110:PRINT"Pat !!"
1560 VE=VE+1:GOSUB 110:PRINT"======"
1570 GOTO 1610
1580 HO=14:GOSUB 110:PRINT"Schaakmat !"
1590 HO=11:VE=VE+2:GOSUB 110:PRINT"U heeft gewonnen"
1600 VE=VE+1:GOSUB 110:PRINT"================"
1610 END
1620 REM EINDE SPEL-GEDEELTE
1630 REM HULPPROGRAMMA
1640 REM STUKKEN PLAATSEN
1650 IF SK>0 THEN GOSUB 7500
1660 VE=0
1670 FOR A=0 TO 6 STEP 2
1680 HO=8:VE=VE+2:GOSUB 110
1690 FOR B=(18-A) TO(88-A) STEP 20
1700 F$=F$(F(B)+9):IF F$=" " THEN F$="-"
1710 PRINT"-";F$;"-";
1720 PRINT" ";F$(F(B+10)+9);" ";
1730 NEXT B
1740 HO=8:VE=VE+2:GOSUB 110
1750 FOR B=(18-A) TO(88-A) STEP 20
1760 PRINT" ";F$(F(B-1)+9);" ";
1770 F$=F$(F(B+9)+9):IF F$=" " THEN F$="-"
1780 PRINT"-";F$;"-";
1790 NEXT B
1800 PRINT
1810 NEXT A
1820 RETURN
1830 REM INVOER VAN DE SPELER
1840 REM INVOER VAN DE ZET
1850 GOSUB 7420
1860 HO=12:VE=VE+1:GOSUB 110:PRINT"Uw Zet: ";
1870 PRINT"*";
1880 PRINT"- : -- ";
1890 HO=20:GOSUB 110
1900 GOSUB 20540:I$=IN$
1910 IF IN$=WI$ THEN 2010
1920 IF(IN$="O") AND(F(51)=-8) THEN 2230
1930 IF(IN$<"A") OR(IN$>"H") THEN 1900
1940 PRINT IN$;
1950 PRINT"*":HO=21:GOSUB 110
1960 GOSUB 210
1970 IF IN$=WI$ THEN 2010
1980 IF(IN$<"1") OR(IN$>"8") THEN 1960
1990 SK=10*(ASC(I$)-AH+1)+VAL(IN$)
2000 IF F(SK)<0 THEN 2020
2010 VE=VE-1:GOSUB 110:GOTO 1860
2020 PRINT IN$;" : ";
2030 PRINT"*":HO=25:GOSUB 110
2040 GOSUB 20540:I$=IN$
2050 IF IN$=WI$ THEN 2010
2060 IF(IN$<"A") OR(IN$>"H") THEN 2040
2070 PRINT IN$;
2080 PRINT"*":HO=26:GOSUB 110
2090 GOSUB 210:IP$=IN$
2100 IF IN$=WI$ THEN 2010
2110 IF(IN$<"1") OR(IN$>"8") THEN 2090
2120 PRINT IN$;
2130 PRINT"*":HO=27:GOSUB 110
2140 GOSUB 210
2150 IF IN$=WI$ THEN 2010
2160 IF IN$<>CHR$(13) THEN 2140
2170 ZK=10*(ASC(I$)-AH+1)+VAL(IP$)
2180 PRINT" ";
2190 IF F(ZK)>=0 THEN 2760
2200 HO=25:GOSUB 110
2210 PRINT"*-":GOSUB 110
2220 GOTO 2040
2230 REM ROKADE MET CONTROLE
2240 RO=1
2250 PRINT" O-O ";
2260 HO=24:GOSUB 110
2270 PRINT"*":GOSUB 110
2280 GOSUB 20540
2290 IF IN$=WI$ THEN 2010
2300 IF IN$=CHR$(13) THEN 2370
2310 IF IN$<>"O" THEN 2280
2320 PRINT"-O";:RO=-1
2330 PRINT"*":HO=26:GOSUB 110
2340 GOSUB 210
2350 IF IN$=WI$ THEN 2010
2360 IF IN$<>CHR$(13) THEN 2340
2370 IF F(46+RO*35)<>-5 THEN 2690
2380 IF F(51+RO*10)<>0 THEN 2690
2390 IF F(51+RO*20)<>0 THEN 2690
2400 IF(RO=-1) AND(F(21)<>0) THEN 2690
2410 PRINT" ";:B=51
2420 A=B+1
2430 IF F(A)=0 THEN A=A+1:IF A<=78 THEN 2430
2440 IF(F(A)=6) OR(F(A)=7) THEN 2690
2450 IF F(B+1)=9 THEN 2930
2460 A=B+11
2470 IF F(A)=0 THEN A=A+11:IF A<=86 THEN 2470
2480 IF(F(A)=4) OR(F(A)=7) THEN 2690
2490 IF F(B+11)=9 THEN 2690
2500 A=B+10
2510 IF F(A)=0 THEN A=A+10:IF A<=81 THEN 2510
2520 IF(F(A)=6) OR(F(A)=7) THEN 2690
2530 IF F(B+10)=9 THEN 2690
2540 A=B-10
2550 IF F(A)=0 THEN A=A-10:IF A>=11 THEN 2550
2560 IF(F(A)=6) OR(F(A)=7) THEN 2690
2570 IF F(B-10)=9 THEN 2690
2580 A=B-9
2590 IF F(A)=0 THEN A=A-9:IF A>=13 THEN 2590
2600 IF(F(A)=4) OR(F(A)=7) THEN 2690
2610 IF F(B-9)=9 THEN 2690
2620 IF F(B-19)=3 THEN 2690
2630 IF F(B-8)=3 THEN 2690
2640 IF F(B+12)=3 THEN 2690
2650 IF F(B+21)=3 THEN 2690
2660 IF(F(B-9)=2) OR(F(B+11)=2) THEN 2690
2670 IF B=51+RO*20 THEN 2710
2680 B=B+RO*10:GOTO 2420
2690 RO=0
2700 GOTO 2010:REM ROKADE ONMOGELIJK
2710 REM UITVOERING ROKADE
2720 F(51)=0:F(51+RO*20)=-9
2730 F(46+RO*35)=0:F(51+RO*10)=-6
2740 GOTO 3690
2750 REM EINDE ROKADE
2760 REM INVOER CONTROLE
2765 AF=ABS(F(SK)+1)+1
2770 ON AF GOTO 2780,2820,2890,2940,3090,3090,3240,3310,3310
2780 REM PION TWEE VELDEN
2790 IF ZK-SK<>2 THEN 2820
2800 IF(F(SK+1)=0) AND(F(ZK)=0) THEN 3350
2810 GOTO 2200
2820 REM PION ALGEMEEN
2830 IF(SK-ZK<>9) AND(ZK-SK<>11) THEN 2860
2840 IF F(ZK)>0 THEN 3350
2850 GOTO 2200
2860 IF ZK-SK<>1 THEN 2200
2870 IF F(ZK)<>0 THEN 2200
2880 GOTO 3350
2890 REM PAARD
2900 A=1
2910 IF ABS(ZK-SK)=FA(A) THEN 3350
2920 A=A+1:IF A<=4 THEN 2910
2930 GOTO 2200
2940 REM LOPER/DAME
2950 DL=ABS(ZK-SK):V=SGN(ZK-SK)
2960 IF DL/11=INT(DL/11) THEN 2990
2970 IF DL/9=INT(DL/9) THEN 3040
2980 GOTO 2200
2990 IF DL=11 THEN 3350
3000 A=SK+11*V
3010 IF F(A)<>0 THEN 2200
3020 A=A+11*V:IF A<>ZK THEN 3010
3030 GOTO 3350
3040 IF DL=9 THEN 3350
3050 A=SK+9*V
3060 IF F(A)<>0 THEN 2200
3070 A=A+9*V:IF A<>ZK THEN 3060
3080 GOTO 3350
3090 REM TOREN/DAME
3100 DL=ABS(ZK-SK):V=SGN(ZK-SK)
3110 IF DL<8 THEN 3140
3120 IF DL/10=INT(DL/10) THEN 3190
3130 GOTO 2200
3140 IF DL=1 THEN 3350
3150 A=SK+V
3160 IF F(A)<>0 THEN 2200
3170 A=A+V:IF A<>ZK THEN 3160
3180 GOTO 3350
3190 IF DL=10 THEN 3350
3200 A=SK+10*V
3210 IF F(A)<>0 THEN 2200
3220 A=A+10*V:IF A<>ZK THEN 3210
3230 GOTO 3350
3240 REM DAME
3250 DL=ABS(ZK-SK):V=SGN(ZK-SK)
3260 IF DL/11=INT(DL/11) THEN 2990
3270 IF DL/10=INT(DL/10) THEN 3190
3280 IF DL/9=INT(DL/9) THEN 3040
3290 IF DL<8 THEN 3140
3300 GOTO 2200
3310 REM KONING
3320 DL=ABS(ZK-SK)
3330 IF(DL=10) OR(DL=11) THEN 3350
3340 IF(DL<>1) AND(DL<>9) THEN 2200
3350 REM INTERNE ZET-UITVOERING
3360 REM STAAT DE KONING SCHAAK
3370 FZ=F(ZK):F(ZK)=F(SK):F(SK)=0
3380 PK=11
3390 IF(F(PK)=-8) OR(F(PK)=-9) THEN 3410
3400 PK=PK+1:IF PK<=88 THEN 3390
3410 B=-1
3420 MW=11+77*SGN(B+1)
3440 C=1:GOSUB 8000:IF Q=1 THEN 3480
3450 IF(F(A)>=5) AND(F(A)<=7) THEN 3700
3460 IF(F(PK+B)=8) OR(F(PK+B)=9) THEN 3700
3480 C=11:GOSUB 8000:IF Q=1 THEN 3520
3490 IF(F(A)=4) OR(F(A)=7) THEN 3700
3500 IF(F(PK+B*11)=8) OR(F(PK+B*11)=9) THEN 3700
3520 C=10:GOSUB 8000:IF Q=1 THEN 3560
3530 IF(F(A)>=5) AND(F(A)<=7) THEN 3700
3540 IF(F(PK+B*10)=8) OR(F(PK+B*10)=9) THEN 3700
3560 C=9:GOSUB 8000:IF Q=1 THEN 3590
3570 IF(F(A)=4) OR(F(A)=7) THEN 3700
3580 IF(F(PK+B*9)=8) OR(F(PK+B*9)=9) THEN 3700
3590 A=1
3600 S=PK+FA(A)*B
3610 IF(S<11) OR(S>88) THEN 3630
3620 IF F(S)=3 THEN 3700
3630 A=A+1:IF A<=4 THEN 3600
3640 IF B=-1 THEN B=1:GOTO 3420
3650 IF(F(PK-9)=1) OR(F(PK+11)=1) THEN 3700
3660 IF(F(PK-9)=2) OR(F(PK+11)=2) THEN 3700
3670 IF(F(ZK)=-2) AND(ZK-INT(ZK/10)*10=8) THEN F(ZK)=-7
3680 H=F(ZK):IF(H=-1) OR(H=-5) OR(H=-8) THEN F(ZK)=H-1
3690 RETURN
3700 F(SK)=F(ZK):F(ZK)=FZ:GOTO 2200
3710 REM EINDE INVOERCONTROLE
3720 REM EINDE INVOER SPELER
3730 REM ZETAANDUIDING
3740 HO=33:VE=9:GOSUB 110
3750 IF RO=0 THEN 3800
3760 IF RO=1 THEN PRINT" ";
3770 IF RO=-1 THEN PRINT"O-";
3780 PRINT"O-O "
3790 RO=0:SK=0:GOTO 3840
3800 PRINT CHR$(AH-1+INT(SK/10));
3810 SR=SK:GOSUB 300:PRINT RIGHT$(SR$,1);":";
3820 PRINT CHR$(AH-1+INT(ZK/10));
3830 SR=ZK:GOSUB 300:PRINT RIGHT$(SR$,1)
3840 RETURN
3850 REM EINDE ZETAANDUIDING
3860 REM ZET COMPUTER
3870 GOSUB 7420
3880 HO=14:VE=19:GOSUB 110:PRINT"Geduld graag"
3890 PRINT
3900 HO=12:VE=21:GOSUB 110:PRINT"Stelling analyse"
3910 PRINT
3920 HO=13:VE=23:GOSUB 110:PRINT"80 tot aan Zet";
3930 ZN=0:BZ=1
3940 IF F(58)=8 THEN GOSUB 5830
3950 SK=11
3960 HO=13:VE=23:GOSUB 110
3970 SR=91-SK:CN=0:CT=2:GOSUB 310:PRINT SR$;
3980 IF(F(SK)<=0) OR(F(SK)=10) THEN 4000
3990 GOSUB 5190
4000 IF SK<88 THEN SK=SK+1:GOTO 3960
4010 FOR A=1 TO ZN-1:FOR B=A+1 TO ZN
4020 IF BS(A)>=BS(B) THEN 4060
4030 BS(0)=BS(A):BS(A)=BS(B):BS(B)=BS(0)
4040 SK(0)=SK(A):SK(A)=SK(B):SK(B)=SK(0)
4050 ZK(0)=ZK(A):ZK(A)=ZK(B):ZK(B)=ZK(0)
4060 NEXT B:NEXT A
4070 HO=14:GOSUB 110:PRINT"2";
4080 IF BZ<ZN+1 THEN 4110
4090 IF MT=1 THEN PA=1:GOTO 4180
4100 MT=1:BZ=1
4110 SK=SK(BZ):ZK=ZK(BZ)
4120 IF ZK>1 THEN 4170
4130 RO=ZK
4140 ZK=58+RO*10
4150 F(58)=0
4160 F(58+RO*20)=9
4170 FZ=F(ZK):F(ZK)=F(SK):F(SK)=0
4180 REM STAAT DE KONING SCHAAK
4190 PK=11
4200 IF(F(PK)=8) OR(F(PK)=9) THEN 4220
4210 PK=PK+1:IF PK<=88 THEN 4200
4220 B=-1
4230 MW=11+77*SGN(B+1)
4250 C=1:GOSUB 8000:IF Q=1 THEN 4290
4260 IF(F(A)>=-7) AND(F(A)<=-5) THEN 5120
4270 IF(F(PK+B)=-8) OR(F(PK+B)=-9) THEN 5120
4290 C=11:GOSUB 8000:IF Q=1 THEN 4330
4300 IF(F(A)=-4) OR(F(A)=-7) THEN 5120
4310 IF(F(PK+B*11)=-8) OR(F(PK+B*11)=-9) THEN 5120
4330 C=10:GOSUB 8000:IF Q=1 THEN 4370
4340 IF(F(A)>=-7) AND(F(A)<=-5) THEN 5120
4350 IF(F(PK+B*10)=-8) OR(F(PK+B*10)=-9) THEN 5120
4370 C=9:GOSUB 8000:IF Q=1 THEN 4400
4380 IF(F(A)=-4) OR(F(A)=-7) THEN 5120
4390 IF(F(PK+B*9)=-8) OR(F(PK+B*9)=-9) THEN 5120
4400 A=1
4410 S=PK+FA(A)*B
4420 IF(S<11) OR(S>88) THEN 4440
4430 IF F(S)=-3 THEN 5120
4440 A=A+1:IF A<=4 THEN 4410
4450 IF B=-1 THEN B=1:GOTO 4230
4460 IF(F(PK+9)=-1) OR(F(PK-11)=-1) THEN 5120
4470 IF(F(PK+9)=-2) OR(F(PK-11)=-2) THEN 5120
4480 GOSUB 110:PRINT"1";
4490 IF PA=1 THEN 5100
4500 IF MT=1 THEN 5070
4510 IF F(ZK)=7 THEN 4530
4520 IF FW(F(ZK))<=FW(-FZ) THEN 5070
4530 REM DEKKING VAN DE STUKKEN
4540 REM STUK AANGEVALLEN?
4550 B=-1
4560 MW=11+77*SGN(B+1)
4580 C=1:GOSUB 8100:IF Q=1 THEN 4620
4590 IF(F(A)>=-7) AND(F(A)<=-5) THEN 4820
4600 IF(F(ZK+B)=-8) OR(F(ZK+B)=-9) THEN 4820
4620 C=11:GOSUB 8100:IF Q=1 THEN 4660
4630 IF(F(A)=-4) OR(F(A)=-7) THEN 4820
4640 IF(F(ZK+B*11)=-8) OR(F(ZK+B*11)=-9) THEN 4820
4660 C=10:GOSUB 8100:IF Q=1 THEN 4700
4670 IF(F(A)>=-7) AND(F(A)<=-5) THEN 4820
4680 IF(F(ZK+B*10)=-8) OR(F(ZK+B*10)=-9) THEN 4820
4700 C=9:GOSUB 8100:IF Q=1 THEN 4730
4710 IF(F(A)=-4) OR(F(A)=-7) THEN 4820
4720 IF(F(ZK+B*9)=-8) OR(F(ZK+B*9)=-9) THEN 4820
4730 A=1
4740 S=ZK+FA(A)*B
4750 IF(S<11) OR(S>88) THEN 4770
4760 IF F(S)=-3 THEN 4820
4770 A=A+1:IF A<=4 THEN 4740
4780 IF B=-1 THEN B=1:GOTO 4560
4790 IF(F(ZK+9)=-1) OR(F(ZK-11)=-1) THEN 4820
4800 IF(F(ZK+9)=-2) OR(F(ZK-11)=-2) THEN 4820
4810 GOTO 5070
4820 IF F(ZK)=7 THEN 5120
4830 REM STAAT HET STUK GEDEKT?
4840 B=-1
4850 MW=11+77*SGN(B+1)
4870 C=1:GOSUB 8100:IF Q=1 THEN 4900
4880 IF(F(A)>=5) AND(F(A)<=7) THEN 5070
4900 C=11:GOSUB 8100:IF Q=1 THEN 4930
4910 IF(F(A)=4) OR(F(A)=7) THEN 5070
4930 C=10:GOSUB 8100:IF Q=1 THEN 4960
4940 IF(F(A)>=5) AND(F(A)<=7) THEN 5070
4960 C=9:GOSUB 8100:IF Q=1 THEN 4980
4970 IF(F(A)=4) OR(F(A)=7) THEN 5070
4980 A=1
4990 S=ZK+FA(A)*B
5000 IF(S<11) OR(S>88) THEN 5020
5010 IF F(S)=3 THEN 5070
5020 A=A+1:IF A<=4 THEN 4990
5030 IF B=-1 THEN B=1:GOTO 4850
5040 IF(F(ZK-9)=1) OR(F(ZK+11)=1) THEN 5070
5050 IF(F(ZK-9)=2) OR(F(ZK+11)=2) THEN 5070
5060 GOTO 5120
5070 REM EINDE DEKKING STUKKEN
5080 IF(F(ZK)=1) OR(F(ZK)=5) OR(F(ZK)=8) THEN F(ZK)=F(ZK)+1
5090 IF(F(ZK)=2) AND(ZK-INT(ZK/10)*10=1) THEN F(ZK)=7
5100 GOSUB 110:PRINT"0";
5110 RETURN
5120 IF PA=1 THEN PA=0:GOTO 5100
5130 F(SK)=F(ZK):F(ZK)=FZ:BZ=BZ+1
5140 IF RO=0 THEN 4080
5150 F(58)=8:F(58+RO*20)=0
5160 RO=0
5170 GOTO 4080
5180 REM EINDE COMPUTERZET
5190 REM ZETUITVOERING
5195 H=F(SK)
5200 ON H GOTO 5210,5260,5450,5540,5640,5640,5540,5740,5740
5210 REM PION TWEE VELDEN
5220 IF F(SK-2)<>0 THEN 5260
5230 IF F(SK-1)<>0 THEN 5260
5240 ZK=SK-2
5250 F(SK)=2:GOSUB 6250:F(SK)=1
5260 REM PION ALGEMEEN
5270 FS=F(SK):F(SK)=2
5280 IF F(SK-11)>=0 THEN 5330
5290 ZK=SK-11
5300 IF SK-INT(SK/10)*10=2 THEN F(SK)=7
5310 GOSUB 6250
5320 IF SK-INT(SK/10)*10=2 THEN F(SK)=2
5330 IF F(SK-1)<>0 THEN 5380
5340 ZK=SK-1
5350 IF SK-INT(SK/10)*10=2 THEN F(SK)=7
5360 GOSUB 6250
5370 IF SK-INT(SK/10)*10=2 THEN F(SK)=2
5380 IF F(SK+9)>=0 THEN 5430
5390 ZK=SK+9
5400 IF SK-INT(SK/10)*10=2 THEN F(SK)=7
5410 GOSUB 6250
5420 IF SK-INT(SK/10)*10=2 THEN F(SK)=2
5430 F(SK)=FS
5440 GOTO 5810
5450 REM PAARD
5460 FOR B1=-1 TO 1 STEP 2
5470 FOR A1=1 TO 4
5480 ZK=SK+B1*FA(A1)
5490 IF ZK<0 THEN ZK=ZK+100
5500 IF ZK>99 THEN ZK=ZK-100
5510 IF F(ZK)<=0 THEN GOSUB 6250
5520 NEXT A1:NEXT B1
5530 GOTO 5810
5540 REM LOPER/DAME
5550 FOR B1=-1 TO 1 STEP 2
5560 FOR C1=5 TO 6
5570 FOR A1=SK+B1*FA(C1) TO 50+B1*39 STEP B1*FA(C1)
5580 IF F(A1)<=0 THEN 5600
5590 A1=50+B1*39:GOTO 5620
5600 ZK=A1:GOSUB 6250
5610 IF F(A1)<0 THEN 5590
5620 NEXT A1:NEXT C1:NEXT B1
5630 IF F(SK)<>7 THEN 5810
5640 REM TOREN/DAME
5650 FOR B1=-1 TO 1 STEP 2
5660 FOR C1=7 TO 8
5670 FOR A1=SK+B1*FA(C1) TO 50+B1*39 STEP B1*FA(C1)
5680 IF F(A1)<=0 THEN 5700
5690 A1=50+B1*39:GOTO 5720
5700 ZK=A1:GOSUB 6250
5710 IF F(A1)<0 THEN 5690
5720 NEXT A1:NEXT C1:NEXT B1
5730 GOTO 5810
5740 REM KONING
5750 FOR B1=-1 TO 1 STEP 2
5760 FOR A1=5 TO 8
5770 ZK=SK+B1*FA(A1)
5780 IF F(ZK)>0 THEN 5800
5790 GOSUB 6250
5800 NEXT A1:NEXT B1
5810 RETURN
5820 REM EINDE ZETUITVOERING
5830 REM ROKADE MET CONTROLE
5840 RO=-1:B=58
5850 IF F(53+RO*35)<>5 THEN 6210
5860 IF F(58+RO*10)<>0 THEN 6210
5870 IF F(58+RO*20)<>0 THEN 6210
5880 IF(RO=-1) AND(F(28)<>0) THEN 6210
5890 A=B-1
5900 IF F(A)=0 THEN A=A-1:IF A>=31 THEN 5900
5910 IF(F(A)=-6) OR(F(A)=-7) THEN 6210
5920 IF F(B-1)=-9 THEN 6210
5930 A=B-11
5940 IF F(A)=0 THEN A=A-11:IF A>=13 THEN 5940
5950 IF(F(A)=-4) OR(F(A)=-7) THEN 6210
5960 IF F(B-11)=-9 THEN 6210
5970 A=B+10
5980 IF F(A)=0 THEN A=A+10:IF A<=88 THEN 5980
5990 IF(F(A)=-6) OR(F(A)=-7) THEN 6210
6000 IF F(B+10)=-9 THEN 6210
6010 A=B-10
6020 IF F(A)=0 THEN A=A-10:IF A>=18 THEN 6020
6030 IF(F(A)=-6) OR(F(A)=-7) THEN 6210
6040 IF F(B-10)=-9 THEN 6210
6050 A=B+9
6060 IF F(A)=0 THEN A=A+9:IF A<=87 THEN 6060
6070 IF(F(A)=-4) OR(F(A)=-7) THEN 6210
6080 IF F(B+9)=-9 THEN 6210
6090 IF F(B+19)=-3 THEN 6210
6100 IF F(B+8)=-3 THEN 6210
6110 IF F(B-12)=-3 THEN 6210
6120 IF F(B-21)=-3 THEN 6210
6130 IF(F(B+9)=-2) OR(F(B-11)=-2) THEN 6210
6140 IF B=58+RO*20 THEN 6160
6150 B=B+RO*10:GOTO 5890
6160 F(58)=0:F(58+RO*20)=9
6170 SK=53+RO*35:ZK=58+RO*10
6180 GOSUB 6250
6190 F(58)=8:F(58+RO*20)=0
6200 ZK(ZN)=RO:BS(ZN)=BS(ZN)+100
6210 IF RO=-1 THEN RO=1:GOTO 5850
6220 RO=0
6230 RETURN
6240 REM EINDE ROKADE
6250 REM WAARDEBEPALING
6260 FZ=F(ZK):F(ZK)=F(SK):F(SK)=0
6270 ZN=ZN+1:SW=0
6280 FOR P=11 TO 88
6290 IF(F(P)=0) OR(F(P)=10) THEN 7370
6300 IF F(P)>0 THEN 6840
6310 REM WAARDE TEGENSTANDER
6320 SW=SW-3*FW(-F(P)):H=-F(P)
6330 ON H GOTO 6340,6340,6430,6520,6630,6630,6520,6740,6740
6340 REM PION ALGEMEEN
6350 IF F(P+1)=0 THEN SW=SW-3
6360 IF F(P-9)>0 THEN SW=SW-FW(F(P-9))
6370 IF F(P+11)>0 THEN SW=SW-FW(F(P+11))
6380 IF F(P)=-2 THEN 7370
6390 REM PION TWEE VELDEN
6400 IF F(P+1)<>0 THEN 6420
6410 IF F(P+2)=0 THEN SW=SW-3
6420 GOTO 7370
6430 REM PAARD
6440 A=-1
6450 FOR B=1 TO 4
6460 SP=P+A*FA(B)
6470 IF(SP<11) OR(SP>88) THEN 6490
6480 IF F(SP)>=0 THEN SW=SW-FW(F(SP))
6490 NEXT B
6500 IF A=-1 THEN A=1:GOTO 6450
6510 GOTO 7370
6520 REM LOPER/DAME
6530 B=-1
6540 FOR C=5 TO 6
6550 A=P+B*FA(C)
6560 IF F(A)>=0 THEN SW=SW-FW(F(A))
6570 IF F(A)<>0 THEN 6600
6580 A=A+B*FA(C)
6590 GOTO 6560
6600 NEXT C
6610 IF B=-1 THEN B=1:GOTO 6540
6620 IF F(P)<>-7 THEN 7370
6630 REM TOREN/DAME
6640 B=-1
6650 FOR C=7 TO 8
6660 A=P+B*FA(C)
6670 IF F(A)>=0 THEN SW=SW-FW(F(A))
6680 IF F(A)<>0 THEN 6710
6690 A=A+B*FA(C)
6700 GOTO 6670
6710 NEXT C
6720 IF B=-1 THEN B=1:GOTO 6650
6730 GOTO 7370
6740 REM KONING
6750 B=-1
6760 FOR C=5 TO 8
6770 SP=F(P+B*FA(C))
6780 IF(SP<0) AND(RO=0) THEN 6800
6790 SW=SW-FW(ABS(SP))
6800 NEXT C
6810 IF B=-1 THEN B=1:GOTO 6760
6820 GOTO 7370
6830 REM EINDE WAARDE TEGENSTANDER
6840 REM WAARDE COMPUTER
6850 SW=SW+3*FW(F(P))
6860 ON F(P) GOTO 6870,6870,6970,7060,7170,7170,7060,7280,7280
6870 REM PION ALGEMEEN
6880 IF F(ZK)<=2 THEN SW=SW+3
6890 IF F(P-1)=0 THEN SW=SW+3
6900 IF F(P+9)<0 THEN SW=SW+FW(-F(P+9))
6910 IF F(P-11)<0 THEN SW=SW+FW(-F(P-11))
6920 IF F(P)=2 THEN 7370
6930 REM PION TWEE VELDEN
6940 IF F(P-1)<>0 THEN 6960
6950 IF F(P-2)=0 THEN SW=SW+3
6960 GOTO 7370
6970 REM PAARD
6980 A=-1
6990 FOR B=1 TO 4
7000 SP=P+A*FA(B)
7010 IF(SP<11) OR(SP>88) THEN 7030
7020 IF F(SP)<=0 THEN SW=SW+FW(-F(SP))
7030 NEXT B
7040 IF A=-1 THEN A=1:GOTO 6990
7050 GOTO 7370
7060 REM LOPER/DAME
7070 B=-1
7080 FOR C=5 TO 6
7090 A=P+B*FA(C)
7100 IF F(A)<=0 THEN SW=SW+FW(-F(A))
7110 IF F(A)<>0 THEN 7140
7120 A=A+B*FA(C)
7130 GOTO 7100
7140 NEXT C
7150 IF B=-1 THEN B=1:GOTO 7080
7160 IF F(P)<>7 THEN 7370
7170 REM TOREN/DAME
7180 B=-1
7190 FOR C=7 TO 8
7200 A=P+B*FA(C)
7210 IF F(A)<=0 THEN SW=SW+FW(-F(A))
7220 IF F(A)<>0 THEN 7250
7230 A=A+B*FA(C)
7240 GOTO 7210
7250 NEXT C
7260 IF B=-1 THEN B=1:GOTO 7190
7270 GOTO 7370
7280 REM KONING
7290 B=-1
7300 FOR C=5 TO 8
7310 SP=F(P+B*FA(C))
7320 IF(SP>0) AND(RO=0) THEN 7340
7330 SW=SW+FW(ABS(SP))
7340 NEXT C
7350 IF B=-1 THEN B=1:GOTO 7300
7360 REM EINDE WAARDE COMPUTER
7370 NEXT P
7380 F(SK)=F(ZK):F(ZK)=FZ
7390 BS(ZN)=SW:SK(ZN)=SK:ZK(ZN)=ZK
7400 RETURN
7410 REM EINDE WAARDEBEPALING
7420 REM 5 REGELS WISSEN
7430 FOR A=1 TO 5
7440 HO=12:VE=18+A:GOSUB 110:PRINT" ";
7450 NEXT A
7460 VE=19:GOSUB 110
7470 RETURN
7480 REM EINDE REGELS WISSEN
7490 REM EINDE HULP-PROGRAMMA
7500 REM SCHAAKSTUK KNIPPERT
7510 VE=2*(9-SK+10*INT(SK/10))
7520 HO=INT(SK/10)*3+6
7530 FOR A=1 TO 5
7540 GOSUB 110:PRINT F$(F(ZK)+9)
7550 FOR B=1 TO 100:NEXT B
7560 GOSUB 110:PRINT" "
7570 FOR B=1 TO 100:NEXT B
7580 NEXT A
7590 VE=2*(9-ZK+10*INT(ZK/10))
7600 HO=INT(ZK/10)*3+6
7610 FOR A=1 TO 5
7620 GOSUB 110:PRINT" "
7630 FOR B=1 TO 100:NEXT B
7640 GOSUB 110:PRINT F$(F(ZK)+9)
7650 FOR B=1 TO 100:NEXT B
7660 NEXT A
7670 RETURN
8000 REM ZOEK STUK
8010 A=PK
8020 A=A+B*C
8030 IF SGN(A-MW)=B THEN Q=1:RETURN
8040 IF F(A)=0 THEN 8020
8050 Q=0:RETURN
8100 A=ZK:GOTO 8020
20000 REM UITLEG
20010 GOSUB 100
20020 HO=16:VE=1:GOSUB 110:PRINT"SCHAKEN"
20030 VE=VE+1:GOSUB 110:PRINT"======="
20040 PRINT
20050 PRINT"In dit schaakprogramma wordt volgens"
20060 PRINT"algemene regels gespeeld. Als U bijv."
20070 PRINT"een schaakstuk van C3 naar E5 wilt"
20080 PRINT"zetten, typt U gewoon C3:E5 in en drukt"
20090 PRINT"dan op <RETURN>. Als U een typ-fout"
20100 PRINT"heeft gemaakt, drukt U op de wis-toets."
20110 PRINT"U kunt dan opnieuw Uw zet invoeren."
20120 PRINT"Voor de kleine rokade gebruikt U"
20130 PRINT"eenmaal de 'o'-toets + <RETURN>."
20140 PRINT"Voor de grote rokade moet U twee maal"
20150 PRINT"op de 'o'-toets drukken en dan op"
20160 PRINT"<RETURN>."
20170 PRINT"De schaakstukken worden voorgesteld"
20180 PRINT"als letters, dus achtereenvolgens:"
20190 PRINT"(T)oren, (P)aard, (L)oper, (D)ame en"
20200 PRINT"(K)oning. De pionnen zijn aangegeven"
20210 PRINT"met de letter 'O'."
20220 GOSUB 20450
20230 HO=16:VE=1:GOSUB 110:PRINT"SCHAKEN"
20240 VE=VE+1:GOSUB 110:PRINT"======="
20250 PRINT
20260 PRINT"De computer speelt met de kleine"
20270 PRINT"letters en U speelt vanzelfsprekend dan"
20280 PRINT"met de grote letters."
20290 PRINT
20300 PRINT"Een nadeel van dit schaakprogramma is"
20310 PRINT"echter dat de computer zelf zeer lang"
20320 PRINT"moet nadenken over een zet. Zelfs de"
20330 PRINT"meest eenvoudige openingszet is voor"
20340 PRINT"de Commodore 64 een vraagstuk waar hij"
20350 PRINT"bijna vier minuten over doet."
20360 PRINT"Maar laat dit U niet de zin ontnemen"
20370 PRINT"om een goed spel schaak met de computer"
20380 PRINT"te spelen. Veel succes!"
20390 GOSUB 20450
20400 HO=5:VE=5:GOSUB 110
20410 PRINT"Druk op de WIS-toets: ";
20420 GOSUB 210:WI$=IN$
20430 PRINT"Dank U..."
20440 RETURN
20450 REM DRUK TOETS
20460 HO=32:VE=23
20470 GOSUB 110:PRINT"TOETS >";
20480 FOR P=1 TO 200:NEXT P
20490 GOSUB 110:PRINT"TOETS ";
20500 GOSUB 200
20510 IF IN$<>"" THEN GOSUB 100:RETURN
20520 FOR P=1 TO 100:NEXT P
20530 GOTO 20470
20540 REM INVOER
20550 GOSUB 210
20560 IF(IN$<"a") OR(IN$>"z") THEN RETURN
20570 IN$=CHR$(ASC(IN$)-AL+AH)
20580 RETURN
25000 DATA 3,10,10,30,30,50,50,110,999,999
25010 DATA 5,3,4,7,8,4,3,5,21,19,12,8,11,9,10,1
30000 REM========================
30010 REM== ==
30020 REM== - SCHAKEN - ==
30030 REM== ==
30040 REM== NAAR HET BOEK MET ==
30050 REM== BIJBEHORENDE ==
30060 REM== LISTING: ==
30070 REM== ==
30080 REM== 'SCHAKEN MET UW ==
30090 REM==COMMODORE 64/VIC 20'==
30100 REM== ==
30110 REM== VAN DE DUITSE ==
30120 REM== AUTEURS: ==
30130 REM== G. O. HAMANN ==
30140 REM== EN ==
30150 REM== J. J. EDEN ==
30160 REM== ==
30170 REM== KLUWER TECHNISCHE ==
30180 REM== BOEKEN ==
30190 REM== ==
30200 REM== AANGEPAST AAN HET ==
30210 REM== BASICODE-2 FORMAAT ==
30220 REM== DOOR: ==
30230 REM== ==
30240 REM== P.J. VAN DER MESPEL==
30250 REM== ROSSINILAAN 491 ==
30260 REM== 2551 MZ DEN HAAG ==
30270 REM== ==
30280 REM== - 6 JUNI 1990 - ==
30290 REM== ==
30300 REM========================
30310 REM COPYRIGHT NOS HILVERSUM