python实现简单的井字棋游戏(gui界面)


Posted in Python onJanuary 22, 2021

项目输出

python实现简单的井字棋游戏(gui界面)

项目先决条件

要使用python构建井字游戏,我们需要tkinter模块和python的基本概念

Tkinter模块是用于渲染图形的标准图形用户界面。

Tkinter.messagebox用于显示消息框

要安装tkinter模块,我们在命令提示符下使用了pip install命令:

pip install tkinter

项目文件结构

这些是使用python构建井字游戏的步骤:

  • 导入模块
  • 初始化窗口
  • 检查结果的功能
  • 检查获胜者的功能
  • 定义标签和按钮

1.导入模块

from tkinter import *
import tkinter.messagebox as msg

在此步骤中,我们导入tkinter和messsagebox模块

2.初始化窗口

root= Tk()
root.title('TIC-TAC-TOE---DataFlair')

digits = [1,2,3,4,5,6,7,8,9]
mark = '' “
count = 0
panels = ["panel"]*10
  • Tk()用于初始化窗口
  • title()用于设置窗口的标题

3.检查结果的功能

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

在此功能中,将通过检查哪个玩家连续打出三个标记(上,下,对角或对角线)来检查结果。

4.检查获胜者的功能

def checker(digit):
 global count, mark, digits
 if digit==1 and digit in digits:
  digits.remove(digit)
  if count%2==0:
   mark ='X'
   panels[digit]=mark
  elif count%2!=0:
   mark = 'O'
   panels[digit]=mar
  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 
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>8 and win(panels,'X')==False and win(panels,'O')==False):
  msg.showinfo("Result","Match Tied")
  root.destroy()

玩家总共有9次点击以玩游戏。玩家每次单击时,如果count的值大于8,则通过将count的值增加1来减少机会,则游戏结果为平局

  • 如果count的值为偶数,则玩家1将玩,否则玩家2将玩。
  • config()用于用适当的文本标记按钮
  • messagebox小部件中的showinfo()方法用于显示一些相关信息
  • destroy()停止mainloop退出程序

5.定义标签和按钮

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)

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)


root.mainloop()

Label()小部件,用于显示用户无法修改的文本。
Button()小部件显示按钮

  • root是我们引用的窗口的名称
  • 文本存储我们在标签上显示的值
  • 文字所使用的字体
  • 单击按钮时将调用命令
  • lambda()函数用于将特定数据发送到回调函数。

要运行程序时,将执行mainloop()方法。

完整代码

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):
 global count, mark, digits

 #Check which button clicked 
 
 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()
  





####define buttons
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)




root.mainloop()

以上就是python实现简单的井字棋游戏的详细内容,更多关于python 井字棋游戏的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现模拟按键,自动翻页看u17漫画
Mar 17 Python
python MySQLdb Windows下安装教程及问题解决方法
May 09 Python
python实现合并两个数组的方法
May 16 Python
Python生成数字图片代码分享
Oct 31 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
Python 实用技巧之利用Shell通配符做字符串匹配
Aug 23 Python
使用Python脚本从文件读取数据代码实例
Jan 19 Python
Python调用Windows命令打印文件
Feb 07 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
Mar 28 Python
解决PyCharm无法使用lxml库的问题(图解)
Dec 22 Python
Python基础学习之奇异的GUI对话框
May 27 Python
Django url 路由匹配过程详解
Jan 22 #Python
浅析pandas随机排列与随机抽样
Jan 22 #Python
python 合并多个excel中同名的sheet
Jan 22 #Python
Python读取pdf表格写入excel的方法
Jan 22 #Python
python 基于UDP协议套接字通信的实现
Jan 22 #Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 #Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 #Python
You might like
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
js表单验证实例讲解
2016/03/31 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
2016/12/16 Javascript
AngularJS 最常用的八种功能(基础知识)
2017/06/26 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
python统计一个文本中重复行数的方法
2014/11/19 Python
python实现简单socket通信的方法
2016/04/19 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
工程造价专业大学生职业规划范文
2014/03/09 职场文书
要账委托书范本
2014/09/15 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
设备技术员岗位职责
2015/04/11 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
Python 数据可视化之Matplotlib详解
2021/11/02 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python