用python实现一个简单的井字棋小游戏,支持连续对弈
使用到了tkinter、PIL库
素材只需要X和O两个棋子的图片
以下是代码实现:
import tkinter as tk
from PIL import Image, ImageTk
from tkinter import messagebox
class Tic:
def __init__(self):
self.map = [[2 for _ in range(3)] for _ in range(3)] # 初始化一个list
self.len = 200 # 方格的大小
# 创建窗口
self.window = tk.Tk()
self.window.title('Tic') # 窗口标题
self.canvas = tk.Canvas(self.window, width=(self.len * 3 + 2), height=(self.len * 3 + 2), bg='white') # 创建画布
self.png = self.image() # 获取图片信息
self.judge = 1
def draw_map(self):
# 画网格
self.canvas.create_line(0, (self.len+1), (self.len * 3 + 2), (self.len+1), fill='black', tags='X')
self.canvas.create_line(0, (self.len*2 + 2), (self.len * 3 + 2), (self.len*2 + 2), fill='black', tags='X')
self.canvas.create_line((self.len + 1), 0, (self.len + 1), (self.len * 3 + 2), fill='black', tags='X')
self.canvas.create_line((self.len * 2 + 2), 0, (self.len * 2 + 2), (self.len * 3 + 2), fill='black', tags='X')
self.canvas.pack()
def game(self):
self.canvas.bind("<Button-1>", self.mouse)
# 显示窗口
self.window.mainloop()
def image(self):
image1 = Image.open('./photo/X.png')
image2 = Image.open('./photo/O.png')
X_png = image1.resize((self.len, self.len))
O_png = image2.resize((self.len, self.len))
tk_X = ImageTk.PhotoImage(X_png)
tk_O = ImageTk.PhotoImage(O_png)
return tk_O, tk_X
def mouse(self, event):
col = event.x // self.len
row = event.y // self.len
x = col * (self.len + 2)
y = row * (self.len + 2)
if self.map[col][row] == 2:
if self.judge == 1:
self.canvas.create_image(x, y, anchor='nw', image=self.png[0], tags='QZ')
self.map[col][row] = 0
else:
self.canvas.create_image(x, y, anchor='nw', image=self.png[1], tags='QZ')
self.map[col][row] = 1
self.judge = -self.judge
self.canvas.update()
if self.ifWin():
# self.window.quit()
self.canvas.delete('QZ') # 删除所有图片
self.map = [[2 for _ in range(3)] for _ in range(3)] # 恢复list
self.judge = 1
def ifWin(self):
if (self.map[0][0] == self.map[0][1] == self.map[0][2] == 1 or
self.map[1][0] == self.map[1][1] == self.map[1][2] == 1 or
self.map[2][0] == self.map[2][1] == self.map[2][2] == 1 or
self.map[0][0] == self.map[1][0] == self.map[2][0] == 1 or
self.map[0][1] == self.map[1][1] == self.map[2][1] == 1 or
self.map[0][2] == self.map[1][2] == self.map[2][2] == 1 or
self.map[0][0] == self.map[1][1] == self.map[2][2] == 1 or
self.map[0][2] == self.map[1][1] == self.map[2][0] == 1):
messagebox.showinfo('Game Over!', 'X win')
return 1
elif (self.map[0][0] == self.map[0][1] == self.map[0][2] == 0 or
self.map[1][0] == self.map[1][1] == self.map[1][2] == 0 or
self.map[2][0] == self.map[2][1] == self.map[2][2] == 0 or
self.map[0][0] == self.map[1][0] == self.map[2][0] == 0 or
self.map[0][1] == self.map[1][1] == self.map[2][1] == 0 or
self.map[0][2] == self.map[1][2] == self.map[2][2] == 0 or
self.map[0][0] == self.map[1][1] == self.map[2][2] == 0 or
self.map[0][2] == self.map[1][1] == self.map[2][0] == 0):
messagebox.showinfo('Game Over!', 'O win')
return 1
elif not any(2 in sublist for sublist in self.map):
messagebox.showinfo('Game Over!', 'HQ')
return 1
def main(self):
self.draw_map()
self.game()
if __name__ == '__main__':
tic = Tic()
tic.main()
实现效果如下: