python实现井字棋小游戏

本文介绍了如何使用Python编程语言,结合Tkinter和PIL库,实现一个具有用户交互的井字棋小游戏,支持玩家连续对弈,通过鼠标点击在网格上放置X和O棋子。
摘要由CSDN通过智能技术生成

用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()

实现效果如下:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值