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,name,handler=None):
self.name=name
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]!="putFrame" else "('putFrame', ..., {})")
if msg[0]=="!kill": break
self._handleEvent(msg)
log.info("%s MsgQueue exiting.",self.name)
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)