这个是井字棋AI0.1版,思路借鉴清华附中徐岩老师的井字棋课程,在此表示感谢
#这是一个人对人的井字棋
#1表示这个位置是X,-1表示这个位置是O,0表示这个位置是空的
#导入模块
import tkinter as tk
from tkinter import messagebox
#创建tk对象
window = tk.Tk()
window.title("井字棋")
result_text = tk.StringVar()
#井字棋布局
label1=tk.Label(window,text="现在该Player",textvariable=result_text, font=("Arial", 20), height=2, width=6)
label1.grid(row=0, column=1,sticky="nsew")
button=[None] * 9
button[0] = tk.Button(window, text="", font=("Arial", 50), height=2, width=6, bg="lightblue",command=lambda:handle_click(0))
button[0].grid(row=1, column=0,sticky="nsew")
button[1] = tk.Button(window, text="", font=("Arial", 50), height=2, width=6, bg="lightblue",command=lambda:handle_click(1))
button[1].grid(row=1, column=1,sticky="nsew")
button[2] = tk.Button(window, text="", font=("Arial", 50), height=2, width=6, bg="lightblue",command=lambda:handle_click(2))
button[2].grid(row=1, column=2,sticky="nsew")
button[3] = tk.Button(window, text="", font=("Arial", 50), height=2, width=6, bg="lightblue",command=lambda:handle_click(3))
button[3].grid(row=2, column=0,sticky="nsew")
button[4] = tk.Button(window, text="", font=("Arial", 50), height=2, width=6, bg="lightblue",command=lambda:handle_click(4))
button[4].grid(row=2, column=1,sticky="nsew")
button[5] = tk.Button(window, text="", font=("Arial", 50), height=2, width=6, bg="lightblue",command=lambda:handle_click(5))
button[5].grid(row=2, column=2,sticky="nsew")
button[6] = tk.Button(window, text="", font=("Arial", 50), height=2, width=6, bg="lightblue",command=lambda:handle_click(6))
button[6].grid(row=3, column=0,sticky="nsew")
button[7] = tk.Button(window, text="", font=("Arial", 50), height=2, width=6, bg="lightblue",command=lambda:handle_click(7))
button[7].grid(row=3, column=1,sticky="nsew")
button[8] = tk.Button(window, text="", font=("Arial", 50), height=2, width=6, bg="lightblue",command=lambda:handle_click(8))
button[8].grid(row=3, column=2,sticky="nsew")
#定义一个提示走棋框
def start():
text="请player"+str(current_player)+"下棋"
result_text.set(text)
#给井字棋赋初值
q=[0,0,0,0,0,0,0,0,0]#0表示这9个位置都是空的
current_player = 1
start()
#定义单击按钮函数
def handle_click(i):
global current_player
#q[i]标记x或o
if q[i]==0 :#q[i]==0,说明q[i]这个地方还没有放棋子
if current_player == 1:
q[i] = 1
button[i].config(text="X")
#调用判胜函数
Iswin,W1,W2,W3=is_win(q)
#如果胜利,弹出胜利框
if Iswin==True:
messagebox.showwarning(title="消息警告", message=f"玩家{current_player} 获胜!")
window.destroy()
#如果是平局,弹出平局消息框
elif Iswin=='Tie':
messagebox.showwarning(title="消息警告", message="平局")
window.destroy()
else:
current_player = 2#交换玩家
#提示player走棋
start()
#让电脑自己下棋
if current_player == 2:
k=next(q)
q[k] = -1
button[k].config(text="O")
#判断是否赢棋
Iswin,W1,W2,W3=is_win(q)
if Iswin==True :
messagebox.showwarning(title="消息警告", message=f"玩家{current_player} 获胜!")
window.destroy()
#如果是平局,弹出平局消息框
elif Iswin=='Tie':
messagebox.showwarning(title="消息警告", message="平局")
window.destroy()
else:
current_player = 1#交换玩家
#提示player走棋
start()
#判断是否平局
def is_full(q):
if q[0]==0:
return False
elif q[1]==0:
return False
elif q[2]==0:
return False
elif q[3]==0:
return False
elif q[4]==0:
return False
elif q[5]==0:
return False
elif q[6]==0:
return False
elif q[7]==0:
return False
elif q[8]==0:
return False
else:
return True
#判断是否是胜利局面
def is_win(q):
if q[0]==q[1]==q[2]!=0:#如果 q[0]===q[1]==q[2],且不等于0,说明三子连珠
iswin,w1,w2,w3=True,0,1,2#iswin==True 说明三子连珠
elif q[3]==q[4]==q[5]!=0:
iswin,w1,w2,w3=True,3,4,5
elif q[6]==q[7]==q[8]!=0:
iswin,w1,w2,w3=True,6,7,8
elif q[0]==q[3]==q[6]!=0:
iswin,w1,w2,w3=True,0,3,6
elif q[1]==q[4]==q[7]!=0:
iswin,w1,w2,w3=True,1,4,7
elif q[2]==q[5]==q[8]!=0:
iswin,w1,w2,w3=True,2,5,8
elif q[0]==q[4]==q[8]!=0:
iswin,w1,w2,w3=True,0,4,8
elif q[2]==q[4]==q[6]!=0:
iswin,w1,w2,w3=True,2,4,6
elif is_full(q):#平局
iswin,w1,w2,w3="Tie",-1,-1,-1
else:
iswin,w1,w2,w3=False,-1,-1,-1#还没出现三子连珠
return iswin,w1,w2,w3
def next(q):
if q[0]==0:
return 0
if q[1]==0:
return 1
if q[2]==0:
return 2
if q[3]==0:
return 3
if q[4]==0:
return 4
if q[5]==0:
return 5
if q[6]==0:
return 6
if q[7]==0:
return 7
if q[8]==0:
return 8
window.mainloop()