from .resizablecanvas import ResizableCanvas
from go.core import BLACK,WHITE
## Handles and presents the game state as detected by the program.
class BoardView(ResizableCanvas):
def __init__(self, master=None):
super().__init__(master)
self._padding=24
self.configure(width=360,height=360,background="#ffcc00")
self._drawGrid()
def redrawState(self,gameState,labels=dict()):
self.delete("black","white","label")
for r,row in enumerate(gameState):
for c,point in enumerate(row):
self._drawStone(r, c, point, labels.get((r,c)))
def configure(self,*args,**kwargs):
super().configure(*args,**kwargs)
self._cellWidth=(self._width-2*self._padding)/18
self._cellHeight=(self._height-2*self._padding)/18
def _drawGrid(self):
padding=self._padding
for i in range(19):
self.create_line(padding,self._cellHeight*i+padding,self._width-padding,self._cellHeight*i+padding,tags="row",fill="#000000") # rows
self.create_line(self._cellWidth*i+padding,padding,self._cellWidth*i+padding,self._height-padding,tags="col",fill="#000000") # cols
self._drawStars()
self._drawCoordinates()
def _drawStars(self):
radius=2
for r in range(3,19,6):
for c in range(3,19,6):
x=c*self._cellHeight+self._padding
y=r*self._cellWidth+self._padding
self.create_oval(x-radius,y-radius,x+radius,y+radius,tags="star",fill='#000000')
def _drawCoordinates(self):
for i in range(19):
letters="ABCDEFGHJKLMNOPQRST"
textWidth=12
# cols
self.create_text(self._padding+i*self._cellWidth,self._padding-textWidth,text=letters[i],tags="coords")
self.create_text(self._padding+i*self._cellWidth,self._height-self._padding+textWidth,text=letters[i],tags="coords")
# rows
self.create_text(self._padding-textWidth,self._padding+i*self._cellHeight,text=str(19-i),tags="coords")
self.create_text(self._width-self._padding+textWidth,self._padding+i*self._cellHeight,text=str(19-i),tags="coords")
## Draws a stone at provided coordinates.
#
# For an unknown color draws nothing and returns False.
#
# @param r row coordinate, [0-18], counted from top
# @param c column coordinate, [0-18], counted from left
# @param color color indicator, go.BLACK or go.WHITE
def _drawStone(self, r, c, color, label=""):
if color==BLACK:
hexCode='#000000'
altCode='#ffffff'
tag="black"
elif color==WHITE:
hexCode='#ffffff'
altCode='#000000'
tag="white"
else: return False
x=c*self._cellWidth+self._padding
y=r*self._cellHeight+self._padding
radius=self._cellWidth/2
self.create_oval(x-radius,y-radius,x+radius,y+radius,tags=tag,fill=hexCode)
if label:
self.create_text(x,y,text=label,tags="label",fill=altCode)
def _onResize(self,event):
super()._onResize(event)
self._padding=24*self._width/360
self._cellWidth=(self._width-2*self._padding)/18
self._cellHeight=(self._height-2*self._padding)/18