From d508e4107561e5221e516e829e3b312f8eb347ac Mon Sep 17 00:00:00 2001 From: mcgrady00h <281130306@qq.com> Date: Tue, 28 Nov 2017 01:15:46 +0800 Subject: [PATCH 1/4] add put stone rule --- GTP/.game.py.swp | Bin 12288 -> 20480 bytes GTP/.test.py.swp | Bin 12288 -> 12288 bytes GTP/.utils.py.swp | Bin 12288 -> 0 bytes GTP/engine.py | 10 ++-- GTP/game.py | 128 +++++++++++++++++++++++++++++++++++++++++----- GTP/test.py | 79 +++++++++++++++++++++++++++- GTP/utils.py | 10 +++- 7 files changed, 207 insertions(+), 20 deletions(-) delete mode 100644 GTP/.utils.py.swp diff --git a/GTP/.game.py.swp b/GTP/.game.py.swp index ab62fba620f59722d393c77991422843fcfd8c1f..4ad0ba67b4dcd2924fc518e0541320ba56605133 100644 GIT binary patch literal 20480 zcmeI2UyK_^9mfY!TK*N91`0?4O>-36cRrteG|knDORvqJhFn6LxQ$xZTCMH1z326= zv%9{ti%O9YQeS|A`cilx0)Z64LnYKomC8$jBDH-%{R2{-Dna>Q%Ab@@IQhiL`00+9m4usy$YCHwSZNp$s@J=gMGSKp!4(F$ktgs+ad4ol>c9r|FIo;ssFSBS^=$q zRzNGD70?Q31+)TM0j+>mKr5gXcncITG2y=qllMnxf{*Y2@%;aHA7t#8;3@EJ;DJ7H zfB{Z{li+r64D19KKET*t!K>is;3@DJcnF*U1K@!o*acp?lCdYi_dy7X;7{*o?2q6_ z;4El@4EV$Q82df=1vm!`umnB1z!O^xCc=9 z-C!S>0eir|(7xxvPr!rVJ`jQcRKcgfPVi4G0=)(qf&f{Z=-xoOZ6v7zK$RI`OS==(~L2c}^{;C%5UESNP}oFtnYZaQe0*)q~~COeQaH z96WZSdRIA9NN(J+vV7~&a%MKUap=g(N;z{VxxVB0(c_;xeY~9cOy)k3jVN7chQnYn z821~VBMO-30hKW+h%8@Jj1$YJP9-5TGN|vZS?Nu>Lcyu7g&_3J(CUl}9m_Q+AlvjD z&(9^XISf6&(DIaQ@_fzmLu(XeN9O2|ma6_R zEwtU1QF)~z^`)AY86_Z@V!KK)6YENGr)^WxX4h)=j5X7-BL~4gpXH*yg}}bo!bM~T=Tnw@Uf)LA8wz__T;C)rl?5q80JVT& z*sdKKM(o}QtCVicbFxu^1-N_DF@t~~MnyJp{RvkQxflcAYg$1d`?YY}{Is))m|~BX zsA(;|PFhwbsiVZg#$;VYTG_q@b1<;n7W&U%T%eywrPO>b6^I0po_NS~f>d_6x$A|I zrgk8GGAexBRsLs}r_AZtwg6}pDPQ8*l#UuKDH};9M}^J04aHXvre3J$sq|YmMI%S8 zpt$0u#@e3G8{Bqz!||HENGvrYDBLt%qh~wL#=tlvAEhQYr9skY+iuGc2D5ISW1v{G zjD~NSJ;Wg2n`~KRaS7FNsXB3eOtgB}@(t0{atKa~M|E(pzKcxjobB@7x#$9#^rYNd4S5+Ngm zj6_H=4WZh%sP+dAu2h#(TT%U$;cxTdG?6B%d*aF)o}Uwg2x>Ft`+12Y^D)0kX;2!t z%3F4xQJiRWsfnN^39{kYl61c5a+6YY3@{)vIuY$0J;ct~8=gfX3Pn>MeR<)_NeG3; zhdL^35iM@%bZFabF~)ABr1j% zB=OQT(N)tvDmq!*buM0sc=%5<7KV|yCI;^GX(;TdkHq9gnz1MxrH!0hw3{-ts0}?) zbR-eE(OX|EjryOefze4mEiOff*v5a=pu&FIL}UZ$#ZyaYvxP6DDUyaqlc#s1-aO?C z>S#t8Ma{Zd4sk<4s)>FqWQYeY)tnHY9B5MY?bTCXKSXhiKYxDBInCJ5)x`C5Yy^hIbCd0DiY`D(hVa)OH z;EuO$`P{MEAL?hiaaL=5a+ zm*?WiiwPN<;h$U{hF#C6VbC3WZl|=DKY5Pt@0&Cc3gw3Qg4G%pn(j>${{SW#WnLXx zc*|Vli%Yy%Dwpg;^O(;+2Oa?r0Gjt71|0kpaeoND2D;#8kOwnh z54aYPy??;&-+?}~0$KsBfL1^&pcT*xXa%$aS^=$qR^Y8rfEEMr?I~RjVd4gU2EOfv z*~~p|CS7;A)OchgN{?lL+A3z;SkT9WJVODBJzBw7r4>ovbURkG&M%gJ<}e*kmo#Ki zIKJ;mJBp1ougS8~eLAAVVu2xA^-#Y67L-NuzgG{V71vfXZTTq9e+}C@LLj3DE*(qlqP(PS;-T zIepg~obiKjxVAnT-fp+Pt0PKTa4yA~;$j%E7Ubh#v2binQcc&0mHh88)b z8Fzyju_i&ztZdOs_s6JPW9U4}j>;EhPnoJFlS;`AN!c-8GS;_ZUPjcYAc(I;qQz9uqA{Ae^};n*?!5^%B5_?; z=`3p7jeY@9vaobl=ojdwx)Ey^LKj^X*ZPmvxaff&4CgU(W@q2Dv+Q2+&rL;Gzt>L) zC(+lp_Jykkmn-%@@9wNp)YXKtrs_uiz>`-zPbM@qy>YxdUtaiKUT<}nD2J)C;wU00 zYMsvtYtB7K{%GVKGu!@D6Me5i1^1%J+Hy+{qD6QCtzd&|JJDzO1Ro&_9EP9=g3tgz zZA2IF4G!T0?7=p?1_?&M0~V-&Usj?M5U^#X9$LpC2D1L>Zhy}_|C(*N!&blyEJa3wG>-dGrUw0zNUzn>~h*m8LsF&ETm{-t~jl8Me?qw z2`%|bPR1A6Fk4j>RV#JN(*G^PEN#e&?j4KF#OA|~t;smX?=Fl>O2ROBsy)LsgKu^` zZd!cv-<~2HeJLuZ&+9k410AgMeo~jSoOQAGH^`AVY91AXEhi%Go2nbvWENF3EYQaS Oy>aLE$I?%BJpcK= zZ~ikoyH=*2SzjvCoRT4U-ATyk;yq7%b!Cini-edB-PW4heoO3Yg;~yI`Dj&XYgU}_ z`ChF9gq%42c!ei0qKBr;0AKQ?d&0EFy6hrF?+rD zJ-gm}f66!MfOJ4QARUknNC%_?(gEp!bU->F9gq%42d+a0v?d`JZX)FMn^8Re{~!JS z|M?C=z6D=^w*UtwXoGby4^rR|m;gy|AJ_{nj}Y=1_!xWy&Vg6KD_|4Uz|$ZN4uEk$ z!0*F^{06=Qm%v4E9-ISjg6F`KAP>gC2p9%e_Y?9X_yK$k-Uly%7I+*y22Oz)FbaOX z9XjwHcoA%ZC6E9^;L2@;d=B0LXTb|V1CM}v!JoGh@;&$vyapU#gDOzKesFakA-{kx z!Morr(7-x438p{-jDfqsA47zE13myR0}GVE1lR|Lz)!aj@+o*5oB>aP2f-K^0e@o- z{{ol6C2$d30B?X`ey_vzDNB|P+@KEV3Jyb^uGP6_Hxo%>Glw3gOtC$y)-aoigPpdv zO^=q26dt9k>ioeZA^)q#spCs)3v{J#kB)6vZUUJGrHeYxAzlB1B1KN1SXMBQtlwFv4p&Jkb&Z5#^}P zEWeoWCW^HhE8lUuEe_t4LK6z2&AuR-&Vs))#?~`OcT`jewz#-$cb0B()1blL9;ch3 zZNqVE4Q`s6)pSHvOjFO=viNB{lY~9!GoImUx@K6Su2b~C9YuYz)Y440OBD`>DgO%B z?-53&9h$V4_y&((co}Ag+b#{3 zF4?fTNm?MY5 delta 277 zcmZojXh@JsG6?hZRj|-AU;qLE28Iund{Mq%ghfm)Pn6P<%1ur$N=&IN*7Z$HcFNDs z)(t4i*UQOIPRyAYr_1VIlwVq~u{)A^^GjxR9!8DLf&!oUdH3-!FjVnEOw*VwsGwbM z!Oy^84#Z|atPRBcK>U)Af#D($9|Pi}K)f1=7Xa~mAT9^u93ajHVjCbf1Y!dq<^^IV zAZ7&Or$8HS0r5>B-Uh_0fp`@Vw*zqv5LW{+*cA*6o7Dsk@=TtrCo}oCj{fFdxwIDi^Oq*6+Aqe&GtX)C(w)NvCljwkXZQa11a zyaW5bMkRJ^SmhOX42~;-ddk_?dTR7TZTi|#{@u$yW{uW?8%<+9w}z1yj3qWBn1TQV zAOHafKmY;|fB*#kSAlq*qfh*BkFp2kR{*yo_s20Saex2>AOHafKmY;|fB*y_009U< z-~kG#5z)6bqOGTV^St=~wf_IX^@{VA^Mw;|e9n|}!8zd^a^7=loDye;v&~7rYm?LfE^)meulWxhu+&i;}EJnYJ}OpWA-#moJKiH>+N`fm2K3E2F|K S#*QHzJ>nhrX&=v}GxQT20B%75 diff --git a/GTP/engine.py b/GTP/engine.py index d153772..cf729b0 100644 --- a/GTP/engine.py +++ b/GTP/engine.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # vim:fenc=utf-8 # $File: engine.py -# $Date: Fri Nov 17 13:5624 2017 +0800 +# $Date: Tue Nov 28 00:0616 2017 +0800 # $Author: renyong15 © # @@ -40,7 +40,7 @@ class GTPEngine(): return "resign" else: x, y = vertex - return "{}{}".format("ABCDEFGHJKLMNOPQRSTYVWYZ"[x - 1], y) + return "{}{}".format("ABCDEFGHIJKLMNOPQRSTYVWYZ"[x - 1], y) @@ -51,7 +51,7 @@ class GTPEngine(): elif s.lower() == "pass": return utils.PASS elif len(s) > 1: - x = "abcdefghjklmnopqrstuvwxyz".find(s[0].lower()) + 1 + x = "abcdefghijklmnopqrstuvwxyz".find(s[0].lower()) + 1 if x == 0: return False if s[1:].isdigit(): @@ -101,13 +101,13 @@ class GTPEngine(): def _parse_cmd(self, message): try: - m = message.strip().split(" ", 1) + m = (message.strip().split(" ", 1) + [None])[:2] if m[0].isdigit(): id_ = int(m[0]) cmd, args = (m[1].split(" ", 1) + [None])[:2] else: id_ = None - cmd, args = (m[0].split(" ", 1) + [None])[:2] + cmd, args = (m[0], m[1]) except: return "invaild command" return id_, cmd, args diff --git a/GTP/game.py b/GTP/game.py index 3034a94..c5d58fa 100644 --- a/GTP/game.py +++ b/GTP/game.py @@ -1,11 +1,90 @@ # -*- coding: utf-8 -*- # vim:fenc=utf-8 # $File: game.py -# $Date: Fri Nov 17 15:0745 2017 +0800 +# $Date: Tue Nov 28 01:1540 2017 +0800 # $Author: renyong15 © # import utils +import copy + + +''' +(1, 1) is considered as the upper left corner of the board, +(size, 1) is the lower left +''' + +DELTA = [[1,0], [-1,0], [0, -1], [0, 1]] + +class Executor: + def __init__(self, **kwargs): + self.game = kwargs['game'] + + + def _bfs(self, vertex, color, block, status, alive_break): + block.append(vertex) + status[self.game._flatten(vertex)] = True + nei = self._neighbor(vertex) + for n in nei: + if not status[self.game._flatten(n)]: + if self.game.board[self.game._flatten(n)] == color: + self._bfs(n, color, block, status, alive_break) + + def _find_block(self, vertex, alive_break = False): + block = [] + status = [False] * (self.game.size * self.game.size) + color = self.game.board[self.game._flatten(vertex)] + self._bfs(vertex, color, block, status, alive_break) + + for b in block: + for n in self._neighbor(b): + if self.game.board[self.game._flatten(n)] == utils.EMPTY: + return False,block + return True,block + + + def _check_qi(self, vertex): + pass + + def _in_board(self, vertex): + x, y = vertex + if x < 1 or x > self.game.size: return False + if y < 1 or y > self.game.size: return False + return True + + + def _neighbor(self, vertex): + x,y = vertex + nei = [] + for d in DELTA: + _x = x + d[0] + _y = y + d[1] + if self._in_board((_x, _y)): + nei.append((_x, _y)) + return nei + + def _process_board(self, color, vertex): + nei = self._neighbor(vertex) + for n in nei: + if self.game.board[self.game._flatten(n)] == utils.another_color(color): + can_kill, block = self._find_block(n, alive_break = True) + if can_kill: + for b in block: + self.game.board[self.game._flatten(b)] = utils.EMPTY + + + def is_valid(self, color, vertex): + if not self._in_board(vertex): + return False + return True + + def do_move(self, color, vertex): + if not self.is_valid(color, vertex): + return False + self.game.history.append(copy.copy(self.game.board)) + self.game.board[self.game._flatten(vertex)] = color + self._process_board(color,vertex) + return True class Game: @@ -14,10 +93,12 @@ class Game: self.komi = 6.5 self.board = [utils.EMPTY] * (self.size * self.size) self.strategy = None + self.executor = Executor(game = self) + self.history = [] def _flatten(self, vertex): x,y = vertex - return (x-1) * self.size + (y-1) + return (y - 1) * self.size + (x-1) def clear(self): @@ -30,21 +111,44 @@ class Game: def set_komi(self, k): self.komi = k + + def check_valid(self, vertex): + return True + def do_move(self, color, vertex): if vertex == utils.PASS: return True - - id_ = self._flatten(vertex) - if self.board[id_] == utils.EMPTY: - self.board[id_] = color - return True - else: - return False + res = self.executor.do_move(color, vertex) + return res + def gen_move(self, color): - move = self.strategy.gen_move(color) - return move - #return utils.PASS + #move = self.strategy.gen_move(color) + #return move + return utils.PASS + + + def status2symbol(self, s): + pool = { utils.WHITE:'#', utils.EMPTY:'.', utils.BLACK:'*', utils.FILL:'F', utils.UNKNOWN:'?'} + return pool[s] + + + def show_board(self): + row = [i for i in range(1, 20)] + col = ' abcdefghijklmnopqrstuvwxyz' + + for i in range(self.size): + print(row[i], end = ' ') + if row[i] < 10: + print(' ', end = '') + for j in range(self.size): + print(self.status2symbol(self.board[self._flatten((j+1,i+1))]), end=' ') + print('\n') + print(' ', end = '') + for j in range(self.size + 1): + print(col[j], end = ' ') + print('\n') + diff --git a/GTP/test.py b/GTP/test.py index 734e8e6..0574ce0 100644 --- a/GTP/test.py +++ b/GTP/test.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- # vim:fenc=utf-8 # $File: test.py -# $Date: Fri Nov 17 13:5600 2017 +0800 +# $Date: Tue Nov 28 01:0627 2017 +0800 # $Author: renyong15 © # from game import Game from engine import GTPEngine +import utils @@ -34,7 +35,83 @@ print(res) res = e.run_cmd('7 play BLACK C3') print(res) +res = e.run_cmd('play BLACK C4') +res = e.run_cmd('play BLACK C5') +res = e.run_cmd('play BLACK C6') +res = e.run_cmd('play BLACK D3') +print(res) + res = e.run_cmd('8 genmove BLACK') print(res) +g.show_board() +print(g.check_valid((10, 9))) +print(g.executor._neighbor((1,1))) +print(g.do_move(utils.WHITE, (4, 6))) +g.show_board() + + +res = e.run_cmd('play BLACK L10') +res = e.run_cmd('play BLACK L11') +res = e.run_cmd('play BLACK L12') +res = e.run_cmd('play BLACK L13') +res = e.run_cmd('play BLACK L14') +res = e.run_cmd('play BLACK m15') +res = e.run_cmd('play BLACK m9') +res = e.run_cmd('play BLACK C9') +res = e.run_cmd('play BLACK D9') +res = e.run_cmd('play BLACK E9') +res = e.run_cmd('play BLACK F9') +res = e.run_cmd('play BLACK G9') +res = e.run_cmd('play BLACK H9') +res = e.run_cmd('play BLACK I9') + +res = e.run_cmd('play BLACK N9') +res = e.run_cmd('play BLACK N15') +res = e.run_cmd('play BLACK O10') +res = e.run_cmd('play BLACK O11') +res = e.run_cmd('play BLACK O12') +res = e.run_cmd('play BLACK O13') +res = e.run_cmd('play BLACK O14') +res = e.run_cmd('play BLACK M12') + +res = e.run_cmd('play WHITE M10') +res = e.run_cmd('play WHITE M11') +res = e.run_cmd('play WHITE N10') +res = e.run_cmd('play WHITE N11') + +res = e.run_cmd('play WHITE M13') +res = e.run_cmd('play WHITE M14') +res = e.run_cmd('play WHITE N13') +res = e.run_cmd('play WHITE N14') +print(res) + +res = e.run_cmd('play BLACK N12') +print(res) +g.show_board() + +res = e.run_cmd('play BLACK P16') +res = e.run_cmd('play BLACK P17') +res = e.run_cmd('play BLACK P18') +res = e.run_cmd('play BLACK P19') +res = e.run_cmd('play BLACK Q16') +res = e.run_cmd('play BLACK R16') +res = e.run_cmd('play BLACK S16') +res = e.run_cmd('play BLACK S19') + +res = e.run_cmd('play WHITE S18') +res = e.run_cmd('play WHITE S17') +res = e.run_cmd('play WHITE Q19') +res = e.run_cmd('play WHITE Q18') +res = e.run_cmd('play WHITE Q17') +res = e.run_cmd('play WHITE R18') +res = e.run_cmd('play WHITE R17') +print(res) +g.show_board() + +res = e.run_cmd('play WHITE R19') +g.show_board() + +res = e.run_cmd('play BLACK S19') +g.show_board() diff --git a/GTP/utils.py b/GTP/utils.py index dcf0160..b7ce00c 100644 --- a/GTP/utils.py +++ b/GTP/utils.py @@ -1,16 +1,22 @@ # -*- coding: utf-8 -*- # vim:fenc=utf-8 # $File: utils.py -# $Date: Fri Nov 17 10:2407 2017 +0800 +# $Date: Mon Nov 27 18:2755 2017 +0800 # $Author: renyong15 © # WHITE = -1 -BLACK = +1 EMPTY = 0 +BLACK = +1 +FILL = +2 +KO = +3 +UNKNOWN = +4 PASS = (0,0) RESIGN = "resign" +def another_color(color): + return color * -1 + From ead5aa83cd311e0e4e4605b0deb9b14a0f393112 Mon Sep 17 00:00:00 2001 From: mcgrady00h <281130306@qq.com> Date: Tue, 28 Nov 2017 14:47:30 +0800 Subject: [PATCH 2/4] check valid position --- GTP/.game.py.swp | Bin 20480 -> 0 bytes GTP/.test.py.swp | Bin 12288 -> 12288 bytes GTP/game.py | 57 +++++++++++++++++++++++++++++++++++++++++++---- GTP/test.py | 36 +++++++++++++++++++++++++----- 4 files changed, 83 insertions(+), 10 deletions(-) delete mode 100644 GTP/.game.py.swp diff --git a/GTP/.game.py.swp b/GTP/.game.py.swp deleted file mode 100644 index 4ad0ba67b4dcd2924fc518e0541320ba56605133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 diff --git a/GTP/game.py b/GTP/game.py index c5d58fa..7f1b4c6 100644 --- a/GTP/game.py +++ b/GTP/game.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # vim:fenc=utf-8 # $File: game.py -# $Date: Tue Nov 28 01:1540 2017 +0800 +# $Date: Tue Nov 28 14:4726 2017 +0800 # $Author: renyong15 © # @@ -43,8 +43,43 @@ class Executor: return True,block - def _check_qi(self, vertex): - pass + def _is_qi(self, color, vertex): + nei = self._neighbor(vertex) + for n in nei: + if self.game.board[self.game._flatten(n)] == utils.EMPTY: + return True + + self.game.board[self.game._flatten(vertex)] = color + for n in nei: + if self.game.board[self.game._flatten(n)] == utils.another_color(color): + can_kill,block = self._find_block(n) + if can_kill: + self.game.board[self.game._flatten(vertex)] = utils.EMPTY + return True + + ### can not suicide + can_kill,block = self._find_block(vertex) + if can_kill: + self.game.board[self.game._flatten(vertex)] = utils.EMPTY + return False + + self.game.board[self.game._flatten(vertex)] = utils.EMPTY + return True + + + def _check_global_isomorphous(self, color, vertex): + ##backup + _board = copy.copy(self.game.board) + self.game.board[self.game._flatten(vertex)] = color + self._process_board(color, vertex) + if self.game.board in self.game.history: + res = True + else: + res = False + + self.game.board = _board + return res + def _in_board(self, vertex): x, y = vertex @@ -74,16 +109,30 @@ class Executor: def is_valid(self, color, vertex): + ### in board if not self._in_board(vertex): return False + + ### already have stone + if not self.game.board[self.game._flatten(vertex)] == utils.EMPTY: + return False + + ### check if it is qi + if not self._is_qi(color, vertex): + return False + + + if self._check_global_isomorphous(color, vertex): + return False + return True def do_move(self, color, vertex): if not self.is_valid(color, vertex): return False - self.game.history.append(copy.copy(self.game.board)) self.game.board[self.game._flatten(vertex)] = color self._process_board(color,vertex) + self.game.history.append(copy.copy(self.game.board)) return True diff --git a/GTP/test.py b/GTP/test.py index 0574ce0..0b8d4df 100644 --- a/GTP/test.py +++ b/GTP/test.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- # vim:fenc=utf-8 # $File: test.py -# $Date: Tue Nov 28 01:0627 2017 +0800 +# $Date: Tue Nov 28 14:4717 2017 +0800 # $Author: renyong15 © # @@ -44,11 +44,11 @@ print(res) res = e.run_cmd('8 genmove BLACK') print(res) -g.show_board() +#g.show_board() print(g.check_valid((10, 9))) print(g.executor._neighbor((1,1))) print(g.do_move(utils.WHITE, (4, 6))) -g.show_board() +#g.show_board() res = e.run_cmd('play BLACK L10') @@ -88,7 +88,7 @@ print(res) res = e.run_cmd('play BLACK N12') print(res) -g.show_board() +#g.show_board() res = e.run_cmd('play BLACK P16') res = e.run_cmd('play BLACK P17') @@ -97,7 +97,6 @@ res = e.run_cmd('play BLACK P19') res = e.run_cmd('play BLACK Q16') res = e.run_cmd('play BLACK R16') res = e.run_cmd('play BLACK S16') -res = e.run_cmd('play BLACK S19') res = e.run_cmd('play WHITE S18') res = e.run_cmd('play WHITE S17') @@ -106,12 +105,37 @@ res = e.run_cmd('play WHITE Q18') res = e.run_cmd('play WHITE Q17') res = e.run_cmd('play WHITE R18') res = e.run_cmd('play WHITE R17') +res = e.run_cmd('play BLACK S19') print(res) -g.show_board() +#g.show_board() res = e.run_cmd('play WHITE R19') g.show_board() res = e.run_cmd('play BLACK S19') +print(res) g.show_board() +res = e.run_cmd('play BLACK S19') +print(res) + + +res = e.run_cmd('play BLACK E17') +res = e.run_cmd('play BLACK F16') +res = e.run_cmd('play BLACK F18') +res = e.run_cmd('play BLACK G17') +res = e.run_cmd('play WHITE G16') +res = e.run_cmd('play WHITE G18') +res = e.run_cmd('play WHITE H17') +g.show_board() + +res = e.run_cmd('play WHITE F17') +g.show_board() + +res = e.run_cmd('play BLACK G17') +print(res) +g.show_board() + +res = e.run_cmd('play BLACK G19') +res = e.run_cmd('play BLACK G17') +g.show_board() From 2f95a1d8541c3a1832e4df57011a09b7a0e287ed Mon Sep 17 00:00:00 2001 From: rtz19970824 Date: Tue, 28 Nov 2017 15:04:00 +0800 Subject: [PATCH 3/4] remove .swp --- .gitignore | 1 + GTP/.game.py.swp | Bin 12288 -> 0 bytes GTP/.test.py.swp | Bin 12288 -> 0 bytes GTP/.utils.py.swp | Bin 12288 -> 0 bytes GTP/engine.py | 55 ++++++++++++++------------------------ utils/.gtp.py.swp | Bin 16384 -> 0 bytes utils/.gtp_wrapper.py.swp | Bin 12288 -> 0 bytes 7 files changed, 21 insertions(+), 35 deletions(-) delete mode 100644 GTP/.game.py.swp delete mode 100644 GTP/.test.py.swp delete mode 100644 GTP/.utils.py.swp delete mode 100644 utils/.gtp.py.swp delete mode 100644 utils/.gtp_wrapper.py.swp diff --git a/.gitignore b/.gitignore index 8caffae..4068cd2 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ leela-zero *.pyc parameters +*.swp \ No newline at end of file diff --git a/GTP/.game.py.swp b/GTP/.game.py.swp deleted file mode 100644 index ab62fba620f59722d393c77991422843fcfd8c1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2J4_To7{><-NmS4%EphaWx#O|-00d6XNP-X(Fes;q61*&TbH|2#Ty|#(hf#Z5 z3txq`jjgsCV{apN8Vh4%W$gXW?%v)31`<2v+vJyJ=kd+={br}Qu*;bnm*@DHmSMP# zG4|#`_pNWeJw3%oj9KNHt5+JTXV=Sg%DTDYcyiZKjNOX@rl*9rDxG?|=oxlx#n)%` z<@B}L8Q1aaX=&)Tx8nHenc{r9rdvX*@14OO3sW~4*zX2>SsfhfVnexXaMTm0Pw^AS zukUv&R6iLY17v^Mu{{H`dl(9|l9y|vQuz(3l;5JwSSHW4( z1%7oi_8L3`Pr(KdU;+$*9OwmKx)}Qm-hr3k33v?df*PoTi{K>a1P8&_BaFQQ55XN^ zfg)G{!=MxVL=B(7CinaAODXK+nsB99PyI3FExBNwa4au0!z-6zbmgMrgo@f!3`A2>ZAyZA zRvpVgDyu;iYO*I}Ni`pn#w;>R; z#QS(KK?~ybMSG7ht&I+sSIM=9j5i_LUQe;^56|&<4 zT*W9L0`!zk-ShYiK3qo$%&_W?E5jF(u>?!-Gn2ktaojvkhTU-NT6ToLeZeOzU7b%E zeGspSim#RJ3u^on4q={8y9Nqh^BvCa&7?B0!I7*kJf}D>2^z@)CNp=5n=>G407<&4BKH@x;wM(OG(w}(T{;w zYy+KvW7Pu}7@x49z zVB^R5<(Usc1dbcYMmw81^Xlc|!iIE~jA<4&BV+l-k^bqjr@dftMa9j;gvG7c)9zj> z*X2&}-uhZ((y*9#QpbBHEv{{C784aGRycSCr$2{#Y=8~)8Ay}eLUlxxr%Ro$dhY5K z8ozYEFT`Cozy{a=8(;%$fDNz#Hoyk{Wdlh#B%Wb|!@W)Bd+ktP+v{?}2G{@_U;}J` z4X^<=zy{a=8(;%$fDN2O1F|8+n+rlb8o}c6|NqJF|F2_0d<4hf5Eu{uA8dmgpbF+d z1x$f4@NHCx_uv@314rNmI0Og42Td>!O27sqU>FR6FIdNC@Cm#IN8lBB4xWI=ptII< z=$eR?x%L zOQb73J*c!ye-;j^nI*1L^s(mGln8TdI*-j=q`YS7f4Uv>JJI*R-fKN2PLYwqn~fZKE?~S8Y3s mt$IFUCkN(p)bfJbuF}pz=io0Ah3f@!OamwGYt$LbM#N8}#1H}i diff --git a/GTP/.utils.py.swp b/GTP/.utils.py.swp deleted file mode 100644 index 10f4201a98cf1eb81170a54934f2aabe2153b92d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&%Wl&^6b9fER%|F$!vhQnQZK>wIDi^Oq*6+Aqe&GtX)C(w)NvCljwkXZQa11a zyaW5bMkRJ^SmhOX42~;-ddk_?dTR7TZTi|#{@u$yW{uW?8%<+9w}z1yj3qWBn1TQV zAOHafKmY;|fB*#kSAlq*qfh*BkFp2kR{*yo_s20Saex2>AOHafKmY;|fB*y_009U< z-~kG#5z)6bqOGTV^St=~wf_IX^@{VA^Mw;|e9n|}!8zd^a^7=loDye;v&~7rYm?LfE^)meulWxhu+&i;}EJnYJ}OpWA-#moJKiH>+N`fm2K3E2F|K S#*QHzJ>nhrX&=v}GxQT20B%75 diff --git a/GTP/engine.py b/GTP/engine.py index d153772..350d3a5 100644 --- a/GTP/engine.py +++ b/GTP/engine.py @@ -6,7 +6,8 @@ # from game import Game -import utils +import utils + class GTPEngine(): def __init__(self, **kwargs): @@ -27,7 +28,6 @@ class GTPEngine(): except: self._version = 2 - self.disconnect = False self.known_commands = [ @@ -42,9 +42,6 @@ class GTPEngine(): x, y = vertex return "{}{}".format("ABCDEFGHJKLMNOPQRSTYVWYZ"[x - 1], y) - - - def _vertex_string2point(self, s): if s is None: return False @@ -62,7 +59,6 @@ class GTPEngine(): return False return (x, y) - def _parse_color(self, color): if color.lower() in ["b", "black"]: color = utils.BLACK @@ -72,21 +68,18 @@ class GTPEngine(): color = None return color - def _parse_move(self, move_string): - color, move = move_string.split(" ",1) + color, move = move_string.split(" ", 1) color = self._parse_color(color) point = self._vertex_string2point(move) if point and color: - return color,point + return color, point else: return False - - - def _parse_res(self, res, id_ = None, success = True): + def _parse_res(self, res, id_=None, success=True): if success: if id_: return '={} {}\n\n'.format(id_, res) @@ -98,7 +91,6 @@ class GTPEngine(): else: return '? {}\n\n'.format(res) - def _parse_cmd(self, message): try: m = message.strip().split(" ", 1) @@ -119,19 +111,17 @@ class GTPEngine(): return self._parse_res("invaild message", id_, False) if cmd in self.known_commands: - #dispatch - #try: + # dispatch + # try: if True: res, flag = getattr(self, "cmd_" + cmd)(args) return self._parse_res(res, id_, flag) - #except Exception as e: - # print(e) - # return self._parse_res("command excution failed", id_, False) + # except Exception as e: + # print(e) + # return self._parse_res("command excution failed", id_, False) else: return self._parse_res("unknown command", id_, False) - - def cmd_protocol_version(self, args, **kwargs): return 2, True @@ -148,50 +138,45 @@ class GTPEngine(): return self.known_commands, True def cmd_quit(self, args, **kwargs): - return None,True + return None, True def cmd_boardsize(self, args, **kwargs): if args.isdigit(): size = int(args) self.size = size self._game.set_size(size) - return None,True + return None, True else: - return 'non digit size',False + return 'non digit size', False def cmd_clear_board(self, args, **kwargs): self._game.clear() - return None,True + return None, True def cmd_komi(self, args, **kwargs): try: komi = float(args) self.komi = komi self._game.set_komi(komi) - return None,True + return None, True except ValueError: raise ValueError("syntax error") - def cmd_play(self, args, **kwargs): move = self._parse_move(args) if move: color, vertex = move res = self._game.do_move(color, vertex) if res: - return None,True + return None, True else: - return None,False - return None,True + return None, False + return None, True def cmd_genmove(self, args, **kwargs): color = self._parse_color(args) if color: move = self._game.gen_move(color) - return self._vertex_point2string(move),True + return self._vertex_point2string(move), True else: - return 'unknown player',False - - - - + return 'unknown player', False diff --git a/utils/.gtp.py.swp b/utils/.gtp.py.swp deleted file mode 100644 index d8e829bb0902a89fe780c1424185ef77c9697e5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 QrER{W`ZsMg_+~Tq7tHKOvH$=8 From 56012c8de90c28e38d34de18b4828c835b0dc09f Mon Sep 17 00:00:00 2001 From: rtz19970824 Date: Tue, 28 Nov 2017 15:10:41 +0800 Subject: [PATCH 4/4] minor fixed --- GTP/game.py | 66 ++++++++++++++++++++--------------------------------- 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/GTP/game.py b/GTP/game.py index 7f1b4c6..76b0750 100644 --- a/GTP/game.py +++ b/GTP/game.py @@ -8,19 +8,18 @@ import utils import copy - ''' (1, 1) is considered as the upper left corner of the board, (size, 1) is the lower left ''' -DELTA = [[1,0], [-1,0], [0, -1], [0, 1]] +DELTA = [[1, 0], [-1, 0], [0, -1], [0, 1]] + class Executor: def __init__(self, **kwargs): self.game = kwargs['game'] - def _bfs(self, vertex, color, block, status, alive_break): block.append(vertex) status[self.game._flatten(vertex)] = True @@ -30,7 +29,7 @@ class Executor: if self.game.board[self.game._flatten(n)] == color: self._bfs(n, color, block, status, alive_break) - def _find_block(self, vertex, alive_break = False): + def _find_block(self, vertex, alive_break=False): block = [] status = [False] * (self.game.size * self.game.size) color = self.game.board[self.game._flatten(vertex)] @@ -39,34 +38,32 @@ class Executor: for b in block: for n in self._neighbor(b): if self.game.board[self.game._flatten(n)] == utils.EMPTY: - return False,block - return True,block - + return False, block + return True, block def _is_qi(self, color, vertex): nei = self._neighbor(vertex) for n in nei: if self.game.board[self.game._flatten(n)] == utils.EMPTY: return True - + self.game.board[self.game._flatten(vertex)] = color for n in nei: if self.game.board[self.game._flatten(n)] == utils.another_color(color): - can_kill,block = self._find_block(n) - if can_kill: + can_kill, block = self._find_block(n) + if can_kill: self.game.board[self.game._flatten(vertex)] = utils.EMPTY return True ### can not suicide - can_kill,block = self._find_block(vertex) - if can_kill: + can_kill, block = self._find_block(vertex) + if can_kill: self.game.board[self.game._flatten(vertex)] = utils.EMPTY return False self.game.board[self.game._flatten(vertex)] = utils.EMPTY return True - def _check_global_isomorphous(self, color, vertex): ##backup _board = copy.copy(self.game.board) @@ -80,16 +77,14 @@ class Executor: self.game.board = _board return res - def _in_board(self, vertex): - x, y = vertex + x, y = vertex if x < 1 or x > self.game.size: return False if y < 1 or y > self.game.size: return False return True - def _neighbor(self, vertex): - x,y = vertex + x, y = vertex nei = [] for d in DELTA: _x = x + d[0] @@ -102,11 +97,10 @@ class Executor: nei = self._neighbor(vertex) for n in nei: if self.game.board[self.game._flatten(n)] == utils.another_color(color): - can_kill, block = self._find_block(n, alive_break = True) + can_kill, block = self._find_block(n, alive_break=True) if can_kill: for b in block: self.game.board[self.game._flatten(b)] = utils.EMPTY - def is_valid(self, color, vertex): ### in board @@ -121,7 +115,6 @@ class Executor: if not self._is_qi(color, vertex): return False - if self._check_global_isomorphous(color, vertex): return False @@ -131,7 +124,7 @@ class Executor: if not self.is_valid(color, vertex): return False self.game.board[self.game._flatten(vertex)] = color - self._process_board(color,vertex) + self._process_board(color, vertex) self.game.history.append(copy.copy(self.game.board)) return True @@ -142,13 +135,12 @@ class Game: self.komi = 6.5 self.board = [utils.EMPTY] * (self.size * self.size) self.strategy = None - self.executor = Executor(game = self) + self.executor = Executor(game=self) self.history = [] def _flatten(self, vertex): - x,y = vertex - return (y - 1) * self.size + (x-1) - + x, y = vertex + return (y - 1) * self.size + (x - 1) def clear(self): self.board = [utils.EMPTY] * (self.size * self.size) @@ -160,7 +152,6 @@ class Game: def set_komi(self, k): self.komi = k - def check_valid(self, vertex): return True @@ -169,35 +160,28 @@ class Game: return True res = self.executor.do_move(color, vertex) return res - def gen_move(self, color): - #move = self.strategy.gen_move(color) - #return move + # move = self.strategy.gen_move(color) + # return move return utils.PASS - def status2symbol(self, s): - pool = { utils.WHITE:'#', utils.EMPTY:'.', utils.BLACK:'*', utils.FILL:'F', utils.UNKNOWN:'?'} + pool = {utils.WHITE: '#', utils.EMPTY: '.', utils.BLACK: '*', utils.FILL: 'F', utils.UNKNOWN: '?'} return pool[s] - def show_board(self): row = [i for i in range(1, 20)] col = ' abcdefghijklmnopqrstuvwxyz' for i in range(self.size): - print(row[i], end = ' ') + print(row[i]) if row[i] < 10: - print(' ', end = '') + print(' ') for j in range(self.size): - print(self.status2symbol(self.board[self._flatten((j+1,i+1))]), end=' ') + print(self.status2symbol(self.board[self._flatten((j + 1, i + 1))])) print('\n') - print(' ', end = '') + print(' ') for j in range(self.size + 1): - print(col[j], end = ' ') + print(col[j]) print('\n') - - - -