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