\ /dfwforth/examples/games/go.frt (* Ê* LANGUAGE Ê Ê: iForth Ê* PROJECT Ê Ê : Forth Environments Ê* DESCRIPTION : Game of GO Ê* CATEGORY Ê Ê: Example Ê* AUTHOR Ê Ê Ê: C.H. Ting, Dr. Dobb's Toolbook of Forth; page 28. Ê* LAST CHANGE : October 4, 1992, Marcel Hendrix Ê*) Ê Ê Ê Ê REVISION -go "€€€ The Game of GO Ê Ê ÊVersion 0.00 €€€" Ê Ê Ê Ê PRIVATES DOC Notes (* ÊI do not play GO, so I don't know if this game works :-) Êdr. Ting notices that because of the recursion used, blocks of more than Ê100 connected stones can lead to a system crash. Ê(xForth allows setting up custom stacks, see for instance ACKERMAN.FRT) *) ENDDOC 0 VALUE color Ê PRIVATE 0 VALUE liberty PRIVATE 1 =: black Ê Ê ÊPRIVATE 2 =: white Ê Ê ÊPRIVATE CREATE map Ê Ê ÊPRIVATE Ê#362 ALLOT : ?OUT Ê Ê Ê Ê ÊDUP 0< OVER #360 > OR ; PRIVATE : ?STONE Ê Ê Ê Êmap + C@ ; PRIVATE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê\ --- : NORTH Ê Ê Ê Ê #19 - ; PRIVATE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê \ --- : SOUTH Ê Ê Ê Ê #19 + ; PRIVATE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê \ --- : EAST Ê Ê Ê Ê ÊDUP #19 MOD #18 = IF DROP #1000 Ê Ê Ê Ê \ --- Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ELSE 1+ Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF ; PRIVATE : WEST Ê Ê Ê Ê ÊDUP #19 MOD IF 1- Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê \ --- Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ELSE DROP #1000 Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF ; PRIVATE : MARK Ê Ê Ê Ê Êmap + DUP C@ Ê#128 OR Ê Ê Ê Ê Ê Ê Ê Ê Ê \ --- <> Ê Ê Ê Ê Ê Ê Ê Ê SWAP C! ; PRIVATE : COUNTS Ê Ê Ê ÊRECURSIVE Ê Ê Ê Ê Ê Ê Ê Ê ?OUT IF DROP EXIT ENDIF Ê Ê Ê Ê Ê Ê Ê Ê DUP ?STONE Ê Ê Êcolor = IF DUP MARK Ê Ê Ê Ê Ê Ê Ê Ê Ê DUP NORTH COUNTS Ê Ê Ê Ê Ê Ê Ê Ê DUP EAST ÊCOUNTS Ê Ê Ê Ê Ê Ê Ê Ê DUP SOUTH COUNTS Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê WEST ÊCOUNTS Ê Ê Ê Ê Ê ÊELSE DUP ?STONE 0= IF MARK 1 +TO liberty Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ELSE DROP Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF Ê Ê Ê Ê Ê ENDIF ; PRIVATE #361. ==: LIMITS ÊPRIVATE : BK Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ." ±±" ; Ê Ê Ê ÊPRIVATE : WT Ê Ê Ê Ê Ê Ê>INVERSE< ." Ê " >INVERSE< ; PRIVATE : CROSS Ê Ê Ê Ê ." .." ; PRIVATE : IND Ê Ê Ê Ê Ê 2 SPACES Ê#19 0 DO ÊI 2 .R ÊLOOP ; PRIVATE : BOARD Ê Ê Ê Ê HOME IND Ê Ê Ê Ê Ê Ê Ê Ê Ê LIMITS DO Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I #19 /MOD SWAP 0= IF CR 2 .R ELSE DROP ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I ?STONE 3 AND DUP 0= IF CROSS DROP Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ELSE black = IF BK ELSE WT ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊLOOP ; ÊPRIVATE : PLACE Ê Ê Ê Ê map + C! ; Ê PRIVATE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê\ --- <> : GOBASE Ê Ê Ê Ê#19 BASE ! ; PRIVATE Ê Ê : HANDICAP Ê Ê Ê[ GOBASE ] Ê Ê Ê Ê Ê Ê Ê Ê 33 39 3F 93 99 9F F3 F9 FF Ê Ê Ê Ê Ê Ê Ê Ê 9 0 DO Êblack SWAP PLACE ÊLOOP Ê Ê Ê Ê Ê Ê Ê Ê [ DECIMAL ] ; PRIVATE : CLRMAP Ê Ê Ê Êmap #362 ERASE ; PRIVATE : KSTONE Ê Ê Ê Êmap + ÊC0! ; Ê Ê PRIVATE Ê Ê Ê Ê Ê Ê Ê Ê\ --- <> : PUT Ê Ê Ê Ê Ê SWAP DO color map I + C! LOOP ; PRIVATE : KMARK Ê Ê Ê Ê map + DUP C@ Ê#64 OR SWAP C! ; ÊPRIVATE : REMOVE Ê Ê Ê ÊRECURSIVE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê \ --- <> Ê Ê Ê Ê Ê Ê Ê Ê ?OUT IF DROP EXIT ENDIF Ê Ê Ê Ê Ê Ê Ê Ê DUP ?STONE #67 AND color Ê Ê Ê Ê Ê Ê= IF DUP KMARK Ê Ê Ê Ê Ê Ê Ê Ê DUP NORTH REMOVE Ê Ê Ê Ê Ê Ê Ê Ê DUP EAST ÊREMOVE Ê Ê Ê Ê Ê Ê Ê Ê DUP SOUTH REMOVE Ê Ê Ê Ê Ê Ê Ê Ê DUP WEST ÊREMOVE Ê Ê Ê Ê Ê Ê Ê Ê KSTONE Ê Ê Ê Ê Ê ÊELSE DROP Ê Ê Ê Ê Ê ENDIF ; PRIVATE : UNMARK Ê Ê Ê Êmap #361 OVER + Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê \ --- <> Ê Ê Ê Ê Ê Ê Ê Ê SWAP DO Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I C@ OVER = IF ÊI C@ Ê3 AND ÊI C! Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊLOOP Ê Ê Ê Ê Ê Ê Ê Ê DROP ; PRIVATE : DESIGNATE Ê Ê LIMITS DO Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I ?STONE #128 = IF black I PLACE LEAVE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊLOOP ; PRIVATE 0 VALUE best-move Ê Ê Ê PRIVATE 0 VALUE best-liberties ÊPRIVATE 0 VALUE best-count Ê Ê ÊPRIVATE : LOOKAHEAD Ê Ê color >S Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê \ --- Ê Ê Ê Ê Ê Ê Ê Ê black OVER PLACE Ê Ê Ê Ê Ê Ê Ê Ê black TO color ÊCLEAR liberty Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê#128 UNMARK Ê#129 UNMARK Ê Ê Ê Ê Ê Ê Ê Ê ÊDUP COUNTS ÊKSTONE Ê Ê Ê Ê Ê Ê Ê Ê Ê S> TO color Êliberty ; PRIVATE : EVAL Ê Ê Ê Ê ÊOVER LOOKAHEAD >S S Ê Ê Ê Ê Ê\ --- <> Ê Ê Ê Ê Ê Ê Ê Ê best-count 1 MAX > Ê Ê Ê Ê Ê Ê Ê Ê OVER best-liberties <= Ê Ê Ê Ê Ê Ê Ê Ê AND IF TO best-liberties ÊTO best-move ÊS> TO best-count Ê Ê Ê Ê Ê Ê Ê Ê Ê ELSE 2DROP -S Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF ; PRIVATE CREATE pattern Ê PRIVATE Ê Ê Ê Ê Ê Ê Ê Ê $1010 , $14 Ê , $44 Ê , $1400 , $4400 , $1001 , Ê Ê Ê Ê Ê Ê Ê Ê $0110 , $404 Ê, $401 Ê, $101 Ê, $104 Ê, $1010 , : ?RANGE Ê Ê Ê ÊCREATE ÊPRIVATE , Ê Ê Ê Ê Ê Ê Ê \ <> --- <> Ê Ê Ê Ê Ê Ê Ê Ê DOES> Ê Ê Ê Ê@EXECUTE Ê Ê Ê Ê Ê Ê Ê Ê\ <> --- Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ?OUT IF DROP black Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊELSE ?STONE 3 AND Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ENDIF ; PRIVATE Ê Ê Ê Ê Ê Ê Ê Ê ' NORTH ?RANGE ?N Ê Ê Ê Ê Ê Ê Ê Ê ' SOUTH ?RANGE ?S Ê Ê Ê Ê Ê Ê Ê Ê ' WEST Ê?RANGE ?W Ê Ê Ê Ê Ê Ê Ê Ê ' EAST Ê?RANGE ?E : +4* Ê Ê Ê Ê Ê 0 Ê 8 0 DO Ê2 LSHIFT + Ê Ê Ê Ê Ê\ .. --- Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê LOOP ; PRIVATE : PNORTH Ê Ê Ê ÊDUP ?N IF DROP 0 EXIT ENDIF Ê Ê \ --- Ê Ê Ê Ê Ê Ê Ê Ê >S Ê Ê Ê Ê Ê Ê Ê Ê S NORTH ?E Ê Ê Ê Ê Ê Ê Ê Ê Ê S ?E Ê Ê Ê Ê Ê Ê Ê Ê Ê S NORTH EAST DUP ?E ÊSWAP ?N Ê Ê Ê Ê Ê Ê Ê Ê Ê S NORTH ?W Ê Ê Ê Ê Ê Ê Ê Ê Ê S ?W Ê Ê Ê Ê Ê Ê Ê Ê S> NORTH WEST DUP ?W SWAP ?N Ê Ê Ê Ê Ê Ê Ê Ê +4* ; PRIVATE : PEAST DUP ?E IF DROP 0 EXIT ENDIF Ê Ê \ --- Ê Ê Ê Ê Ê Ê Ê Ê >S Ê Ê Ê Ê Ê Ê Ê Ê S EAST ?S Ê Ê Ê Ê Ê Ê Ê Ê Ê S ?S Ê Ê Ê Ê Ê Ê Ê Ê Ê S EAST SOUTH DUP ?S ÊSWAP ?E Ê Ê Ê Ê Ê Ê Ê Ê Ê S EAST ?N Ê Ê Ê Ê Ê Ê Ê Ê Ê S ?N Ê Ê Ê Ê Ê Ê Ê Ê S> EAST NORTH DUP ?N SWAP ?E Ê Ê Ê Ê Ê Ê Ê Ê +4* ; PRIVATE : PSOUTH Ê Ê Ê ÊDUP ?S IF DROP 0 EXIT ENDIF Ê Ê \ --- Ê Ê Ê Ê Ê Ê Ê Ê >S Ê Ê Ê Ê Ê Ê Ê Ê S SOUTH ?E Ê Ê Ê Ê Ê Ê Ê Ê Ê S ?E Ê Ê Ê Ê Ê Ê Ê Ê Ê S SOUTH EAST DUP ?E ÊSWAP ?S Ê Ê Ê Ê Ê Ê Ê Ê Ê S SOUTH ?W Ê Ê Ê Ê Ê Ê Ê Ê Ê S ?W Ê Ê Ê Ê Ê Ê Ê Ê S> SOUTH WEST DUP ?W SWAP ?S Ê Ê Ê Ê Ê Ê Ê Ê +4* ; PRIVATE : PWEST Ê Ê Ê Ê DUP ?W IF DROP 0 EXIT ENDIF Ê Ê \ --- Ê Ê Ê Ê Ê Ê Ê Ê >S Ê Ê Ê Ê Ê Ê Ê Ê S WEST ?S Ê Ê Ê Ê Ê Ê Ê Ê Ê S ?S Ê Ê Ê Ê Ê Ê Ê Ê Ê S WEST SOUTH DUP ?E ÊSWAP ?W Ê Ê Ê Ê Ê Ê Ê Ê Ê S WEST ?N Ê Ê Ê Ê Ê Ê Ê Ê Ê S ?N Ê Ê Ê Ê Ê Ê Ê Ê S> WEST NORTH DUP ?N SWAP ?W Ê Ê Ê Ê Ê Ê Ê Ê +4* ; PRIVATE : FIX Ê Ê Ê Ê Ê DUP ROT AND ; PRIVATE Ê Ê Ê Ê Ê \ --- : MATCH Ê Ê Ê Ê DUP 0= ?EXIT Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê\ --- Ê Ê Ê Ê Ê Ê Ê Ê FALSE Ê Ê Ê Ê Ê Ê Ê Ê #12 0 DO ÊOVER Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I pattern []CELL @ Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê FIX = IF DROP TRUE LEAVE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê LOOP Ê Ê Ê Ê Ê Ê Ê Ê NIP ; PRIVATE : EVPAT Ê Ê Ê Ê 1 TO best-count Ê2 EVAL ; PRIVATE : PATS Ê Ê Ê Ê ÊLIMITS DO Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I ?STONE Ê Êwhite AND 0= ?LEAVE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I PNORTH MATCH IF ÊI NORTH EVPAT LEAVE ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I PEAST ÊMATCH IF ÊI EAST ÊEVPAT LEAVE ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I PSOUTH MATCH IF ÊI SOUTH EVPAT LEAVE ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I PWEST ÊMATCH IF ÊI WEST ÊEVPAT LEAVE ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊLOOP ; PRIVATE 0 VALUE ?stop Ê PRIVATE : STOP Ê Ê Ê Ê ÊCLEAR ?stop ; PRIVATE : UNMARKS Ê Ê Ê #129 UNMARK Ê#130 UNMARK ÊTO color ; Ê Ê\ --- <> Ê Ê Ê Ê Ê Ê Ê Ê PRIVATE : EXAMINE Ê Ê Ê #128 UNMARK ÊCLEAR liberty Ê Ê Ê Ê Ê Ê Ê\ <> --- Ê Ê Ê Ê Ê Ê Ê Ê COUNTS liberty ; PRIVATE : WCHO Ê Ê Ê Ê Ê0 Ê Ê Ê Ê Ê Ê Ê Ê #341 #19 DO Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊI #19 MOD ?DUP IF #18 - IF I ?STONE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê #128 = IF ÊI ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊLOOP ; PRIVATE : CHO Ê Ê Ê Ê Ê BEGIN ?DUP WHILE liberty EVAL REPEAT ; PRIVATE : ?CHO Ê Ê Ê Ê Êbest-liberties Êliberty >= ; PRIVATE : BCHO Ê Ê Ê Ê Ê0 ÊLIMITS DO ÊI ?STONE #128 = IF I ENDIF LOOP ; PRIVATE : WEFFECT Ê Ê Ê black UNMARKS Ê#360 TO best-liberties Ê Ê Ê Ê Ê Ê Ê Ê LIMITS DO Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I ?STONE black Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê= IF ÊI EXAMINE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê0= IF I REMOVE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ELSE liberty 3 < IF ?CHO IF WCHO CHO ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊLOOP ; PRIVATE : BEFFECT Ê Ê Ê white UNMARKS Ê Ê Ê Ê Ê Ê Ê Ê LIMITS DO Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê I ?STONE white Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê= IF ÊI EXAMINE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê1 = IF DESIGNATE ÊI REMOVE ÊSTOP LEAVE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊELSE ?CHO IF BCHO CHO ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊLOOP ; PRIVATE : GET# Ê Ê Ê Ê ÊPAD #19 ACCEPT Ê Ê Ê Ê Ê Ê Ê Ê Ê\ <> --- Ê Ê Ê Ê Ê Ê Ê Ê PAD SWAP NUMBER? Ê Ê Ê Ê Ê Ê Ê Ê 1 <> ABORT" huh" ; PRIVATE : ?MOVE Ê Ê Ê Ê BEGIN Ê CR ." Your move: " EOL Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê GET# DUP . Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ?OUT IF ." range? " DROP 0 Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊELSE DUP ?STONE 3 AND Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê 0= IF white SWAP PLACE 1 Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊELSE ." occupied." DROP 0 Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ENDIF Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ENDIF Ê Ê Ê Ê Ê Ê Ê Ê UNTIL ; PRIVATE : .BEST Ê Ê Ê Ê 3 SPACES Ê Ê Ê Ê Ê Ê Ê Ê best-move Ê Ê ÊDEC. Ê Ê Ê Ê Ê Ê Ê Ê best-count Ê Ê DEC. Ê Ê Ê Ê Ê Ê Ê Ê best-liberties DEC. ; PRIVATE : RESUME Ê Ê Ê ÊBEGIN Ê BOARD ?MOVE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê TRUE TO ?stop ÊCLEAR best-count Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê WEFFECT .BEST Ê BEFFECT .BEST Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ?stop IF PATS black best-move .BEST PLACE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê ÊENDIF Ê Ê Ê Ê Ê Ê Ê Ê AGAIN ; : MAIN Ê Ê Ê Ê ÊCLS GOBASE CLRMAP HANDICAP RESUME ; :ABOUT Ê Ê Ê Ê ÊCR ." Type MAIN to start, RESUME to continue." CR ; Ê Ê Ê Ê Ê Ê Ê Ê .ABOUT -go CR Ê Ê Ê Ê Ê Ê Ê Ê DEPRIVE Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê Ê (* End of Source *)