EXTERNALROUTINE BACKGAMMON (STRING(255) ST)
OWNINTEGER BBOFF,WBOFF,DICE1,DICE2,BARFL,BRDVAL,BSTVAL,COMPVAL
OWNINTEGER M1,M2,M3,M4,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,I,J,K,RUNNING
OWNINTEGER NOMOV,BARPT1,BARPT2,PT1,PT2,L,M,N,TEMP,BSTMOV1,BSTMOV2
OWNINTEGER BSTPT1,BSTPT2,W1,W2,W3,W4,W5,W6,W7,W8,W9,W10
OWNINTEGER SECOND,BV1,BV2,BV3,BV4,BV5,BV6,BV7,BV8,BV9,BV10
CONSTINTEGERARRAY ODDS(1:12)=35,38,44,47,47,53,18,21,15,12,6,9
RECORDFORMAT F(INTEGER WS,BS)
OWNRECORD(f)ARRAY BOARD(0:25){(F)}
OWNINTEGER G,H,PT3,PT4,DICE3,DICE4,BSTPT3,BSTPT4,BARPT3,BARPT4
INTEGERFN HOMEB
INTEGER NO,I
NO=BBOFF
CYCLE I=1,1,6
NO=NO+BOARD(I)_BS
REPEAT
IF NO=15 THENRESULT = 1 ELSERESULT = 0
END
ROUTINE DOBLACK
INTEGER PT,NO,M,D1,D2,D3,D4,TOT
PROMPT ("Point:")
CYCLE
READ(D1); READ(D2)
IF D1>6 OR D2>6 THEN PRINTSTRING("No way") AND NEWLINE ELSEEXIT
REPEAT
IF D1=D2 THEN D3=D1 AND D4=D2 ELSE D3=0 AND D4=0
PRINTSTRING("Your throw was")
WRITE(D1,2); WRITE(D2,2)
NEWLINE
IF BOARD(25)_BS>0 THENSTART
IF BOARD(25-D1)_WS>1 AND BOARD(25-D2)_WS>1 C
THEN PRINTSTRING("You cannot move") AND NEWLINE ANDRETURN
IF BOARD(25)_BS#1 THENSTART
IF D1#D2 THENSTART
IF BOARD(25-D1)_WS>1 THENSTART
BOARD(25-D2)_BS=BOARD(25-D2)_BS+1
BOARD(25)_BS=BOARD(25)_BS-1
BOARD(25-D2)_WS=0
BOARD(0)_WS=BOARD(0)_WS+1
PRINTSTRING("I have made your move")
NEWLINE
RETURN
FINISH
IF BOARD(25-D2)_WS>1 THENSTART
BOARD(25-D1)_BS=BOARD(25-D1)_BS+1
BOARD(25)_BS=BOARD(25)_BS-1
BOARD(25-D1)_WS=0
BOARD(0)_WS=BOARD(0)_WS+1
PRINTSTRING("I have made your move")
NEWLINE
RETURN
FINISH
FINISH
FINISH
FINISH
PRINTSTRING("Make your move"); NEWLINE
CYCLE M=1,1,4
AGN: TOT=D1+D2+D3+D4
IF TOT=0 THENRETURN
READ(PT); IF PT=100 THENRETURN; READ(NO)
IF BOARD(PT)_BS=0 THEN PRINTSTRING("No blacks on point") C
AND NEWLINE AND ->AGN
IF BOARD(25)_BS#0 AND PT#25 THEN C
PRINTSTRING("You have pieces on the bar") AND NEWLINE AND ->AGN
IF PT-NO<=0 THENSTART
IF HOMEB=0 THEN PRINTSTRING("Not all home") AND C
NEWLINE AND ->AGN; ->LEGMOV
FINISH
IF BOARD(PT-NO)_WS>1 THEN PRINTSTRING("White has point") C
AND NEWLINE AND ->AGN
LEGMOV: IF NO=D1 THEN D1=0 ELSESTART
IF NO=D2 THEN D2=0 ELSESTART
IF NO=D3 THEN D3=0 ELSESTART
IF NO=D4 THEN D4=0 ELSESTART
PRINTSTRING("Illegal move"); NEWLINE; ->AGN
FINISH
FINISH
FINISH
FINISH
IF PT-NO <=0 THEN ->BBEARO
BOARD(PT)_BS=BOARD(PT)_BS-1
BOARD(PT-NO)_BS=BOARD(PT-NO)_BS+1
IF BOARD(PT-NO)_WS=1 THEN BOARD(PT-NO)_WS=0 C
AND BOARD(0)_WS=BOARD(0)_WS+1
->SKP
BBEARO: BBOFF=BBOFF+1
BOARD(PT)_BS=BOARD(PT)_BS-1
IF BBOFF=15 THENRETURN
SKP: REPEAT
END
ROUTINE INITIALIZE
WBOFF=0
BBOFF=0
BOARD(1)_WS=2
BOARD(6)_BS=5
BOARD(8)_BS=3
BOARD(12)_WS=5
BOARD(13)_BS=5
BOARD(17)_WS=3
BOARD(19)_WS=5
BOARD(24)_BS=2
END
ROUTINE PRINTSTATE
INTEGER I,J,K,M
NEWLINES(2)
PRINTSTRING(" 12 11 10 9 8 7 6 5 4 3 2 1")
NEWLINE
PRINTSTRING("___________________________________________________")
CYCLE I=0,1,6
NEWLINE
SPACES(2)
CYCLE J=12,-1,1
IF BOARD(J)_WS>I THEN PRINTSYMBOL('W') AND ->RPT
IF BOARD(J)_BS>I THEN PRINTSYMBOL('B') AND ->RPT
SPACE
RPT: IF J=7 THEN PRINTSTRING(" ** ") ELSE SPACES(3)
REPEAT
REPEAT
CYCLE K=6,-1,0
NEWLINE
SPACES(2)
CYCLE M=13,1,24
IF BOARD(M)_WS>K THEN PRINTSYMBOL('W') AND ->RPT2
IF BOARD(M)_BS>K THEN PRINTSYMBOL('B') AND ->RPT2
SPACE
RPT2: IF M=18 THEN PRINTSTRING(" ** ") ELSE SPACES(3)
REPEAT
REPEAT
NEWLINE
PRINTSTRING("____________________________________________________")
NEWLINE
PRINTSTRING(" 13 14 15 16 17 18 19 20 21 22 23 24")
NEWLINE
IF BOARD(0)_WS>0 THENSTART
NEWLINE
PRINTSTRING("There are")
WRITE(BOARD(0)_WS,2)
PRINTSTRING(" whites on the bar")
FINISH
IF BOARD(25)_BS>0 THENSTART
NEWLINE
PRINTSTRING("there are")
WRITE(BOARD(25)_BS,2)
PRINTSTRING(" blacks on the bar")
FINISH
IF WBOFF>0 THENSTART
NEWLINE
PRINTSTRING("white has born off")
WRITE(WBOFF,3)
FINISH
IF BBOFF>0 THENSTART
NEWLINE
PRINTSTRING("black has born off")
WRITE(BBOFF,3)
FINISH
NEWLINE
END
INTEGERFN BBAR
RESULT = BOARD(25)_BS
END
INTEGERFN WBAR
RESULT = BOARD(0)_WS
END
INTEGERFN BSIN
INTEGER I,J; J=0
CYCLE I=1,1,25
IF BOARD(I)_BS=1 THEN J=J+1
REPEAT
RESULT = J
END
INTEGERFN WSIN
INTEGER I,J; J=0
CYCLE I=0,1,24
IF BOARD(I)_WS=1 THEN J=J+1
REPEAT
RESULT = J
END
INTEGERFN BSINCL
INTEGER I,J,K,SUM; SUM=0
CYCLE I=25,-1,1
IF BOARD(I)_BS=1 THENSTART
IF I-12<0 THEN J=0 ELSE J=I-12
CYCLE K=I-1,-1,J
IF BOARD(K)_WS>0 THEN SUM=SUM+ODDS(I-K)
REPEAT
FINISH
REPEAT
RESULT = SUM
END
INTEGERFN WSINCL
INTEGER I,J,K,SUM; SUM=0
CYCLE I=0,1,24
IF BOARD(I)_WS=1 THENSTART
IF I+12>25 THEN J=25 ELSE J=I+12
CYCLE K=I+1,1,J
IF BOARD(K)_BS>0 THEN SUM=SUM+ODDS(K-I)
REPEAT
FINISH
REPEAT
RESULT = SUM
END
INTEGERFN WPTSHOME
INTEGER I,J; J=0
CYCLE I=19,1,24
IF BOARD(I)_WS>1 THEN J=J+1
REPEAT
RESULT = J
END
INTEGERFN BPTSHOME
INTEGER I,J; J=0
CYCLE I=1,1,6
IF BOARD(I)_BS>1 THEN J=J+1
REPEAT
RESULT = J
END
INTEGERFN WPTS
INTEGER I,J; J=0
CYCLE I=1,1,24
IF BOARD(I)_WS>1 THEN J=J+1
REPEAT
RESULT = J
END
INTEGERFN BPTS
INTEGER I,J;J=0
CYCLE I=1,1,24
IF BOARD(K)_BS>1 THEN J=J+1
REPEAT
RESULT = J
END
INTEGERFN WPTSSUCC
INTEGER I,J,K; K=0
CYCLE J=1,1,22
IF BOARD(J)_BS>0 THENSTART
CYCLE I=J+1,1,23
IF BOARD(I)_WS>1 THENSTART
IF BOARD(I+1)_WS>1 THEN K=K+1
FINISH
REPEAT
EXIT
FINISH
REPEAT
RESULT = K
END
INTEGERFN BPTSSUCC
INTEGER I,J,K; K=0
CYCLE J=24,-1,3
IF BOARD(J)_WS>0 THENSTART
CYCLE I=J-1,-1,2
IF BOARD(I)_BS>1 THENSTART
IF BOARD(I-1)_BS>1 THEN K=K+1
FINISH
REPEAT
EXIT
FINISH
REPEAT
RESULT = K
END
INTEGERFN BFST3
INTEGER I,J; J=0
CYCLE I=22,1,25
J=J+BOARD(I)_BS
REPEAT
RESULT = J
END
INTEGERFN WFST3
INTEGER I,J; J=0
CYCLE I=0,1,3
J=J+BOARD(I)_WS
REPEAT
RESULT = J
END
INTEGERFN BFST6
INTEGER I,J; J=0
CYCLE I=19,1,25
J=J+BOARD(I)_BS
REPEAT
RESULT = J
END
INTEGERFN WFST6
INTEGER I,J; J=0
CYCLE I=0,1,6
J=J+BOARD(I)_WS
REPEAT
RESULT = J
END
INTEGERFN BFST12
INTEGER I,J
J=BFST6
CYCLE I=13,1,18
J=J+BOARD(I)_BS
REPEAT
RESULT = J
END
INTEGERFN WFST12
INTEGER I,J
J=WFST6
CYCLE I=7,1,12
J=BOARD(I)_WS+J
REPEAT
RESULT = J
END
INTEGERFN WHOME
INTEGER I,J; J=0
CYCLE I=19,1,24
J=J+BOARD(I)_WS
REPEAT
RESULT = J
END
INTEGERFN BHOME
INTEGER I,J; J=0
CYCLE I=1,1,6
J=J+BOARD(I)_BS
REPEAT
RESULT = J
END
INTEGERFN WTOGO
INTEGER I,J,K,SUM; SUM=0
CYCLE I=0,1,18
J=BOARD(I)_WS
IF J>0 THENSTART
CYCLE K=1,1,J
SUM=SUM+19-I
REPEAT
FINISH
REPEAT
RESULT = SUM
END
INTEGERFN BTOGO
INTEGER I,J,K,SUM; SUM=0
CYCLE I=7,1,25
J=BOARD(I)_BS
IF J>0 THENSTART
CYCLE K=1,1,J
SUM=SUM+I-6
REPEAT
FINISH
REPEAT
RESULT = SUM
END
ROUTINE GBRDVAL
V1=W1*(BBAR-WBAR)
V2=W2*(BSIN-WSIN)
V3=W3*(BSINCL-WSINCL)//10
V4=W4*(WPTSHOME-BPTSHOME)
V5=W5*(WPTS-BPTS)
V6=W6*(WPTSSUCC-BPTSSUCC)
V7=W7*(BFST6-WFST6)
V8=W8*(BTOGO//6-WTOGO//6)
V9=W9*(BFST3-WFST3)
V10=W10*(WHOME-BHOME)
BRDVAL=V1+V2+V3+V4+V5+V6+V7+V8+V9+V10
END
ROUTINE GBRD
V1=W1*(BBAR)
V2=W2*(-WSIN)
V3=W3*(-WSINCL)//10
V4=W4*(WPTSHOME)
V5=W5*(WPTS)
V6=W6*(WPTSSUCC)
V7=W7*(-WFST6)
V8=W8*(-WTOGO)//6
V9=W9*(-WFST3)
V10=W10*(WHOME)
BRDVAL=V1+V2+V3+V4+V5+V6+V7+V8+V9+V10
IF BRDVAL>BSTVAL THENSTART
BV1=V1; BV2=V2; BV3=V3; BV4=V4; BV5=V5; BV6=V6; BV7=V7; BV8=V8
BV9=V9; BV10=V10; BSTVAL=BRDVAL; BSTMOV1=DICE1; BSTPT1=PT1
BSTMOV2=DICE2; BSTPT2=PT2; BSTPT3=PT3; BSTPT4=PT4
FINISH
END
ROUTINE MTSTMOV (INTEGER P,D,INTEGERNAME BP)
BOARD(P)_WS=BOARD(P)_WS-1
BOARD(P+D)_WS=BOARD(P+D)_WS+1
IF BOARD(P+D)_BS=1 THEN BOARD(P+D)_BS=0 C
AND BOARD(25)_BS=BOARD(25)_BS+1 AND BP=1
END
ROUTINE CLTSTMOV (INTEGER P,D,INTEGERNAME BP)
BOARD(P)_WS=BOARD(P)_WS+1
BOARD(P+D)_WS=BOARD(P+D)_WS-1
IF BP=1 THEN BOARD(P+D)_BS=1 AND BOARD(25)_BS=BOARD(25)_BS-1 C
AND BP=0
END
ROUTINE MMOVE (INTEGER P,D)
BOARD(P)_WS=BOARD(P)_WS-1
BOARD(P+D)_WS=BOARD(P+D)_WS+1
BOARD(25)_BS=BOARD(25)_BS+BOARD(P+D)_BS
BOARD(P+D)_BS=0
END
ROUTINE GOOD (INTEGERNAME S,WT)
IF S=0 THENRETURN
IF S<0 THEN WT=WT-1 ELSE WT=WT+1
END
ROUTINE BAD (INTEGERNAME S,WT)
IF S=0 THENRETURN
IF S>0 THEN WT=WT-1 ELSE WT=WT+1
END
ROUTINE LOADWTS
W1 = 19
W2 = 117
W3 = 102
W4 = 15
W5 = 15
W6 = 12
W7 = 64
W8 = 43
W9 = 62
W10 = 15
END
ROUTINE DUMPWTS
SELECTOUTPUT(2)
NEWLINES(3); WRITE(W1,1); NEWLINE; WRITE(W2,1)
NEWLINE; WRITE(W3,1); NEWLINE; WRITE(W4,1)
NEWLINE; WRITE(W5,1); NEWLINE; WRITE(W6,1)
NEWLINE; WRITE(W7,1); NEWLINE; WRITE(W8,1)
NEWLINE; WRITE(W9,1); NEWLINE; WRITE(W10,1)
END
INTEGERFN WBEARO
INTEGER I,J; J=WBOFF
CYCLE I=19,1,24
J=J+BOARD(I)_WS
REPEAT
RESULT = J
END
ROUTINE DOBEST(INTEGER D)
IF D#0 THENSTART
IF BOARD(25-D)_WS>0 THENSTART
BOARD(25-D)_WS=BOARD(25-D)_WS-1
WBOFF=WBOFF+1
FINISHELSESTART
IF BOARD(25-D+1)_WS>0 THENSTART
BOARD(25-D+1)_WS=BOARD(25-D+1)_WS-1
WBOFF=WBOFF+1
FINISHELSESTART
CYCLE M=19,1,25-D
IF WBOFF<8 THENSTART
IF BOARD(M)_WS>2 THEN MMOVE(M,D) ANDRETURN
FINISHELSESTART
IF BOARD(M)_WS>1 THEN MMOVE(M,D) ANDRETURN
FINISH
REPEAT
CYCLE M=19,1,24
IF DICE2+M<25 THENSTART
IF BOARD(M)_WS>0 THEN MMOVE(M,DICE2) ANDRETURN
FINISHELSESTART
IF BOARD(M)_WS>0 THENSTART
BOARD(M)_WS=BOARD(M)_WS-1
WBOFF=WBOFF+1; RETURN
FINISH
FINISH
REPEAT
FINISH
FINISH
FINISH
END
ROUTINE MTSTBOFF(INTEGER NUM,DIE)
IF NUM+DIE<25 THENSTART
IF BOARD(NUM+DIE)_BS=0 THEN MMOVE(NUM,DIE) ELSE NOMOV=1
FINISHELSESTART
BOARD(NUM)_WS=BOARD(NUM)_WS-1
WBOFF=WBOFF+1
FINISH
END
ROUTINE CLTSTBOFF(INTEGER NUM,DIE)
TEMP=0
IF NUM+DIE<25 THEN CLTSTMOV(NUM,DIE,TEMP) ELSESTART
BOARD(NUM)_WS=BOARD(NUM)_WS+1
WBOFF=WBOFF-1
FINISH
END
!
!
!
LOADWTS
SELECTINPUT(0)
CLOSESTREAM(1)
INITIALIZE
PRINTSTATE
STRT: CYCLE
READ(DICE1); READ(DICE2); BSTVAL=X'80000000'
IF DICE1=DICE2 THEN DICE3=DICE1 AND DICE4=DICE2 C
ELSE DICE3=0 AND DICE4=0
RUNNING=0
IF WBEARO=15 THEN -> BEAROFF
TEMP=BBOFF
CYCLE L=0,1,24
IF BOARD(L)_WS>0 THENEXIT
TEMP=TEMP+BOARD(L)_BS
REPEAT
IF TEMP=15 THEN RUNNING=1 AND -> RUN
M1=0;M2=0;M3=0;M4=0;BARFL=0
IF WBAR>0 THENSTART
IF WBAR>1 THENSTART
IF BOARD(DICE1)_BS<2 THEN MMOVE(0,DICE1)
IF BOARD(DICE2)_BS<2 THEN MMOVE(0,DICE2)
-> DONE
FINISH
IF BOARD(DICE1)_BS>1 AND BOARD(DICE2)_BS>1 THEN -> DONE
BARFL=1
FINISH
CYCLE K=1,1,2
IF K=1 THEN SECOND=0 ELSESTART
TEMP=DICE1; DICE1=DICE2; DICE2=TEMP; SECOND=1
FINISH
CYCLE I=0,1,23
IF BOARD(I)_WS>0 THEN PT1=I ELSE -> CYC1
IF PT1+DICE1<25 AND BOARD(PT1+DICE1)_BS<2 THENSTART
MTSTMOV(PT1,DICE1,BARPT1); M1=1
IF WBEARO=15 THEN DICE1=0 AND -> BEAROFF
IF SECOND=1 THEN N=I+1 ELSE N=I
CYCLE J=N,1,24
IF BOARD(J)_WS>0 THEN PT2=J ELSE -> CYC2
IF PT2+DICE2<25 AND BOARD(PT2+DICE2)_BS<2 THENSTART
MTSTMOV(PT2,DICE2,BARPT2); M2=1
IF DICE1=DICE2 THENSTART
IF WBEARO=15 THEN DICE2=0 AND DICE1=0 AND -> BEAROFF
CYCLE G=J,1,23
IF BOARD(G)_WS>0 THEN PT3=G ELSE -> CYC3
IF PT3+DICE1<25 AND BOARD(PT3+DICE1)_BS<2 C
THENSTART
MTSTMOV(PT3,DICE1,BARPT3); M3=1
IF WBEARO=15 THEN DICE1=0 AND DICE2=0 C
AND DICE3=0 AND -> BEAROFF
CYCLE H=G,1,23
IF BOARD(H)_WS>0 THEN PT4=H ELSE -> CYC4
IF PT4+DICE2<25 AND BOARD(PT4+DICE2)_BS<2 C
THENSTART
MTSTMOV(PT4,DICE2,BARPT4); M4=1
GBRD
CLTSTMOV(PT4,DICE2,BARPT4)
FINISH
CYC4: REPEAT
IF M4=0 THEN GBRD AND BSTVAL=X'80000000'
CLTSTMOV(PT3,DICE1,BARPT3)
FINISH
CYC3: REPEAT
IF M3=0 THEN GBRD AND BSTVAL=X'80000000'
FINISHELSE GBRD
CLTSTMOV(PT2,DICE2,BARPT2)
FINISH
CYC2: REPEAT
IF M2=0 THEN GBRD AND BSTVAL=X'80000000'
CLTSTMOV(PT1,DICE1,BARPT1)
FINISH
EXITIF BARFL=1
CYC1: REPEAT
EXITIF DICE1=DICE2
REPEAT
IF M1=1 THEN MMOVE(BSTPT1,BSTMOV1)
IF M2=1 THEN MMOVE(BSTPT2,BSTMOV2)
IF DICE1=DICE2 THENSTART
IF M3=1 THEN MMOVE(BSTPT3,BSTMOV1)
IF M4=1 THEN MMOVE(BSTPT4,BSTMOV2)
FINISH
DONE: IF WBOFF=15 THEN PRINTSTRING("yeah") AND NEWLINE ANDEXIT
PRINTSTATE; DOBLACK
IF BBOFF=15 THEN PRINTSTRING("pity") AND NEWLINE ANDEXIT
IF RUNNING=1 THEN -> STRT
GBRDVAL
IF BRDVAL=COMPVAL THEN -> STRT
IF COMPVAL<BRDVAL THENSTART
GOOD(BV1,W1); GOOD(BV2,W2); GOOD(BV3,W3); GOOD(BV4,W4)
GOOD(BV5,W5); GOOD(BV6,W6); GOOD(BV7,W7); GOOD(BV8,W8)
GOOD(BV9,W9); GOOD(BV10,W10)
FINISHELSESTART
BAD(BV1,W1); BAD(BV2,W2); BAD(BV3,W3); BAD(BV4,W4); BAD(BV5,W5)
BAD(BV6,W6); BAD(BV7,W7); BAD(BV8,W8); BAD(BV9,W9); BAD(BV10,W10)
FINISH
COMPVAL=BRDVAL; -> STRT
RUN: IF DICE2>DICE1 THENSTART
TEMP=DICE2; DICE2=DICE1; DICE1=TEMP
FINISH
TEMP=0
CYCLE I=1,1,18
IF BOARD(I)_WS>0 THENSTART
MMOVE(I,DICE1); TEMP=1
CYCLE J=I,1,18
IF BOARD(J)_WS>0 THENSTART
IF DICE1#DICE2 THEN MMOVE(J,DICE2) C
ELSE MMOVE(J,DICE1); TEMP=2
IF DICE1=DICE2 THENSTART
CYCLE G=J,1,18
IF BOARD(G)_WS>0 THENSTART
MMOVE(G,DICE1); TEMP=3
CYCLE H=G,1,18
IF BOARD(H)_WS>0 THENSTART
MMOVE(H,DICE2); TEMP=4
EXIT
FINISH
REPEAT
EXIT
FINISH
REPEAT
FINISH
EXIT
FINISH
REPEAT
EXIT
FINISH
REPEAT
IF DICE1=DICE2 AND TEMP=4 THEN -> DONE
IF DICE1#DICE2 AND TEMP=2 THEN -> DONE
IF DICE1#DICE2 THEN DICE1=0 AND -> BEAROFF
DICE1=0
IF TEMP>1 THEN DICE2=0
IF TEMP>2 THEN DICE3=0
BEAROFF: RUNNING=1
TEMP=WBOFF
CYCLE M=24,-1,19
IF BOARD(M)_BS>0 THEN -> SAFETY
TEMP=TEMP+BOARD(M)_WS
IF TEMP=15 THENEXIT
REPEAT
IF DICE1>DICE2 THENSTART
TEMP=DICE2; DICE2=DICE1; DICE1=TEMP
FINISH
IF DICE1#0 THENSTART
IF BOARD(25-DICE1)_WS>0 THENSTART
BOARD(25-DICE1)_WS=BOARD(25-DICE1)_WS-1
WBOFF=WBOFF+1
FINISHELSESTART
IF BOARD(25-DICE1+1)_WS>0 THENSTART
BOARD(25-DICE1+1)_WS=BOARD(25-DICE1+1)_WS-1
WBOFF=WBOFF+1
FINISHELSESTART
CYCLE M=19,1,25-DICE1
IF WBOFF<8 THENSTART
IF BOARD(M)_WS>2 THEN MMOVE(M,DICE1) AND -> SEC
FINISHELSESTART
IF BOARD(M)_WS>1 THEN MMOVE(M,DICE1) AND -> SEC
FINISH
REPEAT
CYCLE M=19,1,24
IF DICE2+M<25 THENSTART
IF BOARD(M)_WS>0 THEN MMOVE(M,DICE1) ANDEXIT
FINISH
IF M+DICE2=25 THENSTART
IF BOARD(M)_WS>1 THEN MMOVE(M,DICE1) ANDEXIT
FINISH
IF DICE2+M>25 THENSTART
IF BOARD(M)_WS>0 THENSTART
IF M+DICE1<25 THEN MMOVE(M,DICE1) ELSE C
WBOFF=WBOFF+1 AND BOARD(M)_WS=BOARD(M)_WS-1
EXIT
FINISH
FINISH
REPEAT
FINISH
FINISH
FINISH
SEC: DOBEST(DICE2)
IF DICE4=0 THEN ->DONE
DOBEST(DICE3)
DOBEST(DICE4)
->DONE
SAFETY: IF DICE4#0 THENSTART
IF DICE3=0 THEN DICE1=DICE4 AND DICE4=0 ELSESTART
IF DICE2=0 THENSTART
DICE1=DICE4; DICE4=0; DICE2=DICE3; DICE3=0
FINISHELSESTART
IF DICE1=0 THEN DICE1=DICE4 AND DICE4=0
FINISH
FINISH
FINISHELSESTART
IF DICE1=0 THEN DICE1=DICE2 AND DICE2=0
FINISH
IF DICE1<DICE2 THENSTART
TEMP=DICE2; DICE2=DICE1; DICE1=TEMP
FINISH
CYCLE K=35,3,56
CYCLE I=19,1,24
IF BOARD(I)_WS>0 THENSTART
NOMOV=0; MTSTBOFF(I,DICE1)
IF NOMOV=1 THEN ->REP1
IF DICE2=0 THENSTART
IF WSINCL<K THEN ->DONE
FINISHELSESTART
CYCLE J=19,1,24
IF BOARD(J)_WS>0 THENSTART
NOMOV=0; MTSTBOFF(J,DICE2)
IF NOMOV=1 THEN ->REP2
IF DICE3=0 THENSTART
IF WSINCL<K THEN ->DONE
FINISHELSESTART
CYCLE G=19,1,24
IF BOARD(G)_WS>0 THENSTART
NOMOV=0; MTSTBOFF(G,DICE3)
IF NOMOV=1 THEN ->REP3
IF DICE4=0 THENSTART
IF WSINCL<K THEN ->DONE
FINISHELSESTART
CYCLE H=19,1,24
IF BOARD(H)_WS>0 THENSTART
NOMOV=0; MTSTBOFF(H,DICE4)
IF NOMOV=1 THEN ->REP4
IF WSINCL<K THEN ->DONE
CLTSTBOFF(H,DICE4)
FINISH
REP4: REPEAT
FINISH
CLTSTBOFF(G,DICE3)
FINISH
REP3: REPEAT
FINISH
CLTSTBOFF(J,DICE2)
FINISH
REP2: REPEAT
FINISH
CLTSTBOFF(I,DICE1)
FINISH
REP1: REPEAT
REPEAT
REPEAT
DUMPWTS
END
begin
backgammon("")
end
ENDOFFILE