from tkinter import *
import tkinter.messagebox # 弹窗库
import numpy as np
root = Tk() #创建窗口
root.title("憨憨制作的五子棋") #窗口名字
w1 = Canvas(root, width=600,height=600,background='lightcyan')
w1.pack()#把画布画出来, 相当于每一帧
for i in range(0, 15):
w1.create_line(i * 40 + 20, 20, i * 40 + 20, 580)
w1.create_line(20, i * 40 + 20, 580, i * 40 + 20)
w1.create_oval(135, 135, 145, 145,fill='black')
w1.create_oval(135, 455, 145, 465,fill='black')
w1.create_oval(465, 135, 455, 145,fill='black')
w1.create_oval(455, 455, 465, 465,fill='black')
w1.create_oval(295, 295, 305, 305,fill='black')
num=0#计算棋盘上有几个棋子,用来判断下一颗棋子颜色
A=np.full((15,15),0)#储存位置已有棋子的矩阵
B=np.full((15,15),'')#用来记录每个位置棋子的颜色
def callback(event):#输入的是点击事件,event.x和event.y是鼠标点击事件的位置
global num ,A#全局变量可以全局使用
for j in range (0,15):#双重循环定位点击位置最近的网格线交点(i,j),保证棋子落在线的交点处。
for i in range (0,15):
if (event.x - 20 - 40 * i) ** 2 + (event.y - 20 - 40 * j) ** 2 <= 2 * 20 ** 2:
break
if (event.x - 20 - 40 * i) ** 2 + (event.y - 20 - 40 * j) ** 2 <= 2*20 ** 2:
break
if num % 2 == 0 and A[i][j] != 1:
w1.create_oval(40*i+5, 40*j+5, 40*i+35, 40*j+35,fill='black')
A[i][j] = 1
B[i][j] = 'b'
num += 1
if num % 2 != 0 and A[i][j] != 1 :
w1.create_oval(40*i+5, 40*j+5, 40*i+35, 40*j+35,fill='white')
A[i][j] = 1.
B[i][j] = 'w'
num += 1
f = [[-1, 0], [-1, 1], [0, 1], [1, 1]]#四条线其中一个方向的坐标变化规律
for z in range(0, 4):#循环方向
a, b = f[z][0], f[z][1]
count1, count2 = 0, 0
x, y = i, j
while B[x][y] == B[i][j]:#当颜色相同即可进行计算
count1 += 1
if x + a >= 0 and y + b >= 0 and x + a < 15 and y + b < 15 and B[x + a][y + b] == B[i][j]:
[x, y] = np.array([x, y]) + np.array([a, b])
else:
x, y = i, j
break
while B[x][y] == B[i][j]:#从落子处反向计算同色棋子个数。
count2 += 1
if x - a < 15 and y - b < 15 and x - a >= 0 and y - b >= 0 and B[x - a][y - b] == B[i][j]:
[x, y] = np.array([x, y]) - np.array([a, b])
else:
break
if count1 + count2 == 6:#计算了两次落子处
if B[i][j] == 'b':
tkinter.messagebox.showinfo('提示', '黑棋获胜')
else:
tkinter.messagebox.showinfo('提示', '白棋获胜')
w1.bind("",callback)
w1.pack()
def quit():
root.quit()
u=Button(root,text="退出",width=10,height=1,command=quit,font=('楷体',15))
u.pack()
mainloop()#每一帧循环