# -*- coding: utf-8 -*-
from tkinter import *
import tkinter.messagebox as msq
import random
class fupage2_play(object):
def __init__(self, master=None):
self.root = master # 定义内部变量root
self.root.title("井字棋")
self.root.geometry('%dx%d' % (600, 400)) # 设置窗口大小
self.panels = ["panel"]*10
self.count = 0
self.digits = [1, 2, 3, 4, 5, 6, 7, 8, 9]
self.mark = ""
self.btn_text1 = StringVar()
self.btn_text2 = StringVar()
self.btn_text3 = StringVar()
self.btn_text4 = StringVar()
self.btn_text5 = StringVar()
self.btn_text6 = StringVar()
self.btn_text7 = StringVar()
self.btn_text8 = StringVar()
self.btn_text9 = StringVar()
self.computerLetter = "O"
self.createPage()
def read_name(self):
return [0,"玩家"]
def read_choose(self):
return "X"
def createPage(self):
self.page = Frame(self.root) # 创建Frame
self.page.pack()
Label(self.page, text="{0},您选择的棋子是{1},您为先手".format(self.read_name()[1], self.read_choose())).grid(row=0, stick=W, pady=10)
button1 = Button(self.page, textvariable=self.btn_text1, width=10, font=('Times 16 bold'), height=3, command=lambda:self.update_btn_text(1))
button1.grid(row=1, column=1)
button2 = Button(self.page, textvariable=self.btn_text2, width=10, height=3, font=('Times 16 bold'), command=lambda:self.update_btn_text(2))
button2.grid(row=1, column=2)
button3 = Button(self.page, textvariable=self.btn_text3, width=10, height=3, font=('Times 16 bold'), command=lambda:self.update_btn_text(3))
button3.grid(row=1, column=3)
button4 = Button(self.page, textvariable=self.btn_text4, width=10, height=3, font=('Times 16 bold'), command=lambda:self.update_btn_text(4))
button4.grid(row=2, column=1)
button5 = Button(self.page, textvariable=self.btn_text5, width=10, height=3, font=('Times 16 bold'), command=lambda:self.update_btn_text(5))
button5.grid(row=2, column=2)
button6 = Button(self.page, textvariable=self.btn_text6, width=10, height=3, font=('Times 16 bold'), command=lambda:self.update_btn_text(6))
button6.grid(row=2, column=3)
button7 = Button(self.page, textvariable=self.btn_text7, width=10, height=3, font=('Times 16 bold'), command=lambda:self.update_btn_text(7))
button7.grid(row=3, column=1)
button8 = Button(self.page, textvariable=self.btn_text8, width=10, height=3, font=('Times 16 bold'), command=lambda:self.update_btn_text(8))
button8.grid(row=3, column=2)
button9 = Button(self.page, textvariable=self.btn_text9, width=10, height=3, font=('Times 16 bold'), command=lambda:self.update_btn_text(9))
button9.grid(row=3, column=3)
def update_btn_text(self, digit):
playerLetter = self.read_choose()
if playerLetter == "X":
self.computerLetter == "O"
else:
self.computerLetter = "X"
if digit == 1 and digit in self.digits:
self.digits.remove(digit)
self.panels[digit] = playerLetter
self.btn_text1.set(playerLetter)
if (self.win(self.panels, playerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "{},你获胜!".format(self.read_name()[1]))
else:
self.computer_move(self.panels, self.digits, self.computerLetter, playerLetter)
if digit == 2 and digit in self.digits:
self.digits.remove(digit)
self.panels[digit] = playerLetter
self.btn_text2.set(playerLetter)
if (self.win(self.panels, playerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "{},你获胜!".format(self.read_name()[1]))
else:
self.computer_move(self.panels, self.digits, self.computerLetter, playerLetter)
if digit == 3 and digit in self.digits:
self.digits.remove(digit)
self.panels[digit] = playerLetter
self.btn_text3.set(playerLetter)
if (self.win(self.panels, playerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "{},你获胜!".format(self.read_name()[1]))
else:
self.computer_move(self.panels, self.digits, self.computerLetter, playerLetter)
if digit == 4 and digit in self.digits:
self.digits.remove(digit)
self.panels[digit] = playerLetter
self.btn_text4.set(playerLetter)
if (self.win(self.panels, playerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "{},你获胜!".format(self.read_name()[1]))
else:
self.computer_move(self.panels, self.digits, self.computerLetter, playerLetter)
if digit == 5 and digit in self.digits:
self.digits.remove(digit)
self.panels[digit] = playerLetter
self.btn_text5.set(playerLetter)
if (self.win(self.panels, playerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "{},你获胜!".format(self.read_name()[1]))
else:
self.computer_move(self.panels, self.digits, self.computerLetter, playerLetter)
if digit == 6 and digit in self.digits:
self.digits.remove(digit)
self.panels[digit] = playerLetter
self.btn_text6.set(playerLetter)
if (self.win(self.panels, playerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "{},你获胜!".format(self.read_name()[1]))
else:
self.computer_move(self.panels, self.digits, self.computerLetter, playerLetter)
if digit == 7 and digit in self.digits:
self.digits.remove(digit)
self.panels[digit] = playerLetter
self.btn_text7.set(playerLetter)
if (self.win(self.panels, playerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "{},你获胜!".format(self.read_name()[1]))
else:
self.computer_move(self.panels, self.digits, self.computerLetter, playerLetter)
if digit == 8 and digit in self.digits:
self.digits.remove(digit)
self.panels[digit] = playerLetter
self.btn_text8.set(playerLetter)
if (self.win(self.panels, playerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "{},你获胜!".format(self.read_name()[1]))
else:
self.computer_move(self.panels, self.digits, self.computerLetter, playerLetter)
if digit == 9 and digit in self.digits:
self.digits.remove(digit)
self.panels[digit] = playerLetter
self.btn_text9.set(playerLetter)
if (self.win(self.panels, playerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "{},你获胜!".format(self.read_name()[1]))
else:
self.computer_move(self.panels, self.digits, self.computerLetter, playerLetter)
if (len(self.digits) == 1 and self.win(self.panels, 'X') == False and self.win(self.panels, 'O') == False):
self.page.destroy()
msq.showinfo("RESULT", "平局")
def win(self, panels, sign):
return ((panels[1] == panels[2] == panels[3] == sign)
or (panels[1] == panels[4] == panels[7] == sign)
or (panels[1] == panels[5] == panels[9] == sign)
or (panels[2] == panels[5] == panels[8] == sign)
or (panels[3] == panels[6] == panels[9] == sign)
or (panels[3] == panels[5] == panels[7] == sign)
or (panels[4] == panels[5] == panels[6] == sign)
or (panels[7] == panels[8] == panels[9] == sign))
def computer_move(self, panels, digits, computerLetter ,playerLetter):
panelscopy = panels.copy()
next_step1 = 0
for i in digits:
panelscopy[i] = computerLetter
if (self.win(panelscopy, computerLetter)):
next_step1 = i
break
panelscopy = panels.copy()
panelscopy = panels.copy()
for i in digits:
panelscopy[i] = playerLetter
if (self.win(panelscopy, playerLetter)):
next_step2 = i
break
else:
next_step2 = random.choice(digits)
panelscopy = panels.copy()
if next_step1 == 0:
next_step = next_step2
elif next_step1 != 0:
next_step = next_step1
digits.remove(next_step)
panels[next_step] = computerLetter
if next_step == 1:
self.btn_text1.set(computerLetter)
elif next_step == 2:
self.btn_text2.set(computerLetter)
elif next_step == 3:
self.btn_text3.set(computerLetter)
elif next_step == 4:
self.btn_text4.set(computerLetter)
elif next_step == 5:
self.btn_text5.set(computerLetter)
elif next_step == 6:
self.btn_text6.set(computerLetter)
elif next_step == 7:
self.btn_text7.set(computerLetter)
elif next_step == 8:
self.btn_text8.set(computerLetter)
elif next_step == 9:
self.btn_text9.set(computerLetter)
if (self.win(panels, computerLetter)):
self.page.destroy()
msq.showinfo("RESULT", "AI获胜")
if __name__ == "__main__":
root = Tk()
root.title('井字棋')
fupage2_play(root)
root.mainloop()