56 lines
1.7 KiB
Text
56 lines
1.7 KiB
Text
100 REM DERIVE SP-ID FROM CHESS960 POS
|
|
110 READ A$: IF A$="" THEN END
|
|
120 PRINT A$":";
|
|
130 GOSUB 170
|
|
140 PRINT SP
|
|
150 GOTO 110
|
|
160 DATA QNRBBNKR, RNBQKBNR, RQNBBKRN, RNQBBKRN,
|
|
170 IF LEN(A$)=8 THEN 190
|
|
180 PRINT "ARRAY MUST BE 8 PIECES.": SP=-1: RETURN
|
|
190 K=0:Q=0:B=0:N=0:R=0
|
|
200 FOR I=0 TO 7
|
|
210 : K(I)=0:Q(I)=0:B(I)=0:N(I)=0:R(I)=0
|
|
220 NEXT I
|
|
230 FOR I=1 TO 8
|
|
240 : P$=MID$(A$,I,1)
|
|
250 : IF P$="Q" THEN Q(Q)=I: Q=Q+1: GOTO 310
|
|
260 : IF P$="K" THEN K(K)=I: K=K+1: GOTO 310
|
|
270 : IF P$="B" THEN B(B)=I: B=B+1: GOTO 310
|
|
280 : IF P$="N" THEN N(N)=I: N=N+1: GOTO 310
|
|
290 : IF P$="R" THEN R(R)=I: R=R+1: GOTO 310
|
|
300 : PRINT "ILLEGAL PIECE '"P$"'.": SP=-1: RETURN
|
|
310 NEXT I
|
|
320 IF K<>1 THEN PRINT "THERE MUST BE EXACTLY ONE KING.": SP=-1: RETURN
|
|
330 IF Q<>1 THEN PRINT "THERE MUST BE EXACTLY ONE QUEEN.": SP=-1: RETURN
|
|
340 IF B<>2 THEN PRINT "THERE MUST BE EXACTLY TWO BISHOPS.": SP=-1: RETURN
|
|
350 IF N<>2 THEN PRINT "THERE MUST BE EXACTLY TWO KNIGHTS.": SP=-1: RETURN
|
|
360 IF R<>2 THEN PRINT "THERE MUST BE EXACTLY TWO ROOKS.": SP=-1: RETURN
|
|
370 IF (K(0) > R(0)) AND (K(0) < R(1)) THEN 390
|
|
380 PRINT "KING MUST BE BETWEEN THE ROOKS.": SP=-1: RETURN
|
|
390 IF (B(0) AND 1) <> (B(1) AND 1) THEN 410
|
|
400 PRINT "BISHOPS MUST BE ON OPPOSITE COLORS.": SP=-1: RETURN
|
|
410 FOR I=0 TO 1
|
|
420 : N=N(I)
|
|
430 : IF N(I)>Q(I) THEN N=N-1
|
|
440 : FOR J=0 TO 1
|
|
450 : IF N(I)>B(J) THEN N=N-1
|
|
460 : NEXT J
|
|
470 : N(I)=N
|
|
480 NEXT I
|
|
490 N0=1: N1=2
|
|
500 FOR N=0 TO 9
|
|
510 : IF N0=N(0) AND N1=N(1) THEN 550
|
|
520 : N1=N1+1
|
|
530 : IF N1>5 THEN N0=N0+1: N1=N0+1
|
|
540 NEXT N
|
|
550 Q=Q(0)-1
|
|
560 FOR I=0 TO 1
|
|
570 : IF Q(0)>B(I) THEN Q=Q-1
|
|
580 NEXT I
|
|
590 FOR I=0 TO 1
|
|
600 : B=B(I)-1
|
|
610 : IF B AND 1 THEN L=INT(B/2)
|
|
620 : IF (B AND 1)=0 THEN D=B/2
|
|
630 NEXT I
|
|
640 SP = 96*N+16*Q+4*D+L
|
|
650 RETURN
|