From 17a22138f75e8968efaf1de9b054c4ae5321c2c0 Mon Sep 17 00:00:00 2001 From: RenYong <281130306@qq.com> Date: Mon, 20 Nov 2017 12:44:29 +0800 Subject: [PATCH] add GTP support --- GTP/.game.py.swp | Bin 0 -> 12288 bytes GTP/.test.py.swp | Bin 0 -> 12288 bytes GTP/.utils.py.swp | Bin 0 -> 12288 bytes GTP/__init__.py | 7 ++ GTP/engine.py | 197 ++++++++++++++++++++++++++++++++++++++ GTP/game.py | 50 ++++++++++ GTP/test.py | 40 ++++++++ GTP/utils.py | 16 ++++ utils/.gtp.py.swp | Bin 0 -> 16384 bytes utils/.gtp_wrapper.py.swp | Bin 0 -> 12288 bytes 10 files changed, 310 insertions(+) create mode 100644 GTP/.game.py.swp create mode 100644 GTP/.test.py.swp create mode 100644 GTP/.utils.py.swp create mode 100644 GTP/__init__.py create mode 100644 GTP/engine.py create mode 100644 GTP/game.py create mode 100644 GTP/test.py create mode 100644 GTP/utils.py create mode 100644 utils/.gtp.py.swp create mode 100644 utils/.gtp_wrapper.py.swp diff --git a/GTP/.game.py.swp b/GTP/.game.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..ab62fba620f59722d393c77991422843fcfd8c1f GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/GTP/.utils.py.swp b/GTP/.utils.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..10f4201a98cf1eb81170a54934f2aabe2153b92d GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/GTP/__init__.py b/GTP/__init__.py new file mode 100644 index 0000000..bdd4708 --- /dev/null +++ b/GTP/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# $File: __init__.py +# $Date: Thu Nov 16 14:1006 2017 +0800 +# $Author: renyong15 © +# + diff --git a/GTP/engine.py b/GTP/engine.py new file mode 100644 index 0000000..d153772 --- /dev/null +++ b/GTP/engine.py @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# $File: engine.py +# $Date: Fri Nov 17 13:5624 2017 +0800 +# $Author: renyong15 © +# + +from game import Game +import utils + +class GTPEngine(): + def __init__(self, **kwargs): + self.size = 19 + self.komi = 6.5 + try: + self._game = kwargs['game_obj'] + self._game.clear() + except: + self._game = None + + try: + self._name = kwargs['name'] + except: + self._name = 'gtp engine' + try: + self._version = kwargs['version'] + except: + self._version = 2 + + + self.disconnect = False + + self.known_commands = [ + field[4:] for field in dir(self) if field.startswith("cmd_")] + + def _vertex_point2string(self, vertex): + if vertex == utils.PASS: + return "pass" + elif vertex == utils.RESIGN: + return "resign" + else: + x, y = vertex + return "{}{}".format("ABCDEFGHJKLMNOPQRSTYVWYZ"[x - 1], y) + + + + + def _vertex_string2point(self, s): + if s is None: + return False + elif s.lower() == "pass": + return utils.PASS + elif len(s) > 1: + x = "abcdefghjklmnopqrstuvwxyz".find(s[0].lower()) + 1 + if x == 0: + return False + if s[1:].isdigit(): + y = int(s[1:]) + else: + return False + else: + return False + return (x, y) + + + def _parse_color(self, color): + if color.lower() in ["b", "black"]: + color = utils.BLACK + elif color.lower() in ["w", "white"]: + color = utils.WHITE + else: + color = None + return color + + + def _parse_move(self, move_string): + color, move = move_string.split(" ",1) + color = self._parse_color(color) + + point = self._vertex_string2point(move) + + if point and color: + return color,point + else: + return False + + + + def _parse_res(self, res, id_ = None, success = True): + if success: + if id_: + return '={} {}\n\n'.format(id_, res) + else: + return '= {}\n\n'.format(res) + else: + if id_: + return '?{} {}\n\n'.format(id_, res) + else: + return '? {}\n\n'.format(res) + + + def _parse_cmd(self, message): + try: + m = message.strip().split(" ", 1) + 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] + except: + return "invaild command" + return id_, cmd, args + + def run_cmd(self, message): + try: + id_, cmd, args = self._parse_cmd(message) + except: + return self._parse_res("invaild message", id_, False) + + if cmd in self.known_commands: + #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) + else: + return self._parse_res("unknown command", id_, False) + + + + def cmd_protocol_version(self, args, **kwargs): + return 2, True + + def cmd_name(self, args, **kwargs): + return self._name, True + + def cmd_version(self, args, **kwargs): + return self._version, True + + def cmd_known_command(self, args, **kwargs): + return 'true' if (args in self.known_commands) else 'false', True + + def cmd_list_commands(self, args, **kwargs): + return self.known_commands, True + + def cmd_quit(self, args, **kwargs): + 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 + else: + return 'non digit size',False + + def cmd_clear_board(self, args, **kwargs): + self._game.clear() + return None,True + + def cmd_komi(self, args, **kwargs): + try: + komi = float(args) + self.komi = komi + self._game.set_komi(komi) + 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 + else: + 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 + else: + return 'unknown player',False + + + + diff --git a/GTP/game.py b/GTP/game.py new file mode 100644 index 0000000..3034a94 --- /dev/null +++ b/GTP/game.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# $File: game.py +# $Date: Fri Nov 17 15:0745 2017 +0800 +# $Author: renyong15 © +# + +import utils + + +class Game: + def __init__(self, size=19, komi=6.5): + self.size = size + self.komi = 6.5 + self.board = [utils.EMPTY] * (self.size * self.size) + self.strategy = None + + def _flatten(self, vertex): + x,y = vertex + return (x-1) * self.size + (y-1) + + + def clear(self): + self.board = [utils.EMPTY] * (self.size * self.size) + + def set_size(self, n): + self.size = n + self.clear() + + def set_komi(self, k): + self.komi = k + + 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 + + def gen_move(self, color): + move = self.strategy.gen_move(color) + return move + #return utils.PASS + + + diff --git a/GTP/test.py b/GTP/test.py new file mode 100644 index 0000000..734e8e6 --- /dev/null +++ b/GTP/test.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# $File: test.py +# $Date: Fri Nov 17 13:5600 2017 +0800 +# $Author: renyong15 © +# + +from game import Game +from engine import GTPEngine + + + +g = Game() +e = GTPEngine(game_obj = g) +res = e.run_cmd('1 protocol_version') +print(e.known_commands) +print(res) + +res = e.run_cmd('2 name') +print(res) + +res = e.run_cmd('3 known_command quit') +print(res) + +res = e.run_cmd('4 unknown_command quitagain') +print(res) + +res = e.run_cmd('5 list_commands') +print(res) + +res = e.run_cmd('6 komi 6') +print(res) + +res = e.run_cmd('7 play BLACK C3') +print(res) + +res = e.run_cmd('8 genmove BLACK') +print(res) + + diff --git a/GTP/utils.py b/GTP/utils.py new file mode 100644 index 0000000..dcf0160 --- /dev/null +++ b/GTP/utils.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# vim:fenc=utf-8 +# $File: utils.py +# $Date: Fri Nov 17 10:2407 2017 +0800 +# $Author: renyong15 © +# + +WHITE = -1 +BLACK = +1 +EMPTY = 0 + +PASS = (0,0) +RESIGN = "resign" + + + diff --git a/utils/.gtp.py.swp b/utils/.gtp.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..d8e829bb0902a89fe780c1424185ef77c9697e5e GIT binary patch literal 16384 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 QrER{W`ZsMg_+~Tq7tHKOvH$=8 literal 0 HcmV?d00001