self.mesh = 25
self.ratio = 0.9
self.board_color = "#CDBA96"
self.header_bg = "#CDC0B0"
self.btn_font = ("黑体", 12, "bold")
self.step = self.mesh / 2
self.chess_r = self.step * self.ratio
self.point_r = self.step * 0.2
self.matrix = [[0 for y in range(self.column)] for x in range(self.row)] self.is_start = False
self.is_black = True
self.last_p = None
###########
# GUI #
#######################################
self.root = Tk()
self.root.title("Gobang By Young")
self.root.resizable(width=False, height=False)
self.f_header = Frame(self.root, highlightthickness=0, bg=self.header_bg)
self.f_header.pack(fill=BOTH, ipadx=10)
self.b_start = Button(self.f_header, text="开始", command=self.bf_start, font=self.btn_font)
self.b_restart = Button(self.f_header, text="重来", command=self.bf_restart, state=DISABLED, font=self.btn_font)
self.l_info = Label(self.f_header, text="未开始", bg=self.header_bg, font=("楷体", 18, "bold"), fg="white")
self.b_regret = Button(self.f_header, text="悔棋", command=self.bf_regret, state=DISABLED, font=self.btn_font)
self.b_lose = Button(self.f_header, text="认输", command=self.bf_lose, state=DISABLED, font=self.btn_font)
self.b_start.pack(side=LEFT, padx=20)
self.b_restart.pack(side=LEFT)
self.l_info.pack(side=LEFT, expand=YES, fill=BOTH, pady=10)
self.b_lose.pack(side=RIGHT, padx=20)
self.b_regret.pack(side=RIGHT)
self.c_chess = Canvas(self.root, bg=self.board_color, width=(self.column + 1) * self.mesh,
height=(self.row + 1) * self.mesh, highlightthickness=0)
self.draw_board()
self.c_chess.bind("<Button-1>", self.cf_board)
self.c_chess.pack()
self.root.mainloop()
# 画x行y列处的网格
def draw_mesh(self, x, y):
# 一个倍率,由于tkinter操蛋的GUI,如果不加倍率,悔棋的时候会有一点痕迹,可以试试把这个改为1,就可以看到
ratio = (1 - self.ratio) * 0.99 + 1
center_x, center_y = self.mesh * (x + 1), self.mesh * (y + 1)
# 先画背景色
self.c_chess.create_rectangle(center_y - self.step, center_x - self.step,
center_y + self.step, center_x + self.step,
fill=self.board_color, outline=self.board_color)
# 再画网格线,这里面a b c d是不同的系数,根据x,y不同位置确定,需要一定推导。
a, b = [0, ratio] if y == 0 else [-ratio, 0] if y == self.row - 1 else [-ratio, ratio] c, d = [0, ratio] if x == 0 else [-ratio, 0] if x ==
self.column - 1 else [-ratio, ratio] self.c_chess.create_line(center_y + a * self.step, center_x, center_y + b * self.step,
center_x)
self.c_chess.create_line(center_y, center_x + c * self.step, center_y, center_x + d * self.step)
# 有一些特殊的点要画小黑点
if ((x == 3 or x == 11) and (y == 3 or y == 11)) or (x == 7 and y == 7):
self.c_chess.create_oval(center_y - self.point_r, center_x - self.point_r,
center_y + self.point_r, center_x + self.point_r, fill="black")
# 画x行y列处的棋子,color指定棋子颜色
def draw_chess(self, x, y, color):
center_x, center_y = self.mesh * (x + 1), self.mesh * (y + 1)
# 就是画个圆
self.c_chess.create_oval(center_y - self.chess_r, center_x - self.chess_r,
center_y + self.chess_r, center_x + self.chess_r,
fill=color)