已实现的功能
- 鼠标控制落子
 - 数据结构的确定
 - 绘制棋盘
 - 显示落子玩家
 
未实现的功能
- 判断胜负
 - 计分
 
# 五子棋
# @author: jiaming
import tkinter as tk
rate = 0.1
rate_piece = 0.45
grid = 40
color = (249, 214, 91)
user = 'black'
# k = 0
chessBoardList = [] # [(x, y):"black"]
def judge():
    global chessBoardList
    # chessBoardList.pop()
    print("判断:", chessBoardList)
def drawPiece(canvas, coordinate:tuple)->None:
    """
    coordinate: (x, y)
    WB: white/black
    需要完成坐标映射
    """
    global user
    if coordinate[0] % grid >= rate_piece*grid or coordinate[1] % grid >= rate_piece*grid or coordinate[0] >= 16*grid or coordinate[1] >= 16*grid or coordinate[0] < grid or coordinate[1] < grid:
        return None
    x = coordinate[0] // grid
    y = coordinate[1] // grid
    
    if len(chessBoardList) == 0:
        user = 'white'
        canvas.create_oval(x*grid+rate_piece*grid, y*grid+rate_piece*grid, x*grid-rate_piece*grid, y*grid-rate_piece*grid,  width=1, fill="black")
        print("落子: %s (%d, %d)" % ("black", x, y))
        return {(x, y):"black"}
    value = -1
    for k, v in chessBoardList[-1].items():
        value = v
    if value == "black":
        user = 'black'
        canvas.create_oval(x*grid+rate_piece*grid, y*grid+rate_piece*grid, x*grid-rate_piece*grid, y*grid-rate_piece*grid, fill="white")
        print("落子: %s (%d, %d)" % ("white", x, y))
        return {(x, y):"white"}
    else:
        user = 'white'
        canvas.create_oval(x*grid+rate_piece*grid, y*grid+rate_piece*grid, x*grid-rate_piece*grid, y*grid-rate_piece*grid, fill="black")
        print("落子: %s (%d, %d)" % ("black", x, y))
        return {(x, y):"black"}
def drawBoard():
    # 界面对象的基本参数设置
    root = tk.Tk()
    root.title("五子棋")
    # root.geometry('335x265+250+250')
    # 设置界面是否可以随意拉伸
    root.resizable(False, False)
    canvas = tk.Canvas(root, bg='#F9D65B', height=grid*16, width=grid*16)
    canvas.grid(row=0, column=0)
    label = tk.Label(root, text=user, font=('Times', 16)).grid(row=1, column=0)
    # 绘制线
    canvas.create_rectangle(grid/2, grid/2, 16*grid-grid/2, 16*grid-grid/2, width=2)
    for i in range(1, 16):
        canvas.create_line(grid, i*grid, 15*grid, i*grid, fill='black')
        canvas.create_line(i*grid, grid, i*grid, 15*grid, fill='black')
    # 绘制点
    canvas.create_oval(8*grid+rate*grid, 8*grid+rate*grid, 8*grid-rate*grid, 8*grid-rate*grid, fill="black")
    canvas.create_oval(12*grid+rate*grid, 12*grid+rate*grid, 12*grid-rate*grid, 12*grid-rate*grid, fill="black")
    canvas.create_oval(4*grid+rate*grid, 4*grid+rate*grid, 4*grid-rate*grid, 4*grid-rate*grid, fill="black")
    canvas.create_oval(12*grid+rate*grid, 4*grid+rate*grid, 12*grid-rate*grid, 4*grid-rate*grid, fill="black")
    canvas.create_oval(4*grid+rate*grid, 12*grid+rate*grid, 4*grid-rate*grid, 12*grid-rate*grid, fill="black")
    # 鼠标事件
    def mouseEvent(event):
        # print(f"({event.x}, {event.y})")
        value = drawPiece(canvas, (event.x, event.y))
        tk.Label(root, text=user, font=('Times', 16)).grid(row=1,column=0)
        if value != None:
            chessBoardList.append(value)
            judge()
            # print(chessBoardList)
            # global k
            # k += 1
    # canvas.bind("<Button-1>", lambda event:mouseEvent(event, "white" if k % 2 == 0 else "black"))
    canvas.bind("<Button-1>", lambda event:mouseEvent(event))
    
    root.mainloop()
if __name__ == "__main__":
    drawBoard()
'''
鼠标点击事件
<Button-1>  鼠标左键
<Button-2>   鼠标中间键(滚轮)
<Button-3>  鼠标右键
<Double-Button-1>   双击鼠标左键
<Double-Button-3>   双击鼠标右键
<Triple-Button-1>   三击鼠标左键
<Triple-Button-3>   三击鼠标右键
'''运行截图


                
                









