#!/usr/bin/d4x # # GO or WEIQI # Configured for linux xterm # requires font alef16.bdf (alef). # requires SET_TTY to be run with rxvt Z<-WEIQI.D4F |Weiqi Z<-?((+/#ts) #mod 1024)r2 |Randomise $DELAY<-#fi "1" #ifndef "DELAY" $WEIQI_DIR<- "../weiqi/" #ifndef "SGFDIR" MOUSE_MAGIC<-19744 | 0X00004D20 for cx cy M cb G.FILE<-"x001.mgt" G.TERM<-"ascii" #ifndef "tty" G.BONW<-0 | White on black writing (black background) G.VSWAP<-0 1 4 5 2 3 8 7 6 9 | Swap block characters Z<-WEIQI_INIT #fi "19" #ifndef "NSIZE" Z<-DO (1 SPLIT PROGRAM_MNU)[0] Z<-ADD_ALIAS WEIQI.D4S "WEIQI.D4S" eqi|WW.ED"weiqi.d4f ",ARGS xqi|#copy"weiqi.d4f" & WEIQI.D4F boardsize|Z<-WEIQI_INIT ARGS infoqi|3 #sed"X:d;$ weiqi.inf" & Z<-WW.FSCR 3 ftr|REVIEW G.TEXT<-B_TR $WEIQI_DIR, G.FILE<-ARGS selqi|SEL.FILE"-x ftr ", ARGS xbw|G.BONW<-1-G.BONW gobot|GOBOT ARGS mouse|$MOUSE<-_ESC,"[?9h" & $MOUSE mktr|ZT<-ED_GO ARGS weiqi|SGF<-WEIQI_PROG ARGS gnugo|#cmd"/home/tony/gnugo-3.2/interface/gnugo ", ARGS tail|ZT<-TAIL ARGS & ZT programs|Z<-RUN PROGRAM_MNU progopt|H<-#cmd"< ",$GOPROG," --help 2>&1" & 0 r EDIT"H" scan_ascii|H<-SCAN_BOARDS ARGS gomoku|Z<-PLAY_GOMOKU ARGS s_gobot|DO"si 112";G.TERM<-"rxvt";G.BONW<-1;GOBOT"-d 750 -shuffle ../weiqi/*.MGT" "PROGRAM_MNU" gnugo-3.2 lite|$GOPROG<-"/home/tony/gnugo-3.2/interface/gnugo -M16 --clock 600 --autolevel 2>error.log" & TR.DELAY<-8 gnugo-3.2 slow & heavy|$GOPROG<-"/home/tony/gnugo-3.2/interface/gnugo -M 16 " & TR.DELAY<-8 "weiqi.inf" >> EOF For details of the game of Weiqi see the newsgroup rec.games.go http://www.britgo.org/gopcres/gopcres1.html http://d4maths.lowtech.org/weiqi.htm pollybis telnet://igs.joyjoy.net 6969 Rxvt interface for GNUGO-3.2 Go Moku. The ascii boards can be improved by using special line drawing characters in the X-font 'alef'. In the normal distributions these fonts are in a directory /home/font. The fonts are in the file 'etc.tgz'. To make these fonts visible to the X-windows system it is necessary to run the following commands:- mkfontdir /home/font xset +fp /home/font xset fp rehash To open a terminal window suitable for use with the new character set type the following commands. The script test.afn contains the settings for various resources, including X-font files. Change the variable $LOCAL_XFONT to point to the directory containing alef.bdf. rxvt -fn alef -e ./d4x test.afn v=2 & In the new terminal, run the go programs as shell commands. weiqi {--color color} {--boardsize size} {-o sgf_file} gomoku {--color color} {--boardsize size} {-o sgf_file} Note: old version gnugo-3.2 does not compile correctly with new versions of gcc. $(CFLAGS) is wrong with spurious -Wp,-lang-c89 option. EOF Z<-WEIQI_INIT N;J;JX;M;N1 |Default board size G.NSQ<-*/G.SZ2<-2/G.SZ<-N<-19 #ifndef "N" & N1<-N+1 G.AZ<-LOALPHA[#av N t ALPHA] GC2<- #av 167 169 172 170 171 168 173 ->(~G.TERM #equiv "rxvt")/ASCII GC.IDX<-#av 32 32 163 164 165 166 162 167 161 167 0 r #do (G.BONW)/"GC.IDX<-GC.IDX[G.VSWAP]" Z<-GC2[0 1 d (N*1 2)r 0 ,y,(1,(N-2),1)/:(1,N-1)/3 2 r 1+i7] ->AA ASCII: GC.IDX<-" O X o x " Z<-(iN)e(N%2),(N>7)/2+N>17 & Z<-".+"[,Z #outer f Z<-ZcmZ] Z<-0 1 d (N*1 2)r" ",y Z AA:G.BOARD<-Z," " |Adjacency list J<-(07)/2+N>17 & Z<-".+"[Z #outer f Z<-ZcmZ] "ASCII.CMD" Input|((_1tWW.INMOVE)r" ")#wput WW.INMOVE & Z<-q WW.INMOVE Undo |Z<-"undo" Pass |Z<-"pass" Quit |Z<-"quit" Edit |Z<-WW.ED"xx.tmp .z" Done |Z<-"quit" Shell|_CLS & Z<-0 r DSH Z<-SGF.INI MODE;PB;PW;T Z<-7 #sed ":d" T<-#sstomat"/Player/Computer" PW<-#deb T["p"=MODE[_1+MODEi"o"]] PB<-#deb T["p"=MODE[_1+MODEi"x"]] Z<- "(GN[D4 Input]FF[4]PW[",PW,"]PB[",PB,"]" #print Z<- Z, "SZ[##]DT[####-##-##]" z G.SZ, 3 t #ts Z<-T.WW #window 3 7 Z<-TXT X_SGFKEY KEY Z<-(KEY,"[.*]") #rxfind TXT Z<-#deb (1+rKEY)d_1dZ<-TXT[Z[0]+iZ[1]] Z<-B_TR F;A;T;U |Transcript and variables ->(0=rZ<-, #files F<-#deb F)/0 Z<-#deb (32 <= #av Z)/Z<- #zload F |Deal with mixed case tags, such as SiZe[19] U<-~+\(Z="[")-0 ,_1m1dZ="]" & Z<-(~U*Z #ne UPALPHA[#av Z])/Z Z[(Z=";")/irZ]<-_CR A<-Z Z<-7 #sed "X:d;$Z;s/WL[.*]//*;s/BL[.*]//*;.0;d/SZ[/" IF 0=rZ<-A X_SGFKEY "SZ"; Z<-"19" G.SZ<-#val Z G.PB<-A X_SGFKEY "PB" G.PW<-A X_SGFKEY "PW" G.WR<-A X_SGFKEY "WR" G.BR<-A X_SGFKEY "BR" G.KM<-A X_SGFKEY "KM" G.RE<-A X_SGFKEY "RE" G.DT<-A X_SGFKEY "DT" G.EV<-A X_SGFKEY "EV" Z<-"/(B)",G.PB," ",G.BR," -(W)",G.PW," ",G.WR IF 0(_QUIT, _QUIT, _UNDO, _PASS, _SHELL, AA) [(_ESC,"qups") i #av K] ->(Z < G.NSQ)/_PUT ->(_UNDO, _PASS, _SHELL, _QUIT)[Z-G.NSQ] _PUT: 7 #print ";",".WB"[1tCO],"[",G.AZ[mG.SZ2nZ],"]" X<-X S_PUT CO[0],P<-Z & CO<-1mCO & J++ & ->AA _UNDO: ->(J<2)/AA X<-G_GOTO J<-J-1 & 7 #sed"X.z;d" & CO<-1mCO & ->AA _PASS: 7 #print ";",".WB"[1tCO],"[pass]" & CO<-1mCO & ->AA _SHELL: Z<-DSH & ->AA _QUIT: ->(0=rOFILE)/XX Z<-#sed":u ",OFILE XX:Z<-"" Z<-DZ BAR_MENU M;N |Paste bar menu and return coordinates N<-rM<-" ", M M #wput DZ, r: M<-,M Z<-((rZ)rDZ)+Z<-0, 1+yN[1]*iN[0] Z<-P S_PUT Y;C;CO;I;J |Place move and remove captives P[J<-1dY]<-C<-".WB"[1tY] CO<-"BW"[C="B"] & I<-(CO=P[I])/I<-G.N4[J] AA: ->(0=rI)/XX P[P S_DEAD 1tI]<-"." & I<-1dI & ->AA XX:Z<-P Z<-X S_DEAD Y;C;J;DN |Return dead stones if point at Y has no liberties C<-X[Z<-Y] AA: J<-(~J e Z)/J<-(J>=0)/J<-,G.N4[Z] ->("." e X[J])/XX | A liberty ->(~ C e X[J])/0 | End of group Z<-Z, (X[J]=C)/J & ->AA XX:Z<-i0 Z<-GOBOT STR;LST;DIR;DL;I;J;M;N;X;Y;SCR |Go Robot. SDIR<-"" & DL<-1000 & QS<-0 & SCR<-#screen STR<-"-shuffle QS<-1|-d DL<- #fi SHIFT|-dir SDIR<-SHIFT"GETOPTS STR M<-1tr:LST<-D4.XFL "[//[/[*" #rxsubs SDIR,((0(J>N)/CC Y<-$T[J] & X<-X S_PUT (".WB"i1tY), G.SZ2 b G.AZ i Y[3 2] Z #wput 4 4,r Z<-V_MAP X WEIQI.CUT<-#wget 0 0, #screen 0 r #sleep 0, 1000*DL J++ & ->BB CC: 0 r #sleep 0, 1000*DL WEND Z<-"" Z<-G_GOTO NP;J;Y |Goto move NP of transcript J<-0 & Z<-,G.SZ2 r "." WHILE J ", #deb $GOPROG," --mode=ascii ", COLOR ," ",SZ, " ", STR Z<-#del "xx.tmp" Z<-(CMD," --quiet >> xx.tmp") #open 3 5 Q<-P<-0 _CLS AA: Z<- #sleep TR.DELAY BB: ->(0 = r A<- A_GET "xx.tmp")/AA A #wput 2 2, rA INLIN<-TR_GET z P & ->(0=rINLIN)/BB SEND INLIN ->(INLIN #equiv "quit")/XX ->AA XX: 0 r #cursor 23 0 78t "Ok. Thank you for playing" Z<-#close 3 Z<-TR_GET STR;CMD;K;P;N2;ZLIST |Get a move from user N2<-*/G.SZ2 CMD<-1 SPLIT ASCII.CMD (,BUTTON.TXT) #wput (BUTTON.CZ[0:]), r: ,BUTTON.TXT ZLIST<-G.CZ,:BUTTON.CZ P<- #fi STR P<-P MZGETS ZLIST ->(P0 MOVE: Z<-G.SZ2 n P Z<- G.ALPHA[Z[1]],z G.SZ-Z[0] Z<-A_GET FILE;H;T |Get last board image from a file Z<-"" & T<-TAIL"-z -n ",(z7+G.SZ), " ", FILE ->(c/TR.THINK #find T[_1+1tr:T])/0 Z<-((-G.SZ+2),1dr:T)tT Z<-".OX" V_MAP "/+/./*" #rxsubs ,((2*G.SZ)r1 0)/(1 2*G.SZ) t 1 4dZ Z<-TR.NLINE,Z,TR.NLINE Z<-H,: Z,: H<-" ", TR.ALINE, " " Z<-TAIL STR;N;T;L;W;ZAP |Get last lines from file ZAP<-0 & W<-64 STR<-"-n N<-SHIFT|-w W<-#fi SHIFT|-z ZAP<-1" GETOPTS STR L<-W*N<-#fi "1" #ifndef "N" Z<-STR #open 7 1 |File length and block length L<-LfZ<-+/1024 1 * #fsize 7 1024 ZT<-T<-$VA[7,(Z-L),L,0] | Read end blocks 0 r #close 7 Z<-#sstomat _LF,T<-(T #ne _CR)/T Z<-((-N),1dr:Z) t Z ->(0=ZAP)/0 ZAP<-~f/yZ=" " Z<-ZAP/:Z Z<-P MZGETS ZLIST;I;J;SZ;T;YX |Use Xterm mouse |Global K P<-0 #ifndef "P" & SZ<- #screen T<-,SZrZ<-_1 & T[J, 1+J<-SZ b ZLIST]<-I,I<-i1tr:ZLIST WHILE Z<0 Z<-P #zgets ZLIST BREAKIF MOUSE_MAGIC #ne MOUSE_MAGIC #and K<-k 0 r #cursor YX<-_33+2t(4r256)nK & Z<-T[SZ b YX] & K<-#av _CR WEND Z<-SCAN_BOARDS STR;F;C;I;J;OFILE;P;T |Scan ascii boards (output of gnugo). F<-"-o OFILE<-SHIFT" GETOPTS STR<-"" #ifndef "STR" F<-F,(0=rF)/"xx.tmp" I<-0 #sed ":r ", F ->(0=rI<-#nfind TR.ALINE)/XX Z<-"" & C<-"BW" AA: ->(0=rI)/XX T<-$T[(1tI)+i2+G.SZ] T #wput 0 0, rT P<-C[0] READ_MOVE T Z<-Z,((" ",_CR)["B"=C[0]]), C[0]," ",P C<-mC I<-2dI & ->AA XX: Z<-C READ_MOVE M;J |Get coordinates of (*) from ascii board J<-("(","OX"[C="B"],")") #find M J<-(rM)nJ<-J/ir,M & Z<-((M[0])[1+J[1]]),z1+G.SZ-J[0] "gomoku.inf" >>EOF Rxvt-Gomoku Version 0.0 Usage : gomoku [-opts] Main Options: --help Display this help message -term terminal. 'rxvt' or 'ascii'. -size num Set the board size to use (3--21) --boardsize num -color Choose your color 'black','white','auto' --color -o file write sgf output to file --debug verbose output EOF "GOMOKU_TEXT" Undo Pass Shell Quit "gomoku.opts">>EOF --help QH<-1 -term G.TERM<-SHIFT -size SZ<-#fi SHIFT --boardsize SZ<-#fi SHIFT -color COLOR<-LOALPHA [#av SHIFT] --color COLOR<-LOALPHA [#av SHIFT] -o OFILE<-SHIFT --debug QT<-1 EOF Z<-PLAY_GOMOKU STR;C;CASE;COLOR;G;H;J;MODE;OFILE;P;QH;QT;SZ;ZLIST |Play gomoku CASE<-#deb ,(0 #sed "X:d;$gomoku.opts;s/|.*//g;:cm"),"|" OFILE<-"" & QH<-QT<-Z<-0 & STR<-CASE GETOPTS STR & ->(QH=1)/HELP COLOR<-"auto" #ifndef "COLOR" SZ<-19 #ifndef "SZ" STR<-"0auto1black2white" MODE<-(3 4r"cxcopxcocxpo")[#fi STR[_1+(COLOR #find STR)/irSTR]] Z<-WEIQI_INIT SZ G.IDX<-MAP_LINES SZ Z<-SGF.INI MODE |Set up transcript G<-H<-G.NSQr"." & GM.TR<-SZ P<-(SZ*SZ)%2 |first move _CLS AA:| main cycle Z #wput (O.CZ+0 1), r Z<-".ox" V_MAP G 0 r #sed "X.z;-20;:s" C<-MODE[1] & ->(COMPUTER, PLAYER)["p"=MODE[0]] COMPUTER: | Computer move ->(f/"."=G)/_PUT H<-, C MARK_MOVES (SZ,SZ)rG 0 r #do QT/"Z #wput (O.CZ+0 1), r Z<-"".oxOX"" V_MAP H" P<-(H=UPALPHA [#av C])/iSZ*SZ ->(1=rP)/_PUT & P<-P[?rP] & ->_PUT PLAYER: | get move ZLIST<-G.CZ,: 0 4 BAR_MENU GOMOKU_TEXT P<-P MZGETS ZLIST ->(P < G.NSQ)/_PUT ->(_UNDO, _PASS, _SHELL, XX)[P-G.NSQ] _UNDO: ->AA _PASS: 7 #print ";","WB"[C="x"],"[pass]" & ->AA _SHELL: Z<-DSH & ->AA _PUT: 7 #print ";","WB"[C="x"],"[",G.AZ[mG.SZ2nP],"]" G[P]<-C & GM.TR<-GM.TR,P & MODE<-2 m MODE ->(XX,AA)[0=C GM_RESULT (SZ,SZ)rG] HELP: Z<-0 #sed"X:d;$gomoku.inf;:cm" & Z<-WW.FSCR 0 & ->0 XX: |Display last position H #wput (O.CZ+0 1), r H<-".oxOX" V_MAP Z<-H ->(0=rOFILE)/0 7 #print ")" 7 #sed":u ",OFILE "STRINGS.5" cc+cc 400 +cccc 400 cccc+ 400 ccc+c 400 c+ccc 400 .ccc+. 90 .+ccc. 90 .cc+c. 90 .c+cc. 90 ccc.+ 30 +.ccc 30 .c+c. 20 .+cc. 20 .cc+. 20 .+c.. 4 ..c+. 4 .c+.. 4 ..+c. 4 .+.c. 4 .c.+. 4 Z<-CO MARK_MOVES G;DX;J;JX;N;NP;PATTERN;S;VAL;XA;$0;$1 |Use string search to suggest moves in a go-moku position |Global G.IDX STRINGS.5 PATTERN<-STRINGS.5 CO<-"x" #ifndef "CO" Z<-("_",,G)[G.IDX] J<-0 & NP<-1tr:PATTERN XA<-(rN<-irZ)r0 AA: ->(J=NP)/XX 0 r #split PATTERN[J++] DX<-$0 i "+" & $0[DX]<-"." & VAL<-#fi $1 S<-("/c/",("ox"[CO="x"]),"/*") #rxsubs $0 JX<-DX+(S #find Z)/N & XA[JX]<-XA[JX]+VAL S<-("/c/",("ox"[CO="o"]),"/*") #rxsubs $0 JX<-DX+(S #find Z)/N & XA[JX]<-XA[JX]+VAL-1 ->AA XX:Z<-,G Z[_1+(XA=c/XA)/G.IDX]<-UPALPHA [#av CO] Z<-(rG)rZ Z<-MAP_LINES N;I;M |Map rows columns and diagonals of G to index array |The actual strings are in the array ("_",,G)[Z] NX<-(N,N)r1+iN*N & I<-i2+N Z<-,(NX,:yNX),0 M<-,0,:(0,NX,0),:0 Z<-Z,M[#sort , I #outer +I], M[#sort , I #outer -I] Z<-C GM_RESULT G;IDX |Check position for chain of 5 Z<-c/(5/C) #find Z<-("_",,G)[G.IDX] Z<-GO_MOKU SZ;C;CO;G;H;J;K;V |Play go moku G.IDX<-MAP_LINES G.SZ<-SZ G<-,(SZ,SZ)r"." G[(SZ*SZ)%2]<-"x" & CO<-"ox" AA: V #wput 3 4, rV<-(1 2*SZ)r" ",yG C<-1tCO & CO<-1mCO H<-,C MARK_MOVES (SZ,SZ)rG V #wput 3 4, rV<-(1 2*SZ)r" ",yH J<-(H=UPALPHA [#av C])/iSZ*SZ ->(1=rJ)/BB J<-J[?rJ] BB:G[J]<-C |0 r #sleep 3 #ifndef $DELAY ->(0=C GM_RESULT Z<-(SZ,SZ)rG)/AA XX: