井字棋,叫上同桌来一把?_井字棋self.digits-程序员宅基地

技术标签: python  学生  游戏  

演示

请添加图片描述

介绍

首先来介绍一下GUI库Tkinter
在这里插入图片描述

主要模块:

tkinter
Main Tkinter module.
tkinter.colorchooser
让用户选择颜色的对话框。
tkinter.commondialog
本文其他模块定义的对话框的基类。
tkinter.filedialog
允许用户指定文件的通用对话框,用于打开或保存文件。
tkinter.font
帮助操作字体的工具。
tkinter.messagebox
访问标准的 Tk 对话框。
tkinter.scrolledtext
内置纵向滚动条的文本组件。
tkinter.simpledialog
基础对话框和一些便捷功能。
tkinter.ttk
Themed widget set introduced in Tk 8.5, providing modern alternatives for many of the classic widgets in the main tkinter module.

hello word!

一个小demo大家熟悉一下

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()

官方文档

我说的再好也不如去看看文档,有什么不明白的可以下方留言。嘿嘿嘿
传送门

tkinter.messagebox

这部分其实我就是直接拿来用了没怎么了解,我把经常用的给大家说说
在这里插入图片描述

class tkinter.messagebox.Message(master=None, **options)
创建一个默认信息消息框。

信息消息框

tkinter.messagebox.showinfo(title=None, message=None, **options)
警告消息框

tkinter.messagebox.showwarning(title=None, message=None, **options)
tkinter.messagebox.showerror(title=None, message=None, **options)
疑问消息框

tkinter.messagebox.askquestion(title=None, message=None, **options)
tkinter.messagebox.askokcancel(title=None, message=None, **options)
tkinter.messagebox.askretrycancel(title=None, message=None, **options)
tkinter.messagebox.askyesno(title=None, message=None, **options)
tkinter.messagebox.askyesnocancel(title=None, message=None, **options)

源码

在这里插入图片描述

from tkinter import *
import tkinter.messagebox as msg

root = Tk()
root.title('TIC-TAC-TOE---Project Gurukul')
# labels
Label(root, text="player1 : X", font="times 15").grid(row=0, column=1)
Label(root, text="player2 : O", font="times 15").grid(row=0, column=2)

digits = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# for player1 sign = X and for player2 sign= Y
mark = ''

# counting the no. of click
count = 0

panels = ["panel"] * 10


def win(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 checker(digit):

    # 检查按键

    if digit == 1 and digit in digits:
        digits.remove(digit)
        ##player1 will play if the value of count is even and for odd player2 will play
        if count % 2 == 0:
            mark = 'X'
            panels[digit] = mark
        elif count % 2 != 0:
            mark = 'O'
            panels[digit] = mark

        button1.config(text=mark)
        count = count + 1
        sign = mark

        if (win(panels, sign) and sign == 'X'):
            msg.showinfo("Result", "Player1 wins")
            root.destroy()
        elif (win(panels, sign) and sign == 'O'):
            msg.showinfo("Result", "Player2 wins")
            root.destroy()

    if digit == 2 and digit in digits:
        digits.remove(digit)

        if count % 2 == 0:
            mark = 'X'
            panels[digit] = mark
        elif count % 2 != 0:
            mark = 'O'
            panels[digit] = mark

        button2.config(text=mark)
        count = count + 1
        sign = mark

        if (win(panels, sign) and sign == 'X'):
            msg.showinfo("Result", "Player1 wins")
            root.destroy()
        elif (win(panels, sign) and sign == 'O'):
            msg.showinfo("Result", "Player2 wins")
            root.destroy()

    if digit == 3 and digit in digits:
        digits.remove(digit)

        if count % 2 == 0:
            mark = 'X'
            panels[digit] = mark
        elif count % 2 != 0:
            mark = 'O'
            panels[digit] = mark

        button3.config(text=mark)
        count = count + 1
        sign = mark

        if (win(panels, sign) and sign == 'X'):
            msg.showinfo("Result", "Player1 wins")
            root.destroy()
        elif (win(panels, sign) and sign == 'O'):
            msg.showinfo("Result", "Player2 wins")
            root.destroy()

    if digit == 4 and digit in digits:
        digits.remove(digit)

        if count % 2 == 0:
            mark = 'X'
            panels[digit] = mark
        elif count % 2 != 0:
            mark = 'O'
            panels[digit] = mark

        button4.config(text=mark)
        count = count + 1
        sign = mark

        if (win(panels, sign) and sign == 'X'):
            msg.showinfo("Result", "Player1 wins")
            root.destroy()
        elif (win(panels, sign) and sign == 'O'):
            msg.showinfo("Result", "Player2 wins")
            root.destroy()

    if digit == 5 and digit in digits:
        digits.remove(digit)

        if count % 2 == 0:
            mark = 'X'
            panels[digit] = mark
        elif count % 2 != 0:
            mark = 'O'
            panels[digit] = mark

        button5.config(text=mark)
        count = count + 1
        sign = mark

        if (win(panels, sign) and sign == 'X'):
            msg.showinfo("Result", "Player1 wins")
            root.destroy()
        elif (win(panels, sign) and sign == 'O'):
            msg.showinfo("Result", "Player2 wins")
            root.destroy()

    if digit == 6 and digit in digits:
        digits.remove(digit)

        if count % 2 == 0:
            mark = 'X'
            panels[digit] = mark
        elif count % 2 != 0:
            mark = 'O'
            panels[digit] = mark

        button6.config(text=mark)
        count = count + 1
        sign = mark

        if (win(panels, sign) and sign == 'X'):
            msg.showinfo("Result", "Player1 wins")
            root.destroy()
        elif (win(panels, sign) and sign == 'O'):
            msg.showinfo("Result", "Player2 wins")
            root.destroy()

    if digit == 7 and digit in digits:
        digits.remove(digit)

        if count % 2 == 0:
            mark = 'X'
            panels[digit] = mark
        elif count % 2 != 0:
            mark = 'O'
            panels[digit] = mark

        button7.config(text=mark)
        count = count + 1
        sign = mark

        if (win(panels, sign) and sign == 'X'):
            msg.showinfo("Result", "Player1 wins")
            root.destroy()
        elif (win(panels, sign) and sign == 'O'):
            msg.showinfo("Result", "Player2 wins")
            root.destroy()

    if digit == 8 and digit in digits:
        digits.remove(digit)

        if count % 2 == 0:
            mark = 'X'
            panels[digit] = mark
        elif count % 2 != 0:
            mark = 'O'
            panels[digit] = mark

        button8.config(text=mark)
        count = count + 1
        sign = mark

        if (win(panels, sign) and sign == 'X'):
            msg.showinfo("Result", "Player1 wins")
            root.destroy()
        elif (win(panels, sign) and sign == 'O'):
            msg.showinfo("Result", "Player2 wins")
            root.destroy()

    if digit == 9 and digit in digits:
        digits.remove(digit)

        if count % 2 == 0:
            mark = 'X'
            panels[digit] = mark
        elif count % 2 != 0:
            mark = 'O'
            panels[digit] = mark

        button9.config(text=mark)
        count = count + 1
        sign = mark

        if (win(panels, sign) and sign == 'X'):
            msg.showinfo("Result", "Player1 wins")
            root.destroy()
        elif (win(panels, sign) and sign == 'O'):
            msg.showinfo("Result", "Player2 wins")
            root.destroy()

    ###if count is greater then 8 then the match has been tied
    if (count > 8 and win(panels, 'X') == False and win(panels, 'O') == False):
        msg.showinfo("Result", "Match Tied")
        root.destroy()


####定义每个格子
button1 = Button(root, width=15, font=('Times 16 bold'), height=7, command=lambda: checker(1))
button1.grid(row=1, column=1)
button2 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(2))
button2.grid(row=1, column=2)
button3 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(3))
button3.grid(row=1, column=3)
button4 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(4))
button4.grid(row=2, column=1)
button5 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(5))
button5.grid(row=2, column=2)
button6 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(6))
button6.grid(row=2, column=3)
button7 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(7))
button7.grid(row=3, column=1)
button8 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(8))
button8.grid(row=3, column=2)
button9 = Button(root, width=15, height=7, font=('Times 16 bold'), command=lambda: checker(9))
button9.grid(row=3, column=3)


本文来自:趣学python+python办公专栏欢迎大家一起学习。

链接:传送门
在这里插入图片描述

点击直接资料领取

有问题欢迎私信或留言
这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jiahuiandxuehui/article/details/123470885

智能推荐

Pinpoint 技术架构及部署_pinponit 几个组件的关系-程序员宅基地

文章浏览阅读1.9w次,点赞2次,收藏29次。目录一、背景二、简介三、Pinpoint Collector 收集端四、Pinpoint Web五、Pinpoint Agent六、监控效果图七、其他一、背景随着项目微服务的进行,微服务数量逐渐增加,服务间的调用也越来越复杂,我们急切需要一个APM工具帮我们监控各个服务的性能及对服务间的调用进行跟踪,而通过调研多个开源APM工具后,最终我们选择了pintpoin..._pinponit 几个组件的关系

显式算法和隐式算法的并行化比较_显式算法和隐式算法的区别-程序员宅基地

文章浏览阅读9.4k次,点赞2次,收藏5次。1显式算法显式算法基本假定为:在一微小时间段内,模型任意点速度、加速度为常数。ABAQUS软件Explicit模块应用中心差分法对运动方程进行显式时间积分,运动方程的解为¨u(i)=M-1·(F(i)-I(i)) (1)式中:M 为集中质量矩阵;F 为外荷载向量;I 为单元内力向量。由于显式算法中不需要对刚度矩阵求逆,集中质量矩阵为对角矩阵,求逆简便,使显式算法并行计算数据传输_显式算法和隐式算法的区别

Embedded Linux S3C2440 Profiling_buildroot libts.so.0-程序员宅基地

文章浏览阅读431次。文章目录SummaryOProfile Applications and driverConfigure and Compile Busybox to support OprofileDownload the Kernel Image to S3C2440 boardCreate RootfsRecompile the Kernel ImageDownload the kernel image t..._buildroot libts.so.0

HTML+CSS实现一个线条爱心动画的效果_线条爱心代码-程序员宅基地

文章浏览阅读1.5k次。实践一个线条上下运动的动画页面代码:<!-- * @Author: OriginalCoder * @Date: 2020-10-17 10:12:51 * @version: * @LastEditTime: 2020-10-29 12:32:37 * @LastEditors: OriginalCoder * @Description: --><!DOCTYPE html><html lang="zh-CN"> <head>_线条爱心代码

linux安装python2.7_linux python2.7 request库whl-程序员宅基地

文章浏览阅读1.5k次。http://www.jianshu.com/p/6425d18d3e47安装依赖的库yum -y install python-devel openssl openssl-devel gcc sqlite sqlite-devel mysql-devel libxml2-devel libxslt-develPython===================================_linux python2.7 request库whl

java中doc注释_springcloud gateway javadoc: 错误 - 无效的标记: --source--程序员宅基地

文章浏览阅读747次。javadoc注释官方参考网站1javadoc注释官方参考网站2一、注释:{@inheritDoc}// 代表从父类或父接口继承注释{@inheritDoc}二、javadoc命令参数:javadoc: 错误 - 无效的标记: -Description用法: javadoc [options] [packagenames] [sourcefiles] [@files..._springcloud gateway javadoc: 错误 - 无效的标记: --source-path

随便推点

动态规划:买股票的最佳时机_动态规划选股-程序员宅基地

文章浏览阅读131次。给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。示例 2:_动态规划选股

Android R WindowManagerService 添加window过程分析 (一)_android addwindow分析-程序员宅基地

文章浏览阅读1.7k次。有一段时间没有在这边发博客了,之前的笔记都写在有道云笔记上. 使用有道随记还是不错的,但是通常缺乏体系. 后面会将之前的笔记整理总结出来.希望可以坚持下去吧, 加油.WIndowManagerService的内容相对来说比较庞杂, 需要花费很大气力才能真正理解它. 本篇是从添加window 的角度去分析它, 将它拆分为多个部分,进而层层分析.WindowManager#addView通常,我们都是通过WindowManager#addView方法来添加窗口. WindowManager的具体实现._android addwindow分析

python第三方库requests详解_python 三方库 requests-程序员宅基地

文章浏览阅读1k次。python第三方库requests详解Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Pyth..._python 三方库 requests

量子通信,到底是什么工作原理?-程序员宅基地

文章浏览阅读7.3k次,点赞18次,收藏40次。戳蓝字“CSDN云计算”关注我们哦!作者 |小枣君责编 | 阿秃今天,小枣君要和大家聊的是“量子通信”。最开始计划写这个专题的时候,小枣君的内心是很纠结的。鲜枣课堂的目的,就是传递“..._quantum coin tossing protocol

SpringBoot @PostConstruct 异步不阻塞主线程启动_@postconstruct 是主线程吗-程序员宅基地

文章浏览阅读4.4k次。因为项目中 @PostConstruct 初始化方法中的逻辑比较久, 阻塞了主线程, 耽误启动时间,就想者优化一下, 周末查了一下解决了。上代码:禁止在项目中 new Thread();1: 配置项目线程池: import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.Bean;import org.springframe..._@postconstruct 是主线程吗

Python 整数的N进制字符串表示,循环和函数_亲密数,DNA匹配A_pytho编写一个函数,给定一个整数n,返回一个长度为n的字符串,其中包含尽可能多的不-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏9次。这次作业终于碰到需要思考的题目了(呜呜呜1. DNA匹配A【问题描述】编写与字符串对象的find方法功能相似的函数find(srcString, substring, start, end),作用是在srcString串的下标start到下标end之间的片段中寻找subString串的第一次出现的位置,返回该位置值;如果没找到,返回-1。编写程序,输入源串和子串,检验find(someStr..._pytho编写一个函数,给定一个整数n,返回一个长度为n的字符串,其中包含尽可能多的不

推荐文章

热门文章

相关标签