大多数时间,都在使用 deepin 系统,原来的 WPF 实现似乎越来越遥远了。这几天在家学习了一下 tkinter,顺便予以重写。
内在逻辑是一样的,就不重复,但具体实现层面,如图像不能改变大小等不一而足。由于 AI 出现,再去探讨怎么落子已变得毫无意义,所以只实现了最基本的吃子,打劫,倒扑,悔棋功能。
main.py 代码如下:
import os, sys, enum import tkinter as tk import tkinter.filedialog as fdlg import tkinter.messagebox as mbox from core import Board, StepBoard, Sgf, R CurrDir = os.path.dirname(__file__) sys.path.append(CurrDir) class App(tk.Tk): def __init__(self): super().__init__() menu = tk.Menu(self) weiqi_menu = tk.Menu(menu, tearoff=0) weiqi_menu.add_command(label='开始', command=self.start) weiqi_menu.add_command(label='加载SGF', command=self.load) weiqi_menu.add_command(label='保存SGF', command=self.save) weiqi_menu.add_command(label='退出', command=self.destroy) menu.add_cascade(label='围棋', menu=weiqi_menu) help_menu = tk.Menu(menu, tearoff=0) help_menu.add_command(label='测试', command=self.test) help_menu.add_command(label='关于', command=self.about) menu.add_cascade(label="帮助", menu=help_menu) self.config(menu=menu) self.boards = [Board(self), StepBoard(self)] self.board = self.boards[0] self.board.pack() self.x = (self.winfo_screenwidth()-self.board.w)//2 self.set_geometry(self.board.w,self.board.h,self.x) self.title('x01.weiqi') self.configure(background=R.BgColor) def set_geometry(self,w=800,h=600,x=300,y=20): self.geometry('{}x{}+{}+{}'.format(w,h,x,y)) def test(self): self.board.test_steps() def about(self): mbox.showinfo("关于 x01.weiqi", "为跨平台而采用 python 实现的围棋程序 x01.weiqi, 版权属于x01(黄雄)所有。") def start(self): self.board.back_all() self.board.pack_forget() self.board = self.boards[0] self.board.pack() self.set_geometry(self.board.w,self.board.h,self.x) def load(self): self.board.back_all() self.board.pack_forget() self.board = self.boards[1] self.board.pack() types = (('SGF files', '*.sgf'), ('All files', '*.*')) filename = fdlg.askopenfilename(title='打开棋谱', filetypes=types) if filename: self.board.load(filename) self.set_geometry(self.board.w,self.board.h,self.x) def save(self): steps = self.board.wqcore.SgfSteps sgf = Sgf() types = (('SGF files', '*.sgf'), ('All files', '*.*')) filename = fdlg.asksaveasfilename(title='保存棋谱', filetypes=types) if filename: sgf.Save(steps, filename) mbox.showinfo('保存棋谱','[' + filename + '] 保存成功') if __name__ == "__main__": App().mainloop()