# coding: utf-8 ### SHOWGO.PY # Copyright (C) 2002 James Tauber # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # TODO # partial boards 刷新棋盘一部分的功能 # numbers need to make blank if not on stone 某一点没有棋子但是要显示数字 # allow resizing of canvas with automatic scaling of board 棋盘大小随着窗口大小变化 # 我改动了def draw_starpoint(x, y)函数中的两行代码,改进了星位的显示效果 import Tkinter import tkFont import time pic=1 bl=1 wh=1 class ShowGo: def __init__(self, canvas, size=19, scale=25): # canvas是画布,棋盘、棋子都画在这上面 canvas.delete(Tkinter.ALL) self.scale = scale # 棋盘格子宽度 self.canvas = canvas self.size = size # 棋盘大小 self.contents = [] self.item = [] for i in range(size + 1): self.contents.append([None] * (size + 1)) self.item.append([None] * (size + 1)) margin = scale * 1.5 # 画布边缘到棋盘格子的宽度? padding = scale / 1.5 # 棋盘边缘到棋盘格子的宽度 number_fontfamily = "arial narrow" # 数字字体 number_fontsize = int(scale / 2.5) # 数字字体大小 number_fontweight = tkFont.BOLD self.number_font = tkFont.Font(family=number_fontfamily, size=number_fontsize, weight=number_fontweight) letter_fontfamily = "arial narrow" # 文字字体 self.letter_fontsize = letter_fontsize = int(scale / 2) # 文字字体大小 letter_fontweight = tkFont.BOLD self.letter_font = tkFont.Font(family=letter_fontfamily, size=letter_fontsize, weight=letter_fontweight) self.start_x = start_x = margin # 棋盘左上角(1,1)的x坐标 self.start_y = start_y = margin # 棋盘左上角(1,1)的y坐标 end_x = margin + (scale * (size - 1)) # 棋盘右下角(19,19)的x坐标 end_y = margin + (scale * (size - 1)) # 棋盘右下角(19,19)的y坐标 starpoint_radius = int(scale / 10) # 星位的半径 self.stone_radius = int(scale /2 - scale / 16) # 棋子的半径 self.line_thickness = int(scale / 20) # 棋盘线的宽度 edge_thickness = int(scale / 15) # 棋盘边缘线的宽度 # canvas.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1) # Picture Panel=Tkinter.PhotoImage global pic pic=Tkinter.PhotoImage(file='board.gif') tem = canvas.create_image(346, 346, image=pic) # c=Tkinter.Canvas #global bl #bl=Tkinter.PhotoImage(file='black.gif') #tem1 = canvas.create_image(200, 200, image=bl) # c=Tkinter.Canvas #global wh #wh=Tkinter.PhotoImage(file='white.gif') #tem2 = canvas.create_image(100, 100, image=wh) # c=Tkinter.Canvas # canvas.create_rectangle(start_x - padding, start_y - padding, end_x + padding, end_y + padding, width=edge_thickness) # 棋盘19x19以外的那个正方形,参数为左上角坐标、右下角坐标、线的宽度,我调整了左上角坐标 #for i in range(size-1): # FIX 画棋盘线 # vertical line 垂直线 # canvas.create_line(int(start_x + (i * scale)), int(start_y), int(start_x +(i * scale)), int(end_y)) # horizontal line 水平线 # canvas.create_line(int(start_x), int(start_y + (i * scale)), int(end_x), int(start_y + (i * scale))) #canvas.create_line(int(start_x + ((size-1) * scale)), int(start_y), int(start_x +((size-1) * scale)), int(end_y)) # FIX #canvas.create_line(int(start_x), int(start_y + ((size-1) * scale)), int(end_x + 1), int(start_y + ((size-1) * scale))) # FIX def draw_starpoint(x, y): # 画一个星位的函数 return x1 = (scale * (x - 1)) - starpoint_radius - 1 # FIX, -1 是我加的,改进了星位的显示效果 y1 = (scale * (y - 1)) - starpoint_radius - 1 x2 = (scale * (x - 1)) + starpoint_radius + 1 # FIX, +1 是我加的,改进了星位的显示效果 y2 = (scale * (y - 1)) + starpoint_radius + 1 canvas.create_oval(int(start_x + x1), int(start_y + y1), int(start_x + x2), int(start_y + y2), fill="black") # create_oval 是画椭圆吧? def draw_starpoints(list): # 画9个星位的函数 for x in list: for y in list: draw_starpoint(x,y) if size == 19: point_list = [4, 10, 16] elif size == 13: point_list = [4, 7, 10] elif size == 9: point_list = [3, 7] else: point_list = [] draw_starpoints(point_list) # 画出9个星位 TRIANGLE = "triangle" # 三角 SQUARE = "square" # 方块 CIRCLE = "circle" # 圆圈 SELECT = "select" # 选择 MARKER = "marker" # 'X'记号 BLACK = "black" WHITE = "white" def get_x(self, x): return int(((x - self.start_x) / self.scale) + 1.5) def get_y(self, y): return int(((y - self.start_y) / self.scale) + 1.5) def draw_stone(self, x, y, color): # 画一个棋子 centre_x = int(self.start_x + (self.scale * (x - 1))) centre_y = int(self.start_y + (self.scale * (y - 1))) x1 = centre_x - self.stone_radius y1 = centre_y - self.stone_radius x2 = centre_x + self.stone_radius y2 = centre_y + self.stone_radius self.contents[x][y] = color self.item[x][y] = self.canvas.create_oval(x1, y1, x2, y2, fill=color, width=self.line_thickness) def erase_stone(self, x, y): # 在显示的棋盘上擦掉一个棋子 self.canvas.delete(self.item[x][y]) self.contents[x][y] = None self.item[x][y] = None def draw_number(self, x, y, number): # 显示数字,这个函数好像还没有被使用,目前只能在棋子上显示数字,不能在没有棋子的地方显示数字 centre_x = self.start_x + (self.scale * (x - 1)) centre_y = self.start_y + (self.scale * (y - 1)) if self.contents[x][y] == self.BLACK: inverse_color = self.WHITE else: inverse_color = self.BLACK text_x = centre_x text_y = centre_y self.canvas.create_text(text_x, text_y, text=number, fill=inverse_color, font=self.number_font) def draw_shape(self, x, y, shape): # 在棋子上显示各种不同的记号,三角、方块、圆圈等 centre_x = int(self.start_x + (self.scale * (x - 1))) centre_y = int(self.start_y + (self.scale * (y - 1))) color = self.contents[x][y] if color == self.BLACK: inverse_color = self.WHITE else: inverse_color = self.BLACK r = int(self.stone_radius / 1.7) r1 = int(self.stone_radius / 1.8) r2 = int(self.stone_radius / 2.3) r3 = int(self.stone_radius / 4) if shape == self.CIRCLE: # 圆圈记号 item = self.canvas.create_oval(centre_x - r, centre_y - r, centre_x + r, centre_y + r, fill=None, outline=inverse_color, width=self.line_thickness) if shape == self.TRIANGLE: # 三角记号 item = self.canvas.create_polygon(centre_x, centre_y - r, centre_x - r1, centre_y + r2, centre_x + r1, centre_y + r2, fill=None, outline=inverse_color, width=self.line_thickness) if shape == self.SQUARE: # 方块记号 item = self.canvas.create_rectangle(centre_x - r2, centre_y - r2, centre_x + r2, centre_y + r2, fill=None, outline=inverse_color, width=self.line_thickness) if shape == self.MARKER: # 'X' 记号 item = self.canvas.create_polygon(centre_x - r2, centre_y - r2, centre_x, centre_y, centre_x + r2, centre_y - r2, centre_x, centre_y, centre_x + r2, centre_y + r2, centre_x, centre_y, centre_x - r2, centre_y + r2, centre_x, centre_y, fill=None, outline=inverse_color, width=self.line_thickness) if shape == self.SELECT: # 选择记号 item = self.canvas.create_rectangle(centre_x - r3, centre_y - r3, centre_x + r3, centre_y + r3, fill=inverse_color, outline=inverse_color, width=self.line_thickness) return item def draw_territory(self, x, y, color): # 显示势力范围,我方控制的点+捕获对方的棋子 centre_x = int(self.start_x + (self.scale * (x - 1))) centre_y = int(self.start_y + (self.scale * (y - 1))) r2 = int(self.stone_radius / 2.3) self.canvas.create_polygon(centre_x, centre_y - r2, centre_x + r2, centre_y, centre_x, centre_y + r2, centre_x - r2, centre_y, fill=color, outline=color) def draw_label(self, x, y, label): # SGF标记属性"LB",LaBel,棋盘标签 blank = self.letter_fontsize / 1.5 text_x = self.start_x + (self.scale * (x - 1)) text_y = self.start_y + (self.scale * (y - 1)) x1 = text_x - blank y1 = text_y - blank x2 = text_x + blank y2 = text_y + blank if self.contents[x][y] == self.BLACK: inverse_color = self.WHITE else: inverse_color = self.BLACK if not self.contents[x][y]: background = self.canvas.config("background")[4] self.canvas.create_rectangle(x1, y1, x2, y2, fill=background, outline=background) self.canvas.create_text(text_x, text_y, text=label, fill=inverse_color, font=self.letter_font)