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