import random import multiprocessing import logging log=logging.getLogger(__name__) EMPTY=0 BLACK=1 WHITE=-1 colorNames={BLACK:"B",WHITE:"W"} class MsgQueue: def __init__(self,handler=None): self._queue=multiprocessing.Queue() self._event=multiprocessing.Event() self._handleEvent=handler def send(self,actionName,args=tuple(),kwargs=None): if kwargs is None: kwargs=dict() self._queue.put((actionName,args,kwargs)) self._event.set() def listen(self,handleEvent=None): if handleEvent is not None: self._handleEvent=handleEvent while True: self._event.wait() msg=self._queue.get() if self._queue.empty(): self._event.clear() log.info(msg) if msg[0]=="!kill": self._queue.cancel_join_thread() break self._handleEvent(msg) def setHandler(self,handler): self._handleEvent=handler rand=random.Random() rand.seed(361) zobristNums=tuple( tuple( tuple(rand.getrandbits(32) for i in range(3)) for c in range(19) ) for r in range(19) ) def hashBoard(board): res=0 for (r,row) in enumerate(board): for (c,item) in enumerate(row): res^=zobristNums[r][c][item+1] return res def diffHash(r,c,oldItem,newItem): h=zobristNums[r][c] return h[oldItem+1] ^ h[newItem+1] def exportBoard(board): substitutions={BLACK:"X", WHITE:"O"} template=[["."]*19 for r in range(19)] for r in range(3,19,6): for c in range(3,19,6): template[r][c]="," for (row,templateRow) in zip(board,template): for (c,x) in enumerate(row): if x!=EMPTY: templateRow[c]=substitutions[x] return "\n".join("".join(row) for row in template)