# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # This is GNU Go, a Go program. Contact gnugo@gnu.org, or see # # http://www.gnu.org/software/gnugo/ for more information. # # # # Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, # # 2008 and 2009 by the Free Software Foundation. # # # # This program is free software; you can redistribute it and/or # # modify it under the terms of the GNU General Public License # # as published by the Free Software Foundation - version 3, # # or (at your option) any later version. # # # # This program is distributed in the hope that it will be # # useful, but WITHOUT ANY WARRANTY; without even the implied # # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # # PURPOSE. See the GNU General Public License in file COPYING # # for more details. # # # # You should have received a copy of the GNU General Public # # License along with this program; if not, write to the Free # # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, # # Boston, MA 02111, USA # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Second Generation Pattern Database. # # New patterns that are not from patterns.db # ############################## # # The patterns are classified into a number of different categories: # # Conn Connection patterns # Cut Cut patterns # AS Antisuji patterns (i.e. prohibitted moves) # Shape Shape moves # Sente Followup moves (add followup or reverse_followup values) # DD Double threat moves and defense against double threats # Temp Temporary patterns to correct certain misbehaviours. # ############################## attribute_map general goal_elements none # FIXME: try to make callback_data pattern category specific callback_data XOxo ############################## # # Connection of one space jump # # O.O # ############################## Pattern Conn101 O*O straight connection :+,C Pattern Conn102 O.O tiger connection ?*? :|,C bac ?*? ;odefend_against(*,a) && !oplay_attack(*,b) && !oplay_attack(*,c) Pattern Conn103 O.O indirect connection *.. :8,C OaO *bc ;oplay_attack(*,a,b,c,a) || oplay_attack(*,a,b,c,c) Pattern Conn104 .O.O indirect diagonal connection *... :8,C .OaO *dbc ;oplay_attack_either(*,a,b,c,a,c) && !oplay_defend_both(*,a,b,d,c,a,d) Pattern Conn105 OXO defend connection .*. :8,C aXb .*. ;!oplay_break_through(*,a,*,b) Pattern Conn106 ??.? indirect connection *O.O .... :8,C ??e? *OaO .dbc ;oplay_attack(*,a,b,e,c,d,d) ######################## # # Connection of diagonal # # O. # XO # ######################## Pattern Conn201 O* solid connection xO :/,C Pattern Conn202 O.* tiger's mouth connection xO? :8,C ba* xc? ;odefend_against(*,a) && !oplay_attack(*,b) && !oplay_attack(*,c) Pattern Conn203 XO? far away connection, might leave much aji O.? ??* :\,C XO? Oa? ??* ;odefend_against(*,a) Pattern Conn204 ?XO increase liberties to secure connection *O. :8,C ?XO *Oa ;odefend_against(*,a) Pattern Conn205 XO* extend to secure connection O.? :8,C BO* Oa? ;oplay_attack_either(*,a,a,B) Pattern Conn206 # see trevord:740 ..O very indirect connection .OX *X. :8,C .aO .OX *X. ;oplay_attack(*,a,a) Pattern Conn207 # gf New pattern. (3.7.1) # See olympiad2004:102. ?.X kikashi to give bad shape before connecting ..X *XO .O. :8,C ?.X ..X *Xa .O. ;lib(a)>1 ##################### # # Connection of keima # # O.. # ..O # ##################### Pattern Conn301 O*. solid connection ?.O :8,C Pattern Conn302 O.? bumping connection X*O :8,C Oa? B*O ;oplay_attack_either(*,a,a,B) Pattern Conn303 # gf Revised constraint. (3.3.3) O..* kosumi connection ..O? :8,C Obc* eaf? ;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,e,b,e) ;&& oplay_defend_both(*,c,*,f) Pattern Conn304 # gf Revised constraint. (3.3.3) O..* kosumi connection X.O? :8,C Obc* Eaf? ;oplay_attack_either(*,a,b,c,a,c) && !oplay_defend_both(*,b,a,b,E) ;&& oplay_defend_both(*,c,*,f) Pattern Conn305 O..? nobi connection ..O* :8,C Obc? eaO* ;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,e,b,e) Pattern Conn306 O..? nobi connection X.O* :8,C Obc? EaO* ;oplay_attack_either(*,a,b,c,a,c) && !oplay_defend_both(*,b,a,b,E) Pattern Conn307 O.X? nobi connection ..O* :8,C ObD? caO* ;!oplay_defend_both(*,a,b,a,D) && oplay_attack_either(*,b,a,c,b,c) Pattern Conn308 O.* ..O :8,C Oa* cbO ;oplay_attack_either(*,a,b,c,a,c) Pattern Conn309 O.* X.O :8,C Oa* EbO ;!oplay_defend_both(*,a,b,a,E) Pattern Conn310 ..* O.. ..O :8,C ..* Obc daO ;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,d,b,d) Pattern Conn311 O*. ?XO :8,C O*a ?BO ;oplay_attack_either(*,a,a,B) Pattern Conn312 O.* xXO :8,C Oa* xXO ;odefend_against(*,a) Pattern Conn313 .O. O.* xXO :8,C bOc Oa* xXO ;oplay_attack_either(*,a,b,c,a,c) || oplay_attack_either(*,a,c,b,a,b) Pattern Conn314 ... O.* xXO :8,C .b. ca* xXO ;!oplay_break_through(*,a,b,c,b,*) Pattern Conn315 O*X cut through to connect .XO :8,C O*B .AO ;!oplay_defend_both(*,A,B) ############################################## # # Connection of one space jump from two stones # # O.. # O.O # ############################################## Pattern Conn401 O..* kosumi connection O.O? :8,C Obc* OaO? ;oplay_attack_either(*,a,b,c,a,c) Pattern Conn402 O..? nobi connection O.O* :8,C Obc? OaO* ;oplay_attack_either(*,a,b,c,a,c) Pattern Conn403 O.O bamboo joint O.* :8,C A.O A.* ;!oplay_attack(*,A) ############################## # # Connection of two space jump # # O..O # ############################## Pattern Conn501 O*.O :-,C O*aO ;odefend_against(*,a) Pattern Conn502 O*.O ?... :8,C O*ac ?.b. ;!oplay_break_through(*,a,b,*,b,c) Pattern Conn503 O..O *... :8,C OacO *bde ;oplay_attack_either(*,a,b,c,d,e,c,e) && !oplay_defend_both(*,a,b,d,c,a,d) ;&& oplay_attack(*,b,a,c,c) Pattern Conn504 O..O .*.. :8,C OdaO e*bc ;oplay_attack_either(*,a,b,c,a,c) ;&& (oplay_attack(*,d,d) || oplay_attack_either(*,d,b,e,d,e)) Pattern Conn505 # gf Revised constraint. (3.7.2) ?..? OX.O .*.. :8,C ?..? aX.b .*.. ;!oplay_disconnect(*,a,b) Pattern Conn506 OX.O *O.. :8,C ODbO *Oac ;!oplay_defend_both(*,a,b,a,D) && !oplay_defend_both(*,b,a,c,b,c) Pattern Conn507 O..O X*.. :8,C OabO X*.. ;oplay_attack(*,a,a) && oplay_attack(*,b,b) Pattern Conn508 O..O ?*O? :8,C OabO ?*O? ;oplay_attack(*,a,a) && oplay_attack(*,b,b) Pattern Conn509 o.X? OX*O .... ---- :8,C obX? cX*O .a.. ---- ;oplay_attack(*,a,a) ;&& !oplay_attack_either(*,b,a,*,a) && !oplay_attack_either(*,b,a,c,a) Pattern Conn509b # gf New pattern. (3.3.3) ?.X? OX*O .... ---- :8,C ?.X? aX*b .... ---- ;!oplay_disconnect(*,a,b) Pattern Conn510 O..O ..*. .... ?..O :/,C OADO CB*d ..ba ?.cO ; oplay_attack(*,a,b,c,a) && oplay_attack(*,A,B,C,A) ; && oplay_attack_either(*,b,a,d,b,d) ; && oplay_attack_either(*,B,A,D,B,D) ###################### # # Connection of ogeima # # O... # ...O # ###################### Pattern Conn601 O*.. Block across large knight's move ?X.O :8,C O*ac ?DbO ;!oplay_defend_both(*,a,b,a,D) && oplay_attack_either(*,b,a,c,b,c) Pattern Conn602 O... *..O :8,C Obde *acO ;oplay_attack_either(*,a,b,c,d,e,c,e) && !oplay_defend_both(*,a,b,d,c,a,d) ;&& oplay_attack(*,b,a,c,c) Pattern Conn603 ...o Block across large knight's move O.*. ?.XO :8,C .b.o ca*. ?.XO ;!oplay_break_through(*,a,b,*,b,c) Pattern Conn603b # gf New experimental pattern. Useful in nngs1:41. (3.1.30) ...o Block across large knight's move O.*. ?.XO :8,C ...o a.*. ?.Xb ;!oplay_disconnect(*,a,b) Pattern Conn604 O... .*.O :8,C Ocb. d*ae ;!oplay_break_through(*,a,b,*,b,e) && !oplay_defend_both(*,c,d,a,b,c,a) Pattern Conn605 O... X*.O :8,C Ocb. X*ad ;!oplay_break_through(*,a,b,*,b,d) && !oplay_defend(*,c,b,c) Pattern Conn606 O*.. ?..O :8,C O*bc ?daO ;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,d,b,d) Pattern Conn607 O..? O.*. ?X.O :8,C Obc? Oa*. ?X.O ;oplay_attack_either(*,a,b,c,a,c) Pattern Conn608 ...? O.*. ?X.O :8,C .b.? ca*. ?X.O ;!oplay_break_through(*,a,b,*,b,c) Pattern Conn609 O.*.? ..XO. ..... ----- :8,C Ob*c? eaXOd ..d.. ----- ;!oplay_defend(*,a,b,c,d,a) && oplay_attack_either(*,c,a,b,d,e,b,e) Pattern Conn610 OXX? .*.O ---- :8,C dBB? e*ac ---- ;oplay_attack(*,a,B) && !oplay_attack(*,c) && !oplay_attack(*,d) ;&& oplay_attack_either(*,e,B,e) Pattern Conn611 OX.o .*.O ---- :8,C dB.o a*.c ---- ;oplay_attack_either(*,a,B,a) && !oplay_attack(*,c) && !oplay_attack(*,d) ############################################## # # Connection of two space jump from two stones # # O... # O..O # ############################################## Pattern Conn701 O..? O.*O :8,C Obc? Oa*O ;oplay_attack_either(*,a,b,c,a,c) Pattern Conn702 O.X? O.*O :8,C ObC? Oa*O ;!oplay_defend_both(*,a,b,a,C) Pattern Conn703 O.*. O.XO :8,C Ob*c OaDO ;oplay_attack_either(*,a,b,c,a,c) && oplay_attack(*,c,c) ;&& oplay_attack(*,b,a,c,D) Pattern Conn704 ?..* O... O..O :8,C ?..* Odbe OcaO # This condition is not necessary but should be sufficient. ;oplay_attack(*,e,b,e) && !oplay_defend_both(*,b,a,c,d,b,c) ;&& !oplay_defend_both(*,d,c,a,b,d,a) Pattern Conn705 O..* O..O :8,C Odb* OcaO # This condition is not necessary but should be sufficient. ;!oplay_defend_both(*,b,a,c,d,b,c) ;&& !oplay_defend_both(*,d,c,a,b,d,a) Pattern Conn706 OXXO O.*. .... ---- :8,C dXXO da*c .b.. ---- ;!oplay_attack(*,a,b,d) && oplay_attack_either(*,a,b,c,a,c) Pattern Conn707 O.XO O.*. .... ---- :8,C OdDO Ob*a ce.. ---- ;oplay_attack_either(*,a,a,D) && oplay_attack_either(*,b,a,c,b,D) ;&& oplay_attack_either(*,b,a,e,b,D) && oplay_attack_either(*,b,a,d,e,c,b,c) Pattern Conn708 O*.. bend around OX.O :8,C O*ac ODbO ;!oplay_defend_both(*,a,b,a,D) && oplay_attack_either(*,b,a,c,b,c) ########################### # # Miscellaneous connections # ########################### Pattern Conn801 .O*. O..O :8,C .O*. Oa.O ;xcut(a) ####################### # # Cut of one space jump # # X.X # ####################### Pattern Cut101 ... cut with atari X*X OoO :|,OB ... A*B aob ;lib(a)>1 && lib(b)>1 && (lib(A)==2 || lib(B)==2) ################# # # Cut of diagonal # # X. # OX # ################# Pattern Cut201 X* cut through diagonal OX :/,OB X* aX ;!oplay_attack_either(*,*,a) ############## # # Cut of keima # # X.. # ..X # ############## Pattern Cut302 X*. cut through keima .OX :8,OB X*a .bX ;!xplay_attack_either(*,a,b,a) Pattern Cut303 # gf Pattern and constraint revised. (3.3.3) X*O cut through keima ?OX :8,B C*a ?bD ;(alive(a) || alive(b)) && !xplay_disconnect(*,C,D) && !oplay_connect(*,C,D) Pattern Cut304 # gf New pattern. (3.5.3) ?OO X.. cut through keima ?*X :8,OB ?OO Dab ?*C ;!oplay_defend_both(*,a,b,C,D) && !oplay_connect(*,C,D) ####################################### # # Cut of one space jump from two stones # # X.. # X.X # ####################################### ####################### # # Cut of two space jump # # X..X # ####################### Pattern Cut501 X.OX ..*. .... ---- :8,OB XaeX cb*d .... ---- ;lib(e)==3 && xplay_attack_either(*,a,b,c,a,c) ;&& xplay_attack_either(*,a,b,d,a,d) && !xplay_defend(*,b,a,?,d,b) ############### # # Cut of ogeima # # X... # ...X # ############### Pattern Cut601 XO.. .*.X .... ---- :8,OB FOc. d*aE ..b. ---- ;!xplay_break_through(*,a,b,*,b,E) && !xplay_attack(*,a,b,d,c,F) ####################################### # # Cut of two space jump from two stones # # X... # X..X # ####################################### #################### # # Miscellaneous cuts # #################### ########################### # # Antisuji moves. # # These are moves which are locally inferior or for some other reason # should never be played. Obviously, a certain amount of care must be # taken with these patterns. # ########################### Pattern AS1 # It's tempting to make this usually bad descent an antisuji, but # sometimes descending is correct e.g. in the "comb formation" # # XXX # XXOOOXX # XO...OX # .*...O. # -------- # # descending is the *only* move to live. So this should not be an antisuji. # gf Reduced shape value. (3.5.2) ?XO don't defend by moving straight down if it gives X a free forcing move XO. .*. --- :8,-,shape(-3) ?XO Xb. a*. --- ;attack(b) && !oplay_attack(*,a,a) && oplay_attack(*,a,*) Pattern AS2 ?XO don't play double hane at the edge XO. *.. --- :8,- ?XO XOa *b. --- ;!oplay_attack(*,a,a) && oplay_attack(*,a,b,b) >antisuji(*); Pattern AS3 OOX don't play potentially risky gote move *X. --- :8,sOX OdA *Bc --- ;!weak(A) && !weak(B) && oplay_attack(*,c,*) >antisuji(*); >backfill_helper(*,c,d); Pattern AS4 # gf New pattern. (3.1.2) |*O Connect without leaving bigger ko threat than necessary. |OX |.O +-- :8,X |*b |OX |ac +-- ;alive(b) && attack(c) >replace(a,*); Pattern AS5 # gf New pattern. (3.1.3) ?XO? XO.. XO*. .X.. ---- :8,OX ?XO? XOc. XO*. bDa. ---- ;oplay_attack(a,*,b,c,D,a) >replace(a,*); Pattern AS6 # gf New pattern. (3.1.3) |.O if legal, take ko before filling ko |OX |X* +-- :8,s |ab |OC |X* +-- ;alive(b) && alive(C) && legal_omove(*) >replace(a,*); Pattern AS7 # pp New pattern (3.3.18) # (Work-around problem with NonTerritory11, see valuation of M19 in # endgame:830) # It is shape-penalized since it can probably be a semeai attack/defense # in exceptionally rare cases. But actually it is really an antisuji. ?XX? don't play stupid zero point gote o*.o ---- :8,X,shape(-10) aXXc b*ed ---- ; o_alive_somewhere(a,b) && o_alive_somewhere(c,d) ; && !oplay_attack(*,e,e) ; && (oplay_attack(*,e,*) || (o_somewhere(c) ? oplay_attack(*,e,c) ; : oplay_attack(*,e,d))) ########################### # # Shape moves. # # The purpose of these patterns is to give a value to the shape # obtained locally. # ########################### Pattern Shape1 # gf Revised constraint. (3.1.9) # gf Revised constraint. (3.3.10) OO empty triangle. Ok if the empty point of the triangle is an eye. .* :8,-,shape(-2) OO a* ;!proper_eye(a) && !o_captures_something(*) && !x_captures_something(*) Pattern Shape2 # gf Revised constraint. (3.3.10) O* empty triangle. Ok if the empty point of the triangle is an eye. .O :/,-,shape(-2) O* aO ;!eye(a) && !o_captures_something(*) Pattern Shape3 # tm modified (3.1.23) (reduce shape penalty) # see blunder:15, trevord:800 # gf Revised constraint. (3.3.17) O* dango OO :/,-,shape(-1) O* OO ;!ko(*) && !o_captures_something(*) Pattern Shape4 *.O forcing move left behind .OX xXX :8,-,shape(-2) *.O aOX xXX ;!odefend_against(*,a) Pattern Shape5 # gf Reduced shape value. (3.5.2) ?O.O protect against atari or threat to atari ?.OX ?*XX :8,-,shape(3) Pattern Shape6 # gf Added constraint. (3.1.15) *.O classical good shape, unless it leaves a double atari ..O OOX :\,-,shape(2) *.O .aO OOX ;oplay_attack(*,a,a) Pattern Shape6b *.O secures eye ..O OOo :\,-,shape(1) Pattern Shape7 *.X eye-stealing move ..X XXO :\,-,shape(3) Pattern Shape8a ... ponnuki .*. OXO .O. :|,-,shape(5) Pattern Shape8b ... ponnuki .*. OXO .OO :8,-,shape(5) Pattern Shape8c ... ponnuki .*o OXO .OX :8,-,shape(5) Pattern Shape8d ... ponnuki defense o*. OXO XO. xXx :8,-,shape(7) Pattern Shape9a # tm modified (3.1.18) # tm modified (3.1.20) ooo don't give opponent ponnuki o*o XOX .X. :|,-,shape(5) bdB c*C eOf .X. ; lib(e) > 1 && lib(f) > 1 ; && (o_alive_somewhere(c) + o_alive_somewhere(C) + o_alive_somewhere(d) <= 1) ; && !(o_alive_somewhere(d) && (o_alive_somewhere(b) || o_alive_somewhere(B))) Pattern Shape9b # tm modified (3.1.18) # tm modified (3.1.20) # ab I don't understand this pattern. X has already played at LR of # the pattern, so ponnuki is slow. Unless * attacks the eye space of X, # I see no point in pulling this stone out. ooo don't give opponent ponnuki o*o XOX .XX :8,-,shape(4) bdB c*C eOf .XX ; (o_alive_somewhere(c) + o_alive_somewhere(C) + o_alive_somewhere(d) <= 1) ; && !(o_alive_somewhere(d) && (o_alive_somewhere(b) || o_alive_somewhere(B))) ; && !attack(e) && !attack(f) Pattern Shape9c # tm modified (3.1.20) ooo don't give opponent ponnuki o*o XOX .XO :8,-,shape(5) bdB c*C eOA .fO ; (o_alive_somewhere(c) + o_alive_somewhere(C) + o_alive_somewhere(d) <= 1) ; && !(o_alive_somewhere(d) && (o_alive_somewhere(b) || o_alive_somewhere(B))) ; && !attack(A) && !attack(e) && !attack(f) Pattern Shape10 xXx force opponent into bad shape or ko ..X *XO oOo :8,-,shape(3) Pattern Shape11 # gf Revised constraint. (3.1.3) ?..x Don't push from behind with few liberties (want to avoid double hane). x.*X ?.OX ??X? :8,-,shape(-3) ?..x x.*X ?.bX ??A? ;lib(A)>1 && !dead(b) Pattern Shape12 ?..x Don't push from behind with few liberties (want to avoid double hane). ?... x.*X ?.OX ??OX ??X? :8,-,shape(-2) ?..x ?... x.*X ?.OX ??OX ??A? ;lib(A)>1 Pattern Shape12b # gf Reduced shape value. (3.5.2) ..x Don't push from behind with few liberties if we have to bend after hane .*X .OX :8,-,shape(-3) bax .*C .OC ;!oplay_attack_either(*,a,a,C) && oplay_attack(*,a,b,*) Pattern Shape13 # Such huge shape values can cause problems. See handtalk12.sgf, move 37 # (where * is actually an owl defense). -Arend # gf Reduced shape value. (3.5.2) ?X? don't set up double cut *.O .O. :8,-,shape(-3) ?X? *aB cOb ;!oplay_attack_either(*,a,b,c,a,c) && !oplay_attack_either(*,a,c,b,a,b) && !alive(B) Pattern Shape14 xXO? better connect solid at once than leaving a kikashi .O.x xX*? :8,X,shape(-2) xAO? aO.x xB*? ;!oplay_attack(*,a,A) && !oplay_attack(*,a,B) && !oplay_attack(*,a,a) Pattern Shape15 xXO? better connect solid at once than leaving a kikashi .O.* xXx? :8,X,shape(-2) xAO? aO.* xBx? ;!oplay_attack(*,a,A) && !oplay_attack(*,a,B) && !oplay_attack(*,a,a) Pattern Shape16 # gf Added constraint. (3.3.10) # Usually better to capture if either stone in atari. ?XO clean cut *Oo ?X? :8,-,shape(1) ?BO *Oo ?A? ;lib(A)>1 && lib(B)>2 Pattern Shape17 # The solid connection is better than nothing if the descent doesn't work O*. X can still connect underneath XOX ... --- :8,-,shape(-2) O*. BOC .a. --- ;!oplay_attack(*,a,a) && !oplay_attack(*,a,B) && !oplay_attack(*,a,C) && oplay_attack(a,*,*) Pattern Shape18 # gf Added n classification. (3.3.20) O.O tiger .*X :8,n,shape(2) OaO b*X ;odefend_against(*,a) && (oplay_attack(*,b,b) || !oplay_attack(*,b,*)) Pattern Shape18b # Negate shape bonus if X can force O to fill the tiger's mouth. ??. tiger O.O .*X :8,-,shape(-2) ??a O.b .*C ;lib(b)==2 && lib(C)>3 && !oplay_attack(*,a,a) Pattern Shape18c # Negate shape bonus if X can connect "beneath". # gf New pattern. (3.1.4) ?O.O tiger X.*X .... :8,-,shape(-3) ?OdO Xc*E .ba. ;oplay_attack(*,a,b,c,d,b) && lib(E)>3 Pattern Shape19 # gf Revised constraint. (3.3.2) X.X stop enemy tiger .*O :8,-,shape(2) XaB .*O ;lib(B)>1 && xdefend_against(*,a) Pattern Shape20 # delta_moyo currently overvalues this move, so we compensate here # gf Reduced shape value. (3.5.2) XO. bad aji O.. ..* ... --- :8,-,shape(-3) Pattern Shape21 # almost always best to capture immediately ?XO? XOXO ..*? ---- :8,-,shape(1) Pattern Shape22 O.*X Wrong reinforcement ..OX .... ---- :8,-,shape(-2) O.*X .cOX .bad ---- ;oplay_attack(*,a,b,c,d,*) Pattern Shape23 .OXx Usually better to connect solidly ..OX .*.. ---- :8,-,shape(-1) Pattern Shape24 # delta_terri should see the value of this move, but currently needs help ?X?? Usually better to connect solidly O*.O .... ---- :8,-,shape(1) Pattern Shape25 # gf Reduced shape value. (3.5.2) ...x .*.X Don't cap with weak stone that can be cut off. .... xx.O :8,-,shape(-3) ...x .*.X .... xx.a ;weak(a) Pattern Shape26 XO? Bad shape after atari on first line O.* ... --- :8,s,shape(-1) XO? b.* a.. --- ;lib(b)==2 && !oplay_attack(*,a,a) Pattern Shape27 ?XO? Bad shape after atari on first line XO.. ...* ---- :8,-,shape(-1) Pattern Shape28 O.XO Avoid diagonal move that allows X to cut. .*.. :8,X,shape(-4) O.XO .*a. ;!oplay_attack(*,a,a) Pattern Shape29 # gf Revised constraint. (3.1.20) O.* Avoid setting up double threat. ?X? :8,X,shape(-5) ba* ?X? ;(!attack(b) || defend(b)) && !oplay_defend_both(*,a,*,b) Pattern Shape30 # In this position any move that defends the lower O stone will be # assumed to break the connection, although X might connect # underneath. Therefore we give some extra encourage to the real cut. # If this move isn't safe, it won't be suggested anyway. ?O? o.o XOX .*. --- :|,X,shape(1) ?O? o.o XaX .*. --- ;attack(a) Pattern Shape31 XOo Very seldom the right connection. O.. O*. --- :8,-,shape(-1) Pattern Shape32 XO? Bad aji. x.* O.O ?.X :8,X,shape(-1) Xa? x.* O.O ?.X ;lib(a)==2 Pattern Shape33 ?O. Never bad to make an eye. O.* oO. :8,-,shape(1) Pattern Shape34 ?X? Don't descend if we can (and have to) capture. XOX .*. --- :8,X,shape(-3) ?X? BOX .*a --- ;lib(B)==1 && !oplay_attack(*,a,a) Pattern Shape35 O.O Good shape O.. XO* ??? :8,-,shape(1) Pattern Shape36 OX.O Very inefficient move XO.. .*.. ---- :8,-,shape(-2) OB.O XOa. .*.. ---- ;oplay_defend(*,B) && oplay_attack(*,a,*) Pattern Shape37 OX.O Good shape XO*. .... ---- :8,-,shape(1) Pattern Shape38 X.O Usually inefficient O.. *.. --- :8,-,shape(-1) Pattern Shape39 O.. good shape ..O O*X :8,-,shape(1) b.. ..a O*X ;lib(a)>2 && lib(b)>2 Pattern Shape40 O.X eye-stealing move ..X XX* :\,-,shape(1) Pattern Shape41 # Notice that this pattern gives one more shape point for the previous # pattern. O.x eye-stealing move ..X xX* :\,-,shape(1) Pattern Shape42 # Sometimes the life and death code comes up with both this move and # the more solid move one line higher. Prefer the latter. O.o X.. .*. --- :8,O,shape(-2) Pattern Shape43 ?XO. usually better to connect solidly than leaving peep behind xO.. ..*. ---- :8,-,shape(-2) Pattern Shape44 # This pattern may be a little too general but is probably good. ?...? extend when faced with contact instability ?.OX? ?.*.x ??.?? :8,-,shape(2) ?...? a.OX? ?.*.x ??.?? ;!xmoyo(a) Pattern Shape45 # gf Added constraint. (3.1.3) xxx? usually better to connect and block on third line O..O *... .... ---- :8,-,shape(-1) CDE? a..b *... .... ---- ;!same_dragon(a,b) || x_alive_somewhere(C,D,E) Pattern Shape46 # gf Reduced shape value. (3.5.2) ?XXO blocking one step to the left usually much superior .O.* .... ---- :8,-,shape(-3) ?XXb .Oa* .... ---- ;lib(b)>=3 && oplay_attack(a,*,*) Pattern Shape47 x.O too vulnerable to cutting O.X .*X xx? :8,-,shape(-3) Pattern Shape48 # gf Added constraint. (3.3.15) # gf Revised pattern. (3.3.16) .X. makes it harder for X to make eyes *.X ?xx :8,s,shape(1) .A. *.X ?xx ;weak(A) Pattern Shape49 OXx avoid descending if it leaves a kikashi XOX .OX .*. --- :8,-,shape(-1) OXx XOX .OX .*a --- ;oplay_attack(*,a,*) && !oplay_attack(*,a,a) Pattern Shape50 xO.xx connect after nozoki X*.xx xO.xx :-,OX,shape(5) Pattern Shape51 O.. empty triangle on the edge O*. --- :8,-,shape(-2) Pattern Shape53 ?X? good for eyespace and to avoid shortage of liberties O*O ... --- :|,-,shape(1) Pattern Shape54 ?X? often stupid O.O ..* --- :8,-,shape(-1) Pattern Shape55 # gf Reduced shape value. (3.5.2) O. don't force opponent to cut X. .* :8,-,shape(-3) a. X. .* ;weak(a) Pattern Shape56 ?XO. don't defend by moving straight down if X can peep XO.. .*.. ---- :8,O,shape(-3) Pattern Shape57 ..O avoid moves at cross purposes O.X .*. :8,OX,shape(-3) Pattern Shape58 O.XO effective block ..*O ..xx :8,-,shape(3) O.AO ..*O ..xx ;lib(A)==3 Pattern Shape59 # gf Reduced shape value. (3.5.2) ?X.O usually stupid, other atari or descent generally better XOXO ..*. ---- :8,-,shape(-3) Pattern Shape60 ..O? don't connect this way because it leaves bad aji ...O ..*o ---- :8,-,shape(-3) Pattern Shape60b # gf New pattern. (3.1.3) ..O? this connection on the other hand is usually good ..*O ...o ---- :8,-,shape(1) Pattern Shape60c # gf New pattern. (3.1.14) ..OX? usually we want to avoid this connection too ...OX ...*O ----- :8,-,shape(-1) Pattern Shape61 xX... connecting preferred to alternative defenses XOX.. O*O.. ..... ..... ----- :8,-,shape(3) Pattern Shape62 ?OO?? O...x not so good shape on the edge O.*.x ----- :8,-,shape(-3) Pattern Shape63 ??xO. might connect, but horrible amounts of aji ?X... .XO.. ..*.. ----- :8,-,shape(-3) Pattern Shape64 ?O.. never correct shape O... ?O*. ---- :8,-,shape(-3) Pattern Shape65 ?O.. good solid shape O.*. ?O.. ---- :8,-,shape(1) bO.. O.*. aO.. ---- ;o_alive_somewhere(a,b) Pattern Shape66 # db increased negative shape (3.1.7) # ab added ??? lines added as jump is often good on 3rd line # gf This is way too general. Added constraint. (3.5.3) xX. often bad to leave a gap O.* ... ??? ??? :8,-,shape(-3) xX. ca* .b. ??? ??? ;oplay_disconnect(*,a,b,*,c) Pattern Shape67 # gf New pattern. (3.1.3) ?XX? when played as a ko threat, this is often inefficient X*OX ..X? :8,sX,shape(-1) ?XX? X*OX ..X? ;oplay_attack(*,*) Pattern Shape68 # gf New pattern. (3.1.3) OXxx usually the right place for a small ko threat in this shape X*.x XX.. ---- :8,sOX,shape(1) OXxx A*.x AA.. ---- ;lib(A)==2 Pattern Shape69 # gf New pattern. (3.1.13) ?XXX?? usually the right way to strengthen the position XO.O*. XO.... ...... ------ :8,-,shape(1) Pattern Shape70 # gf New pattern. (3.1.14) OX.. better to capture cleanly .*.. ---- :8,-,shape(-2) OAb. .*.. ---- ;!oplay_defend(b,A) Pattern Shape71 # gf New pattern. (3.1.14) ?XO.. the descent leaves a peep XO... .*... ----- :8,-,shape(-1) Pattern Shape72 # gf New pattern. (3.1.14) # gf Reduced shape value. (3.5.2) ?XO. don't leave double threat behind XO.. *... ---- :8,-,shape(-3) ?Xc. Xba. *... ---- ;!oplay_defend_both(*,a,b,c) Pattern Shape73 # gf New pattern. (3.1.14) ?OO cancel empty triangle negative shape when we create an eye O.* OoO :8,-,shape(2) ?OO Oa* OoO ;!proper_eye(a) Pattern Shape73b # gf New pattern. (3.1.20) # See strategy3:120. This pattern favors C7 to D8. ?OO some more shape if opponent could atari to destroy eye O.* OoO :8,-,shape(1) ?AA O.* OoO ;lib(A)==2 && xlib(*)>1 Pattern Shape74 # gf New pattern. (3.1.14) o..? don't leave cutting points around O... X.Ox ?*.x oO.? :8,-,shape(-1) Pattern Shape75 # gf New pattern. (3.1.15) ?Xxx .OXx ..*. .... ---- :8,-,shape(-1) ?XDx bOXx .a*c .... ---- ;(x_alive_somewhere(D) || oplay_attack(*,?,D,D)) && !oplay_defend(*,a,b,c,*) Pattern Shape76 # tm New Pattern. (3.1.16) (see trevor:220) # gf Reduced shape value. (3.5.2) ---- .... .... O.*. :8,-,shape(-3) ---- .... CbE. DA*. ; xlib(A) > 2 ; && oplay_attack(*,A,b,C,D) ; && oplay_attack(*,A,b,E,C,*) Pattern Shape77 # gf New pattern. (3.1.18) (see trevor:382) oOO O.. XO* --- :8,-,shape(-3) Pattern Shape78 # gf New pattern. (3.1.18) (see trevor:382) oOO O.* XO. --- :8,-,shape(1) Pattern Shape79 # gf New pattern. (3.1.20) (see trevord:610,630,640) OOo Almost always better to block on second line X.. *.. --- :8,O,shape(-2) OOo A.. *.. --- ;lib(A)==2 Pattern Shape80 # tm New Pattern (3.1.22) (see trevora:390) |O.O |..O |*.O |..o +--- :8,-,shape(1) Pattern Shape81 # tm New Pattern (3.1.22) (see trevora:300) # FIXME: potentially bad for ko threats. .*o O.. XOO :8,X,shape(1) Pattern Shape82 # gf New pattern. (3.1.32) (see trevorb:280) |XXO Prefer this as ko threat since it gives a second one |.*X |.X? |.?? :8,sX,shape(2) |AAO |.*X |.X? |b?? ;!weak(A) && lib(A)==2 && xterri(b) Pattern Shape83 # gf New pattern. (3.3.3) (see trevorc:310) *X? don't leave double atari behind .OX ..O :8,sX,shape(-2) *X? daX .cb ;!oplay_defend_both(*,c,a,b) && oplay_attack(d,c,c) Pattern Shape84 # gf New pattern. (3.3.3) (see trevorc:1310) OX? connect correctly .OX .*O --- :8,sX,shape(-2) OX? bOX .*a --- ;lib(a)>1 && xlib(b)>1 && oplay_attack(*,b,*) Pattern Shape85 # gf New pattern. (3.3.10) # Usually less aji when attacking at c rather than *. OOX attack correctly *XO ... xxx :8,sX,shape(-1) aaX *BO .c. xxx ;(xlib(*)==2 || (lib(a)>2 && xlib(*) < xlib(c))) ;&& !oplay_defend(c,B) Pattern Shape86 # gf New pattern. (3.3.15) # Prefer cut to peep as ko threat. # gf Revised constraint. (3.3.16) XO ko threat *X :/,sX,shape(1) AO *B ;oplay_attack_either(*,A,B) && !safe_omove(*) Pattern Shape87 # gf New pattern. (3.5.3) # gf See gifu03:501 .OXx usually better to extend than atari in cross cut .XO. .*.. :8,sX,shape(-1) .aXx .Xb. .*.. ;!dead(a) && !dead(b) && weak(a) && weak(b) && oplay_disconnect(*,a,b) Pattern Shape88 # gf New pattern. (3.7.2) # See gunnar:55. ?X.X more potential for followup ko threats one step to the right X*.X ?XXO :8,sX,shape(-1) ?XbX X*.X ?AAO ;lib(A)==2 && olib(*)==1 && olib(b)==1 ########################### # # Followup moves. # # The purpose of these patterns is to give a rough estimate of the # value of followup moves, either to this move or to moves the # opponent could continue with if we do not defend now. # ########################### Pattern Sente1 ?X? Defend to avoid cutting points XOX O*o :8,-,reverse_followup(5) ?X? XOB a*o ;lib(B)>1 && xplay_attack(*,a) Pattern Sente1b *X? Capture to avoid cutting points XOX O.o :8,-,reverse_followup(5) *X? COX bao ;lib(C)==1 && xplay_attack(a,b) && oplay_attack(*,a,a) Pattern Sente1c OX? Capture to avoid cutting points XOX *.o :8,-,reverse_followup(5) bX? COX *ao ;lib(C)==1 && xplay_attack(a,b) && oplay_attack(*,a,a) Pattern Sente1d # gf New pattern. (3.3.10) ?OX? Capture to avoid cutting points *XOX ?O.o :8,-,reverse_followup(5) ?OX? *COX ?bao ;lib(C)==1 && xplay_attack(a,b) && oplay_attack(*,a,a) Pattern Sente2 .X. Defend to create cutting points XOX O*O :|,-,followup(5) .B. AOC O*O # Better to capture A or C at once if either in atari ;oplay_break_through(*,A,B,C) && lib(A)>1 && lib(C)>1 Pattern Sente3 ?XOO Block on edge. XOX* .... ---- :8,-,followup(6) Pattern Sente4 oOX. Hanetsugi .*OX ---- :8,-,followup(6) oOA. .*OB ---- ;oplay_attack_either(*,A,B) && !attack(B) && !attack(A) Pattern Sente5 # The followup value is usually larger in practice. *XX force X to make dango X.X ?XO :8,X,followup(6) *AA X.A ?Xa ;lib(A)==2 && lib(a)>1 Pattern Sente6 # The followup value is usually larger in practice. XXX force X to make dango X.X *XO :8,X,followup(10) AAA A.A *Xa ;lib(A)==2 && lib(a)>1 Pattern Sente7 # tm modified (3.1.22) (added oplay_defend) ?O? .X* ... --- :8,X,followup(6) ?O? .A* ... --- ;oplay_attack(*,A) && oplay_defend(*,A) Pattern Sente8 O.. *X. ... --- :8,OXd,followup(8) O.. *A. ... --- ;oplay_attack(*,A) Pattern Sente9 ?X*O Cut .OX. .... ---- :8,-,followup(6) Pattern Sente10 # FIXME: The followup value should be related to the size of A. .O.? ...X OXX* :8,-,followup(5),shape(1) .O.? ...X OAA* ;lib(A)==3 && oplay_attack(*,A) Pattern Sente11 ?OO? .XX* .... ---- :8,X,followup(9) ?OO? .AA* .... ---- ;oplay_attack(*,A) Pattern Sente13 # gf Revised constraint. (3.1.20) *O :-,sO *a ;lib(a) == 2 && !attack(a) && safe_xmove(*) && safe_omove(*) # Action adds a reverse followup value. >defend_against_atari(a) Pattern Sente13b # gf Revised constraint. (3.1.10) # gf Revised constraint. (3.3.16) # gf Revised constraint. (3.5.3) .O *? :8,sO ba *c ;lib(a) == 2 && !attack(a) && olib(b) > 2 && safe_omove(*) ;&& (safe_xmove(*) || safe_xmove(b)) ;&& (oplay_attack(*,b,b)==WIN ; || (x_somewhere(c) && oplay_attack_either(*,b,b,c))) # Action adds a reverse followup value. >defend_against_atari(a) Pattern Sente13c # gf New pattern. (3.3.16) O.O *.O :8,sO Oba *ca ;lib(a) == 2 && !attack(a) && safe_omove(*) ;&& (safe_xmove(b) || safe_xmove(c)) ;&& oplay_attack(*,b,b)==WIN ;&& oplay_attack(*,c,c)==WIN # Action adds a reverse followup value. >defend_against_atari(a) Pattern Sente13d # gf New pattern. (3.3.17) ..X *.O ..O oOX :8,sO ..X *ca .ba oOX ;lib(a) == 2 && !attack(a) && safe_omove(*) ;&& safe_xmove(*) ;&& !oplay_defend(*,b,c,b) ;&& xplay_attack(*,a) # Action adds a reverse followup value. >defend_against_atari(a) Pattern Sente13e # gf New pattern. (3.7.4) # gf Removed O classification and revised constraint. (3.7.10) *.O ?O? :8,s *ba ?O? ;alive(a) && lib(a) == 2 && !attack(a) && olib(b) > 2 && safe_omove(*) ;&& safe_xmove(b) && oplay_attack(*,b,b)==WIN # Action adds a reverse followup value. >defend_against_atari(a) Pattern Sente14 OXx .OX O.* :8,OX,reverse_followup(5) aBx .OC Od* ;lib(a)>1 && !attack(B) && !attack(C) && xlib(d)>1 Pattern Sente15 OX. oOX oo* :8,OX,followup(5) aBd eOC fg* ;lib(a)>1 && o_alive_somewhere(e,f,g) && !attack(B) && !attack(C) ;&& !oplay_defend_both(*,?,d,B,C) Pattern Sente16 # gf New pattern. (3.1.14) # The constraint is unprecise, but correcting it probably # require a handwritten helper. .O? .*X --- :8,OX,reverse_followup(5) bO? a*X --- ;xplay_attack(*,a,b,*) && xplay_defend_both(*,a,b,*,b) Pattern Sente17 # gf New pattern. (3.1.15) .OXx .*oX ---- :8,X,reverse_followup(5) cdXx a*bX ---- ;alive(d) && !xplay_defend_both(*,a,b,?,c,a,d) Pattern Sente18 # gf New pattern. (3.3.13) # The reverse followup value is probably often bigger than 5 points. X..O.. XOX*.. ...... ------ :8,X,reverse_followup(5) C..b.. COX*.a ...... ------ ;omoyo_opposite(a) && alive(b) && alive(C) Pattern Sente19 # gf New pattern. (3.3.16) # Usually underestimating the reverse followup, but better than nothing. ?oO o.* ?OX :8,OX,reverse_followup(1) ?cO ba* ?OX ;((!o_somewhere(b) && oterri(b)) ; || (!o_somewhere(c) && oterri(c))) ;&& safe_xmove(*) && !xplay_attack(*,a,*) Pattern Sente20 # gf New pattern. (3.3.16) # Usually underestimating the reverse followup, but better than nothing. ?.O ..* ?OX :8,OX,reverse_followup(2) ?cO ba* ?OX ;oterri(b) && oterri(c) && safe_xmove(*) && !xplay_attack(*,a,*) Pattern Sente21 # gf New pattern. (3.3.16) # Usually underestimating the reverse followup, but better than nothing. ..O ..* ?OX :8,OX,reverse_followup(3) dcO ba* ?OX ;oterri(b) && oterri(c) && oterri(d) && safe_xmove(*) && !xplay_attack(*,a,*) Pattern Sente22 # pp New pattern, see trevord:950 (3.3.20) ?OX? O.*. ?XX? :8,OX ?OX? Oa*b ?AA? ; oplay_attack(*,A) && oplay_attack(*,a,A) && oplay_attack(*,b,a,A) > good_attack_threat(*,A) Pattern Sente23 # gf New pattern. (3.5.4) # See trevorc:450. ?OX O.O O*X :8,O ?OX a.c a*B ;lib(a)>3 && alive(B) && xplay_attack(*,c) >prevent_attack_threat(c); Pattern Sente24 # pp New pattern (3.5.8) ?*? XO. ?O. --- :8,OX,reverse_followup(8) ?*? XAb ?A. --- ; lib(A)==3 && safe_xmove(*) && !xplay_defend(*,?,b,A) ######################################################## # # Double threat moves and defense against double threats # ######################################################## Pattern DD1 # FIXME: This isn't really double atari - just plain old # capture also matches here. see nngs:1260 # Does this matter? *X double atari on you XO :\,X *A BO >test_attack_either_move(A,B) Pattern DD2 *O double atari on me OX :\,nO *a bX ;!xplay_defend_both(*,a,b) >add_defend_both_move(a,b); Pattern DD2b *.O double atari on me, defended by hanging connection ?OX :8,O *ca ?bX ;!xplay_defend_both(c,a,b) ;&& (oplay_attack(*,c,c) || oplay_defend_both(*,c,a,b)) >add_defend_both_move(a,b); Pattern DD3 OXX X*. X.. :8,O OEE D*c Dba ;oplay_attack(*,D) && oplay_attack_either(*,a,D,E) ;&& !oplay_defend_both(*,b,c,D,E) >test_attack_either_move(D,E) Pattern DD4 # gf Revised constraint. (3.5.2) XOO O.. O.* :8,O Xee dac db* ;xplay_attack(a,d) && xplay_attack_either(a,*,d,e) ;&& !xplay_defend_both(a,b,c,d,e) && !xplay_defend_both(a,c,b,d,e) ;&& !xplay_connect(a,d,e) && oplay_connect(*,a,d,e) >add_defend_both_move(d,e); Pattern DD5 # gf Exclude this pattern when scoring. (3.3.14) # This is somewhat wimpy. We should do more exact reading to verify # whether it really is necessary. XOO O.. O.* :8,O Xcc ba. b.* ;!doing_scoring ;&& lib(c)<=4 && xplay_attack(a,b) && safe_xmove(a) && odefend_against(*,a) >add_defend_both_move(b,c); Pattern DD6 # al1 Revised symmetry. (3.7.11) ?o? Double attack X*X ?o? :+,- ?o? A*B ?o? >test_attack_either_move(A,B) Pattern DD7 # gf Revised constraint. (3.1.20) *OX ?XO :8,- *dA ?Bc ;lib(d)<4 && (xlib(*)>1 || lib(d)<3) ;&& oplay_defend(*,A) && oplay_defend(*,B) ;&& !oplay_attack(*,c) >test_attack_either_move(A,B) Pattern DD8 O.. extend to connect XO* :8,O ca. Xb* ;safe_xmove(a) && !xplay_defend_both(a,b,c) && oplay_defend_both(*,a,b,c) >add_defend_both_move(b,c); Pattern DD8b # gf Added constraint. (3.3.20) # Not a problem if the opponent can't even threaten to cut after the move. O.. extend to connect XO* ?o. :8,O,shape(-1) ba. XO* ?o. ;oplay_disconnect(*,a,*,b) Pattern DD9 O.* double atari on me XO. :8,O ca* Xb. ;safe_xmove(a) && !xplay_defend_both(a,b,c) && oplay_defend_both(*,a,b,c) >add_defend_both_move(b,c); Pattern DD10 *O. generalized tsukenobi joseki ?XO :8,- *ba ?Xc ;(alive(b) || alive(c)) ;&& safe_xmove(a)==WIN && !xplay_defend_both(a,b,c) && oplay_attack(*,a,a)==WIN >add_defend_both_move(b,c); Pattern DD11 X.? double attack O*. ??X :8,-,shape(2) A.? O*. ??B ; !attack(A) && !attack(B) && oplay_attack(*,A) && oplay_attack(*,B) >test_attack_either_move(A,B) Pattern DD12 # gf Revised. (3.1.9) OX? double attack X*. X.. X.. --- :8,- EB? A*d Ac. A.. --- ;lib(A)==3 && !oplay_attack(*,E) && oplay_attack(*,d,A) ;&& !oplay_defend_both(*,c,d,A,B) >test_attack_either_move(A,B) Pattern DD13 # gf Revised. (3.1.9) XO? double defense O*. O.. O.. --- :8,- eb? a*d ac. a.. --- ;lib(a)==3 && !attack(e) && xplay_attack(*,d,a) ;&& !xplay_defend_both(*,c,d,a,b) >add_defend_both_move(a,b) ########################### # # Temporary patterns to correct certain misbehaviours. # ########################### Pattern Temp1 # This joseki is played far too frequently. # existed since at least 3.0.0 |........ |........ |.....*.. |...O.... |.....X.. |........ |........ +-------- :8,-,maxvalue(25) Pattern Temp5 # Don't make a short jump along the edge before shimari. # existed since at least 3.0.0 # tm Modified (3.1.20) ???xxxxx| ........| ........| ........| .*..O...| ........| ........| --------+ :8,- ???xxxxx| ........| ........| ........| .*..O...| ........| ........| --------+ >antisuji(*); Pattern Temp6 # Don't make a short extension from san-san in open surroundings. # existed since at least 3.0.0 .........| .........| .........| .........| ...*..O..| .........| .........| ---------+ :8,- .........| .........| .........| ..b......| ...*a.O..| .........| .........| ---------+ >antisuji(*); >antisuji(a); >antisuji(b); Pattern Temp7a # Don't make a one space jump along the edge when there is room for a # two space jump. # existed since at least 3.0.0 # FIXME: consider using replace instead of antisuji here? ...... ...... ..*.O. ...... ...... ------ :8,- >antisuji(*); Pattern Temp7b # Usually stupid # existed since at least 3.1.20 X...xxx XXO.xxx OX*.... ....... ------- :8,- G...abc GGO.def OG*.... ....... ------- ;!weak(G) && x_alive_somewhere(a,b,c,d,e,f) >antisuji(*); Pattern Temp8 # existed since at least 3.1.20 .....o Don't crosscut .*X.Oo .XO..o .....o ...... ------ :8,-,shape(-10) Pattern Temp9 # gf New pattern. (3.3.6) # ab Modified: ok after approach move (3.7.1) |............ |............ |............ don't play halfways between hoshi |...O.....O.. |......*..... |............ |............ +------------ :8,- |............ |............ |............ |...O..a..O.. |......*..... |............ |............ +------------ >antisuji(*); >antisuji(a); # END OF FILE