%EXTERNALROUTINE DRAUGHTS(%STRING(12) S) %EXTERNALROUTINESPEC CPULIMIT (%STRING(255) S) %EXTERNALROUTINESPEC PROMPT(%STRING(15) S) %OWNINTEGER MOB WT = 6 %CONSTINTEGER TRUE =1, FALSE = 0 %OWNINTEGER BACK WT = 4 %OWNINTEGER CENT WT = 4 %OWNINTEGER ADV1 WT = 450 %OWNINTEGER ADV2 WT = 50 %OWNINTEGER CRAMP WT = 6 %OWNINTEGER MON = 'Q' %OWNINTEGER A WIN = 0 %OWNINTEGER SEARCH LIMIT = 3 %OWNINTEGER CROWN = 1800 %OWNINTEGERARRAY BACK1(1:5) = 77, 75, 73, 71, 64 %OWNINTEGERARRAY BACK2(1:5) = 0, 2, 4, 6, 13 %OWNINTEGERARRAY CENTSQ(0:7) = 51, 53, 42, 44, 33, 35, 24, 26 %OWNINTEGERARRAY MOVE(0:7) = 9, 18, 11, 22, -9,-18,-11,-22 %OWNINTEGERARRAY PLAYER1(-1:26) = 'W', 1, 77, 75, 73, 71, 64, 66, 62, 60, 57, 55, 53, 51, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 12, 0 %OWNINTEGERARRAY PLAYER2(-1:26) = 'B', 2, 0, 2, 4, 6, 13, 11, 15, 17, 20, 22, 24, 26, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 12, 0 %OWNINTEGERARRAY BOARD(-1:78) = %C ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' %INTEGERARRAY MIN, MAX(1:12) %INTEGERARRAY REPLY(1:9) %INTEGERARRAY COMP, OPP(-1:26) %INTEGERNAME COMPNUM, OPPNUM %INTEGERARRAY PSTACK(1:12); ! piece position take stack %INTEGERARRAY TSTACK(1:12); ! piece type stack %INTEGERARRAY NSTACK(1:12); ! piece number stack %OWNINTEGER SP; ! stack pointer %OWNINTEGER ME = 1 %OWNINTEGER ONE = 1 %OWNINTEGER TWO = 2 %OWNINTEGER THREE = 3 %INTEGER BEST PIECE, BEST MOVE, BEST TAKE %INTEGER VALUEB, I, P, M, PIECE, JMAN, JUMP, DIF, MODIF, MORE %INTEGER OLDPOS, NEWPOS, LASTPOS, COMPOS %INTEGER NODES, PLY NUMBER, EXPECTED MOVE %INTEGER A,B,C,POS !* P L A Y I N G F U N C T I O N S %INTEGERFN VALID POS(%INTEGER POS) %INTEGER I ! on the board? I = POS>>1 %RESULT = -1 %IF POS < 0 %OR POS > 77 %C %OR I = 4 %OR I = 14 %OR I = 24 %OR I = 34 ! square vacant? %CYCLE I = 1, 1, 12 %RESULT = 1 %IF (I <= COMPNUM %AND POS = COMP(I)) %C %OR (I <= OPPNUM %AND POS = OPP(I)) %REPEAT %RESULT = 0 %END %INTEGERFN VALID MOVE(%INTEGER M, P, %INTEGERARRAYNAME COMP, OPP) %INTEGER CPOS, I, T %UNLESS COMP(P+12) = CROWN %START %IF COMP(0) = 1 %START; ! player 1 %RESULT = -1 %IF M&4 = 0; ! backward move %FINISH %ELSE %START; ! else player 2 %RESULT = -1 %IF M&4 # 0; ! backward move %FINISH %FINISH CPOS = COMP(P) %RESULT = -1 %UNLESS VALID POS(CPOS+MOVE(M)) = 0 %RESULT = 0 %IF M&1 = 0; ! ordinary move %RESULT = -1 %IF OPP(25)=0 I = CPOS+MOVE(M-1); ! else take-move %CYCLE T = 1, 1, OPP(25) %RESULT = T %IF I = OPP(T); ! piece to take? %REPEAT %RESULT = -1 %END %INTEGERFN PENDING MOVE(%INTEGERARRAYNAME COMP, OPP) %INTEGER P, M, T, COMPNUM COMPNUM = COMP(25) %RESULT = -1 %IF COMPNUM = 0; ! no pieces left!! %CYCLE P = 1, 1, COMPNUM %CYCLE M = 1, 2, 7 T = VALID MOVE(M, P, COMP, OPP) %RESULT = P %IF T > 0; ! return piece doing take %REPEAT %REPEAT ! ordinary moves %CYCLE P = 1, 1, COMPNUM %CYCLE M = 0, 2, 6 T = VALID MOVE(M, P, COMP, OPP) %RESULT = 0 %IF T = 0; ! move ok %REPEAT %REPEAT %RESULT = -1; ! no moves %END %INTEGERFN CROWNING(%INTEGER POS, PLAYER) ! assumes valid pos %RESULT=TRUE %IF (PLAYER = 1 %AND POS < 7) %C %OR (PLAYER = 2 %AND POS > 70) %RESULT=FALSE %END %INTEGERFN MOD(%INTEGER N) %RESULT = -N %IF N<0 %RESULT = N %END %INTEGERFN VALUE OF SIDE(%INTEGERARRAYNAME COMP, OPP) %INTEGER V1, V2, V3, V4, V5, V6, V7 %INTEGER P, PP, M, MM, MV, ADV1, VM, PLAYER %INTEGERNAME CPOS, CTYPE PLAYER = COMP(0) ! back control V2 = 0 %IF OPP(26) = 0 %START; ! OPP has no crowns yet %IF PLAYER = 1 %START; ! player 1 %CYCLE P = 1, 1, 5 V2 = V2+BACK WT %IF COMP(P) = BACK1(P) %REPEAT %FINISH %ELSE %START; ! player 2 %CYCLE P = 1, 1, 5 V2 = V2+BACK WT %IF COMP(P) = BACK2(P) %REPEAT %FINISH %FINISH V1 = 0; V3 = 0; V4 = 0; V5 = 0; V6 = 0; V7 = 0 %CYCLE P = 1, 1, COMP(25) CPOS ==COMP(P); CTYPE == COMP(P+12) ADV1 = 0 ! add up piece values V1 = V1+CTYPE %CYCLE M = 0, 1, 7 VM = VALID MOVE(M, P, COMP, OPP) MV = MOVE(M) ! centre control %IF CPOS = CENTSQ(M) %START V4 = V4+CENT WT V4 = V4+CENT WT+1 %IF CTYPE = CROWN %FINISH %IF VM >= 0 %START ! mobility V3 = V3+MOB WT V3 = V3+MOB WT %IF VM > 0 %IF CTYPE # CROWN %START ! advancement 1 %IF ADV1 = 0 %AND TRUE=CROWNING(CPOS+MV, PLAYER) %THEN %C V5 = V5+ADV1 WT %AND ADV1 = 1 ! advancement 2 %IF VM = 0 %START; ! ignore jumps to crown CPOS = CPOS+MV %CYCLE MM = 0, 2, 6 %IF TRUE=CROWNING(CPOS+MOVE(MM), PLAYER) %C %AND VALID MOVE(MM, P, COMP, OPP) >= 0 %START V6 = V6+ADV2 WT; %EXIT %FINISH %REPEAT CPOS = CPOS-MV %FINISH %FINISH ! cramp %IF VM = 0 %AND CTYPE = CROWN %AND OPP(25) > 0 %START CPOS = CPOS+MV %CYCLE PP = 1, 1, OPP(25) %CYCLE MM = 1, 2, 7 %IF VALID MOVE(MM, PP, OPP, COMP) >= 0 %START V5 = V5-CRAMP WT; %EXIT %FINISH %REPEAT %REPEAT CPOS = CPOS-MV %FINISH %FINISH %REPEAT %REPEAT %RESULT = V1+V2+V3+V4+V5+V6+V7 %END %INTEGERFN VALUE OF POS(%INTEGERARRAYNAME COMP, OPP) %INTEGER VALUE %IF PENDING MOVE(COMP, OPP) >= 0 %START VALUE = VALUE OF SIDE(COMP, OPP)-VALUE OF SIDE(OPP, COMP)-PLY NUMBER %FINISH %ELSE VALUE = -100000+PLYNUMBER; ! no mobility!! %RESULT = VALUE %IF COMP(0) = ME %RESULT = -VALUE %END %ROUTINE MAKE MOVE(%INTEGER MV, P, %INTEGERNAME T, %C %INTEGERARRAYNAME COMP, OPP) %INTEGERNAME CPOS, CTYPE, OPOS, OTYPE, ONUM, ONUMC CPOS == COMP(P); CTYPE == COMP(P+12) CPOS = CPOS+MV %IF T # 0 %START; ! a take OPOS == OPP(T); OTYPE == OPP(T+12) ONUM == OPP(25); ONUMC == OPP(26) SP = SP+1 PSTACK(SP) = OPOS; ! save position of taken piece TSTACK(SP) = OTYPE; ! save piece type NSTACK(SP) = T; ! save piece number OPOS = OPP(ONUM); ! remove piece from board ONUM = ONUM-1; ! reduce piece count for opp ONUMC = ONUMC-1 %IF OTYPE = CROWN OTYPE = OPP(ONUM+13) %FINISH %IF CTYPE # CROWN %AND TRUE=CROWNING(CPOS, COMP(0)) %START CTYPE = CROWN; ! crown piece COMP(26) = COMP(26)+1; ! increase crown count T = 0; ! no more takes %FINISH %END %INTEGERFN TRY POSSIBLE MOVES(%INTEGER PLY, DEPTH, %C %INTEGERARRAYNAME COMP, OPP) %INTEGER M,MM,MMM,MMF,P,T,TT,APT,VALUE,TAKES,OLDPOS,OLDTYPE %INTEGERNAME MAXPLY, MINPLY %INTEGERFN PURSUIT %RESULT = 1 %IF PLY = 1 %RESULT = \M&1 %END NODES = NODES+1 APT = PENDING MOVE(COMP, OPP) PLY NUMBER = PLY-1 %AND %RESULT = VALUE OF POS(COMP, OPP) %C %IF (DEPTH >= SEARCH LIMIT %AND APT <=0) %OR PLY > 12 MINPLY == MIN(PLY); MINPLY = 100000 MAXPLY == MAX(PLY); MAXPLY =-100000 %IF APT >= 0 %START; ! COMP able to move %IF APT > 0 %START; ! take priority P = APT; APT = 2; MMM = 1 ; MMF = 7 SEARCH LIMIT = 2 %IF PLY = 1 %FINISH %ELSE %START P = 1; APT = 2; MMM = 0; MMF=6 %FINISH %CYCLE P = P, 1, COMP(25) OLDPOS = COMP(P); OLDTYPE = COMP(P+12) %CYCLE M = MMM, APT, MMF TAKES = 0 T = VALID MOVE(M, P, COMP, OPP) %IF T >= 0 %START; ! valid move MM = M; TT = T ANOTHER TAKE: TAKES = TAKES+1 %IF TT > 0 MAKE MOVE(MOVE(MM), P, TT, COMP, OPP);! try this move %IF TT > 0 %START; ! another take %CYCLE MM = 1, 2, 7 TT = VALID MOVE(MM, P, COMP, OPP) -> ANOTHER TAKE %IF TT > 0 %REPEAT %FINISH VALUE = TRY POSSIBLE MOVES(PLY+1, DEPTH+PURSUIT, OPP, COMP) COMP(P) = OLDPOS; COMP(P+12) = OLDTYPE OPP(25) = OPP(25)+TAKES %WHILE TAKES > 0 %CYCLE TT = NSTACK(SP) OPP(TT) = PSTACK(SP) OPP(TT+12) = TSTACK(SP) TAKES = TAKES-1 SP = SP-1 %REPEAT %IF COMP(0) = ME %START %IF VALUE > MAXPLY %START MAXPLY = VALUE %IF PLY = 1 %START BEST MOVE = M BEST TAKE = T BEST PIECE = P %FINISH %FINISH %RESULT = MAXPLY %IF PLY # 1 %AND MAXPLY >= MIN(PLY-1) %FINISH %ELSE %START MINPLY = VALUE %IF VALUE < MINPLY %RESULT = MINPLY %IF MINPLY <= MAX(PLY-1) %FINISH %FINISH %REPEAT %REPEAT %FINISH %RESULT = MAXPLY %IF COMP(0) = ME %RESULT = MINPLY %END %ROUTINE SAY PLEASE PRINTSTRING("Please re-type your move ") %END %ROUTINE PRINT BOARD %INTEGER I, J, POS %CYCLE I = 0, 1, 7 %CYCLE J = 0, 2, 6 BOARD(10*I+J+I&1) = '#' %REPEAT %REPEAT %CYCLE I = 1, 1, 12 %IF I <= COMP(25) %START POS = COMP(I) %IF COMP(I+12) = CROWN %THEN BOARD(POS) = 'X' %C %ELSE BOARD(POS) = 'x' %FINISH %IF I <= OPP(25) %START POS = OPP(I) %IF OPP(I+12) = CROWN %THEN BOARD(POS) = 'O' %C %ELSE BOARD(POS) = 'o' %FINISH %REPEAT PRINTSTRING(" A B C D E F G H") %CYCLE I = 70, -10, 0 NEWLINE PRINTSYMBOL(I//10+'1') %CYCLE J = 0, 1, 7 SPACE PRINTSYMBOL(BOARD(J+I)) %REPEAT SPACE PRINTSYMBOL(I//10+'1') %REPEAT PRINTSTRING(" A B C D E F G H ") %END %ROUTINE TROUT(%INTEGER OLDPOS, NEWPOS, %INTEGERNAME MODE) %INTEGER OLDX, OLDY, NEWX, NEWY OLDY = OLDPOS//10; OLDX = OLDPOS-10*OLDY NEWY = NEWPOS//10; NEWX = NEWPOS-10*NEWY %IF MODE = 0 %THEN PRINTSTRING("DRAFT4's move is ") %AND MODE = 1 %C %ELSE PRINTSTRING(" , ") PRINTSYMBOL(OLDX+'A') PRINTSYMBOL(OLDY+'1') PRINTSYMBOL('-') PRINTSYMBOL(NEWX+'A') PRINTSYMBOL(NEWY+'1') %END %INTEGERFN POSITION OF(%INTEGER S1, S2) %RESULT = (S1-'A')+10*(S2-'1') %END %ROUTINE SKIP SPACES AND NLS SKIP SYMBOL %WHILE NEXT SYMBOL=' ' %OR NEXT SYMBOL=NL %END COMPNUM == COMP(25); OPPNUM == OPP(25) CPULIMIT ("12"); ! FOR EMAS - JGH MOD, AS CS1 WERE RUNNING OUT PRINTSTRING("The Draughts programme DRAFT4.4 ") PRINT STRING("Do you want some help?"); NEWLINE PROMPT(":") READ SYMBOL(REPLY(1)); SKIP SYMBOL %WHILE NEXT SYMBOL#NL; SKIP SYMBOL REPLY(1) = REPLY(1)-32 %IF REPLY(1)>='a' %IF REPLY(1)='Y' %START PRINTSTRING(" Moves are typed in in the following form: (e.g.) C3-D4 move the piece on square C3 to square D4.") PRINTSTRING(" C3-E5 move C3 to E5, taking the piece on D4 "); PRINTSTRING(" C3-E5, E5-C7 an example of a multiple jump e.t.c.") %FINISH RESTART: EXPECTED MOVE = 0 ! setting up the pieces %CYCLE P = -1, 1, 26 COMP(P) = PLAYER1(P) OPP(P) = PLAYER2(P) %REPEAT NEWLINE PRINT STRING("Do you want to start?") NEWLINE PROMPT(":") READ SYMBOL(REPLY(1)) REPLY(1) = REPLY(1)-32 %IF REPLY(1)>='a' SKIP SYMBOL %WHILE NEXT SYMBOL#NL; SKIP SYMBOL %IF REPLY(1)='R' %START ! Read board position %CYCLE P = -1,1,26 COMP(P) = 0 OPP(P) = 0 %REPEAT PRINT STRING("Where are your pieces?"); NEWLINE PROMPT(":") %CYCLE P = 1,1,12 SKIP SPACES AND NLS READ SYMBOL(A); %IF A='.' %THEN %EXIT READ SYMBOL(B); READ SYMBOL(C) A = A-32 %IF A>='a' B = B-32 %IF A>='a' POS = POSITION OF(A,B) OPP(P) = POS %IF C=' ' %THEN OPP(P+12) = 1000 %ELSE OPP(P+12) = CROWN %REPEAT OPP(0) = 2 OPP(25) = P; ! no of pieces. PRINT STRING("Where are my pieces?"); NEWLINE %CYCLE P = 1,1,12 SKIP SPACES AND NLS READ SYMBOL(A); %IF A='.' %THEN %EXIT READ SYMBOL(B); READ SYMBOL(C) A = A-32 %IF A>='a' B = B-32 %IF B>='a' POS = POSITION OF(A,B) COMP(P) = POS %IF C=' ' %THEN COMP(P+12) = 1000 %ELSE COMP(P+12) = CROWN %REPEAT COMP(0) = ME COMP(25) = P; ! NO OF PIECES SKIP SYMBOL; ! NL PROMPT("Your move?") READ SYMBOL(A) SKIP SYMBOL %WHILE NEXT SYMBOL#NL; SKIP SYMBOL A = A-32 %IF A>='a' %IF A='Y' %THEN -> READ MOVE %ELSE -> COMP MOVE %FINISH %IF REPLY(1) = 'N' %START PRINT STRING("Think of a number please"); NEWLINE READ SYMBOL(I); SKIP SYMBOL I = (I-'0')&3 COMP(-1) = 'B'; OPP(-1) = 'W' PRINTSTRING("DRAFT4's opening move is ") %IF I = 1 %THEN PRINTSTRING("D6-C5") %AND COMP(11) = 42 %IF I = 2 %THEN PRINTSTRING("D6-E5") %AND COMP(11) = 44 %IF I = 3 %THEN PRINTSTRING("F6-E5") %AND COMP(10) = 44 NEWLINE %FINISH READ MOVE: PRINT BOARD PROMPT("Your move:") SKIP SYMBOL %WHILE NEXT SYMBOL <= ' ' %CYCLE I = 1, 1, 8 READ SYMBOL(REPLY(I)) REPLY(I) = REPLY(I)-32 %IF REPLY(I)>='a' %EXIT %IF REPLY(I) = NL %REPEAT REPLY(I) = ' ' %AND I = I+1 %UNTIL I = 9 %IF REPLY(1) = 'M' %THEN MON = 'M' %AND -> READ MOVE %IF REPLY(1) = 'Q' %THEN MON = 'Q' %AND -> READ MOVE TRANS: %IF REPLY(1) = 'I' %THEN -> STOP %IF REPLY(6) = ','%THEN MORE = 'M' %ELSE MORE = ' ' OLDPOS = POSITION OF(REPLY(1), REPLY(2)) NEWPOS = POSITION OF(REPLY(4), REPLY(5)) %IF VALID POS(OLDPOS) = -1 %START PRINTSTRING("The square ") PRINT SYMBOL(REPLY(1)); PRINT SYMBOL(REPLY(2)) PRINTSTRING(" does not exist! ") SAY PLEASE -> READ MOVE %FINISH M = VALID POS(NEWPOS) %IF M = -1 %START PRINTSTRING("You cannot move to square ") PRINTSYMBOL(REPLY(4)); PRINTSYMBOL(REPLY(5)) PRINTSTRING("; it does not exist! ") SAY PLEASE -> READ MOVE %FINISH %IF M = 1 %START PRINTSTRING("You cannot move to square ") PRINT SYMBOL(REPLY(4)); PRINT SYMBOL(REPLY(5)) PRINTSTRING("; it is already occupied! ") SAY PLEASE -> READ MOVE %FINISH %CYCLE P = 1, 1, OPP(25) %IF OLDPOS = OPP(P) %THENEXIT %REPEAT %UNLESS OLDPOS = OPP(P) %START PRINTSTRING("You do not have a piece on square ") PRINT SYMBOL(REPLY(1)); PRINT SYMBOL(REPLY(2)) NEWLINE SAY PLEASE -> READ MOVE %FINISH PIECE = P DIF = NEWPOS-OLDPOS MODIF = MOD(DIF) %IF MODIF < 12 %AND EXPECTED MOVE > 0 %START PRINTSTRING("You MUST take the piece that I am offering you ") SAY PLEASE -> READ MOVE %FINISH %IF MODIF < 12 %AND MORE = 'M' %START PRINTSTRING("That's not part of a multiple jump move ") SAY PLEASE -> READ MOVE %FINISH %IF DIF < 0 %AND OPP(PIECE+12) # CROWN %START PRINTSTRING("You cannot move that piece backwards! ") SAY PLEASE -> READ MOVE %FINISH %UNLESS MODIF = 11 %OR MODIF = 9 %OR MODIF = 22 %OR MODIF = 18 %START PRINTSTRING("That move does not exist in my rule book! ") SAY PLEASE -> READ MOVE %FINISH %IF MODIF > 11 %START JUMP = DIF//2 COMPOS = OLDPOS+JUMP %CYCLE I = 1, 1, COMP(25) %EXIT %IF COMPOS = COMP(I) %REPEAT %UNLESS COMPOS = COMP(I) %START PRINTSTRING("You cannot do that. You are not jumping one of my pieces ") SAY PLEASE -> READ MOVE %FINISH JMAN = I %FINISH %ELSE JMAN = 0 MAKE MOVE(DIF, PIECE, JMAN, OPP, COMP) %IF MORE = 'M' %START LASTPOS = NEWPOS READ AGAIN: PROMPT("and:") %CYCLE I = 1, 1, 8 READ SYMBOL(REPLY(I)) REPLY(I) = REPLY(I)-32 %IF REPLY(I)>='a' %EXIT %IF REPLY(I) = NL %REPEAT %IF REPLY(1) = '.'%THEN -> COMP MOVE REPLY(I) = ' ' %AND I = I+1 %UNTIL I = 9 OLDPOS = POSITION OF(REPLY(1), REPLY(2)) NEWPOS = POSITION OF(REPLY(4), REPLY(5)) DIF = NEWPOS-OLDPOS DIF = MOD(DIF) %IF DIF > 11 %AND OLDPOS = LASTPOS %THEN -> TRANS PRINTSTRING("That's not part of a multiple jump Please re-type that part ") -> READ AGAIN %FINISH COMP MOVE: ! COMPUTER MAKES MOVE. %IF COMPNUM = 0 %START PRINTSTRING(" I have no pieces left so I suppose you have won ") -> STOP %FINISH %IF PENDING MOVE(COMP, OPP) = -1 %START PRINTSTRING("I cannot move any of my pieces so you win ") -> STOP %FINISH ! If in end game then increase search. I = COMPNUM+OPPNUM %IF I <= 6 %THEN SEARCH LIMIT = 4 ! FIND BEST MOVE. NODES = 0; SP = 0 VALUEB = TRY POSSIBLE MOVES(1, 1, COMP, OPP) %IF VALUEB <= -99990 %START PRINTSTRING("I resign ") -> STOP %FINISH I = 0 ANOTHER TAKE: TROUT(COMP(BEST PIECE), COMP(BEST PIECE)+MOVE(BEST MOVE), I) MAKE MOVE(MOVE(BEST MOVE), BEST PIECE, BEST TAKE, COMP, OPP) %IF BEST TAKE > 0 %START %CYCLE BEST MOVE = 1, 2, 7 BEST TAKE = VALID MOVE(BEST MOVE, BEST PIECE, COMP, OPP) -> ANOTHER TAKE %IF BEST TAKE>0 %REPEAT %FINISH NEWLINE %IF MON = 'M' %START PRINTSTRING("Nodes considered ="); WRITE(NODES, 4) PRINTSTRING(" Value of board ="); WRITE(VALUEB, 4) NEWLINE %FINISH %IF OPPNUM = 0 %START PRINTSTRING("You have no pieces left so I win ") -> STOP %FINISH EXPECTED MOVE = PENDING MOVE(OPP, COMP) %IF EXPECTED MOVE = -1 %START PRINTSTRING("You cannot move any of your pieces so I win ") -> STOP %FINISH %IF VALUEB >= 99990 %AND AWIN = 0 %START PRINTSTRING("He-He! I am going to win!! ") AWIN = 1 %FINISH -> READ MOVE STOP: PRINTSTRING(" The final board position is - ") PRINT BOARD %END %ENDOFFILE