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/2] 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/2] 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()