*NAME SOLITAIRE1  PLAY SOLITAIRE ON THE Z88 : ( 2 A%(7,7) < M%(31,7) FSOL=0 PDIS%=:CH%=0:MOV=0 ZMP%=1:MI=1:MJ=1:MK=1 d RESET:ERROR: nINIT xFILL    DIS% DISPLAY INK GETMOVE MX = 0 SUCCESS:BACKONE MX <> 0  "MOVE ";MP% MOV=MOV+1 M%(MP%,1)=MX M%(MP%,2)=MY M%(MP%,3)=MX1 M%(MP%,4)=MY1 M%(MP%,5)=MI M%(MP%,6)=MJ M%(MP%,7)=MK ": ,1,50,73,52 60,0);MOV; @PY=MP% 8: PX=(MP% 8)*10 %JPX,PY);MP%;".";MJ;".";MI;".";MK T1,50,73,49 ^: hMP%=MP%+1 rMI=1:MJ=1:MK=1 |MOVE(MX,MY,MX1,MY1) 1=0  : :  DISPLAY  I,J 1,50,73,50  I=1 7 I,0);("0"+I); 0,I);("0"+I);  J=1 7 I,J); 6 A%(I,J)<>0 "O"; ONBOARD(I,J) "."; " ";  J  I 1,50,73,49 & 0: : FILL D I,J N I=1 7 X J=1 7 b ONBOARD(I,J) A%(I,J)=1 l I=4 J=4 A%(I,J)=0 v J  I  :  MOVE(X,Y,X1,Y1) X2=(X+X1)/2:Y2=(Y+Y1)/2  ERS=FNVALIDMOVE(X,Y,X1,Y1) 7 IF NOT ERS THEN P."NOT A VALID MOVE ";ERS:ENDPROC A%(X,Y)=0 A%(X2,Y2)=0 A%(X1,Y1)=1  :  ONBOARD(I,J)  I<1 I>7 J<1 J>7 =   I<3 J<3 =  I<3 J>5 =   I>5 J<3 = * I>5 J>5 = 4= >: H VALIDMOVE(A,B,C,D) R E,F \E=(A+C)/2: F=(B+D)/2 ,f ONBOARD(A,B) =: "INVALID MOVE" ,p ONBOARD(C,D) =: "INVALID MOVE" hz IF (ABS(A-C)=0 AND ABS(B-D)=2) OR (ABS(A-C)=2 AND ABS(B-D)=0) THEN ELSE =FALSE: REM "INVALID MOVE" * A%(A,B)=0 =: "NO PIECE TO MOVE" / A%(C,D)<>0 =: "DESTINATION OCCUPIED" / A%(E,F)=0 =: "NO PIECE TO JUMP OVER" = :  INIT  SET UP WINDOWS $1,55,35,49,32+1,32,32+15,40,129 $1,55,35,50,32+17,32,32+8,40,129 %1,55,35,51,32+26,32,32+17,40,129 %1,55,35,52,32+45,32,32+40,40,129 1,50,73,52 1,50,73,51 1,"S" 1,50,73,50 1,50,73,49 $1,"S" . 8: B RESET L V1,55,35,49,32,32,126,40,128 `1,50,73,49 j1,"S" t1,"C" ~ :  ERROR   " at line "; SAV("SOL")  :  GETMOVE  1,50,73,51 MX=0 DK=MK DI=MI DJ=MJ   J=DJ 7  I=DI 7  A%(I,J)<>0 TEST ( I 2DI=1 < J F 1,50,73,49 P Z: d TEST n K=DK 4 x K=4 LI=0:LJ=-2  K=2 LI=-2:LJ=0  K=3 LI=+2:LJ=0  K=1 LI=0:LJ=+2  VALIDMOVE(I,J,I+LI,J+LJ) "From ";I;",";J;" to ";I+LI;",";J+LJ:MX=I:MY=J:MX1=I+LI:MY1=J+LJ:MI=I:MJ=J:MK=K:I=8:J=8:K=5  K DK=1  :  SUCCESS  TEST FOR SUCCESS  I,J,K K=0  MP%<>32  I=1 7  J=1 7 K=K+A%(I,J) " J , I 6 K <> 1 @ A%(4,4)<> 1 JSAV("SOL"+(SOL+1)) TSOL=SOL+1 ^ "**SUCCESS**" h "SOL";SOL r |:  BACKONE MP%=MP%-1  MP%=0 "**FAILED**": MX=M%(MP%,1) MY=M%(MP%,2) MX1=M%(MP%,3) MY1=M%(MP%,4) MI=M%(MP%,5) MJ=M%(MP%,6) MK=M%(MP%,7)+1  MK=5 MK=1:MI=MI+1  MI=8 MI=1:MJ=MJ+1  MJ=8 "*FAILED OOPS*": A%(MX,MY)=1 A%((MX+MX1)/2,(MY+MY1)/2)=1 A%(MX1,MY1)=0 &"BACK MOVE" 01,50,73,52 :PY=MP% 8: PX=(MP% 8)*10 DPX,PY);" " N1,50,73,49 XMX=0 b l: v SAV(FIL$) F%=(FIL$) #F%,SOL #F%,MOV  I=1 MP%-1  J=1 7 #F%,M%(I,J)  J  I #F%  :  INK CH%=(0)  CH%<=0   CH%="D" DIS%= DIS%:  CH%<>"S"  "STOPPED" * 4"READY:"; >CH%=: CH% H CH%="B" BACKONE:DISPLAY R CH%="L" LOD \ CH%="S" f"SAVING" pSAV("SOL") z"STARTING"   LOD  FIL$ F%=(FIL$) #F%,SOL,MOV MP%=1 INIT FILL  DISPLAY %MX=#F%:MY=#F%:MX1=#F%:MY1=#F% MI=#F%:MJ=#F%:MK=#F%  M%(MP%,1)=MX  M%(MP%,2)=MY  M%(MP%,3)=MX1 $ M%(MP%,4)=MY1 . M%(MP%,5)=MI 8 M%(MP%,6)=MJ B M%(MP%,7)=MK L : V 1,50,73,52 ` 0,0);MOV; j PY=MP% 8: PX=(MP% 8)*10 %t PX,PY);MP%;".";MJ;".";MI;".";MK ~ 1,50,73,49  : MP%=MP%+1  MI=1:MJ=1:MK=1  MOVE(MX,MY,MX1,MY1) #F%  #F% DISPLAY