Python tkinter制作单机五子棋游戏


Posted in Python onSeptember 14, 2020

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

以下文章来源于Python家庭,作者Python家庭

实战项目:使用Python编写一个能够完成基本对战的五子棋游戏。面向新手。

程序主要包括两个部分,图形创建与逻辑编写两部分。

程序的运行结果:

Python tkinter制作单机五子棋游戏

样式创建

老规矩,先把用到的包导入进来。

from tkinter import *
import math

然后建立一个样式的类,类名称chessBoard。这里加了很多注释,避免新手看不懂函数的作用,说实话我觉得挺别扭的。

#定义棋盘类
class chessBoard() :
  def __init__(self) :
   #创建一个tk对象,即窗口
    self.window = Tk()
    #窗口命名
    self.window.title("五子棋游戏")
    #定义窗口大小
    self.window.geometry("660x470")
    #定义窗口不可放缩
    self.window.resizable(0,0)
    #定义窗口里的画布
    self.canvas=Canvas(self.window , bg="#EEE8AC" , width=470, height=470)
    #画出画布内容
    self.paint_board()
    #定义画布所在的网格
    self.canvas.grid(row = 0 , column = 0)

  def paint_board(self) :
   #画横线
    for row in range(0,15) :
      if row == 0 or row == 14 :
        self.canvas.create_line(25 , 25+row*30 , 25+14*30 , 25+row*30 , width = 2)
      else :
        self.canvas.create_line(25 , 25+row*30 , 25+14*30 , 25+row*30 , width = 1)
    
    #画竖线
    for column in range(0,15) :
      if column == 0 or column == 14 :
        self.canvas.create_line(25+column*30 ,25, 25+column*30 , 25+14*30 ,width = 2)
      else :
        self.canvas.create_line(25+column*30 ,25, 25+column*30 , 25+14*30 , width = 1)
    
    #画圆
    self.canvas.create_oval(112, 112, 118, 118, fill="black")
    self.canvas.create_oval(352, 112, 358, 118, fill="black")
    self.canvas.create_oval(112, 352, 118, 358, fill="black")
    self.canvas.create_oval(232, 232, 238, 238, fill="black")
    self.canvas.create_oval(352, 352, 358, 358, fill="black")

逻辑编写

这里的主要看每个函数的功能就好了。

if __name__ == "__main__":  game = Gobang()

最后,main函数

if __name__ == "__main__":
  game = Gobang()

将以上的所有程序复制粘贴,即为完整的程序了,可以运行。
最后来一个完整程序,一个一个复制粘贴简直不要太麻烦。

from tkinter import *
import math

#定义棋盘类
class chessBoard() :
  def __init__(self) :
    self.window = Tk()
    self.window.title("五子棋游戏")
    self.window.geometry("660x470")
    self.window.resizable(0,0)
    self.canvas=Canvas(self.window , bg="#EEE8AC" , width=470, height=470)
    self.paint_board()
    self.canvas.grid(row = 0 , column = 0)

  def paint_board(self) :
    for row in range(0,15) :
      if row == 0 or row == 14 :
        self.canvas.create_line(25 , 25+row*30 , 25+14*30 , 25+row*30 , width = 2)
      else :
        self.canvas.create_line(25 , 25+row*30 , 25+14*30 , 25+row*30 , width = 1)
    for column in range(0,15) :
      if column == 0 or column == 14 :
        self.canvas.create_line(25+column*30 ,25, 25+column*30 , 25+14*30 ,width = 2)
      else :
        self.canvas.create_line(25+column*30 ,25, 25+column*30 , 25+14*30 , width = 1)
      
    self.canvas.create_oval(112, 112, 118, 118, fill="black")
    self.canvas.create_oval(352, 112, 358, 118, fill="black")
    self.canvas.create_oval(112, 352, 118, 358, fill="black")
    self.canvas.create_oval(232, 232, 238, 238, fill="black")
    self.canvas.create_oval(352, 352, 358, 358, fill="black")

#定义五子棋游戏类
#0为黑子 , 1为白子 , 2为空位
class Gobang() :
  #初始化
  def __init__(self) :
    self.board = chessBoard()
    self.game_print = StringVar()
    self.game_print.set("")
    #16*16的二维列表,保证不会out of index
    self.db = [([2] * 16) for i in range(16)]
    #悔棋用的顺序列表
    self.order = []
    #棋子颜色
    self.color_count = 0
    self.color = 'black'
    #清空与赢的初始化,已赢为1,已清空为1
    self.flag_win = 1
    self.flag_empty = 1
    self.options()
    
   
  #黑白互换
  def change_color(self) :
    self.color_count = (self.color_count + 1 ) % 2
    if self.color_count == 0 :
      self.color = "black"
    elif self.color_count ==1 :
      self.color = "white"
  
  #落子
  def chess_moving(self ,event) :
    #不点击“开始”与“清空”无法再次开始落子
    if self.flag_win ==1 or self.flag_empty ==0 :
      return
    #坐标转化为下标
    x,y = event.x-25 , event.y-25
    x = round(x/30)
    y = round(y/30)
    #点击位置没用落子,且没有在棋盘线外,可以落子
    while self.db[y][x] == 2 and self.limit_boarder(y,x):
      self.db[y][x] = self.color_count
      self.order.append(x+15*y)
      self.board.canvas.create_oval(25+30*x-12 , 25+30*y-12 , 25+30*x+12 , 25+30*y+12 , fill = self.color,tags = "chessman")
      if self.game_win(y,x,self.color_count) :
        print(self.color,"获胜")
        self.game_print.set(self.color+"获胜")
      else :
        self.change_color()
        self.game_print.set("请"+self.color+"落子")
  

  #保证棋子落在棋盘上
  def limit_boarder(self , y , x) :
    if x<0 or x>14 or y<0 or y>14 :
      return False
    else :
      return True

  #计算连子的数目,并返回最大连子数目
  def chessman_count(self , y , x , color_count ) :
    count1,count2,count3,count4 = 1,1,1,1
    #横计算
    for i in range(-1 , -5 , -1) :
      if self.db[y][x+i] == color_count :
        count1 += 1
      else:
        break
    for i in range(1 , 5 ,1 ) :
      if self.db[y][x+i] == color_count :
        count1 += 1
      else:
        break
    #竖计算
    for i in range(-1 , -5 , -1) :
      if self.db[y+i][x] == color_count :
        count2 += 1
      else:
        break
    for i in range(1 , 5 ,1 ) :
      if self.db[y+i][x] == color_count :
        count2 += 1
      else:
        break
    #/计算
    for i in range(-1 , -5 , -1) :
      if self.db[y+i][x+i] == color_count :
        count3 += 1
      else:
        break
    for i in range(1 , 5 ,1 ) :
      if self.db[y+i][x+i] == color_count :
        count3 += 1
      else:
        break
    #\计算
    for i in range(-1 , -5 , -1) :
      if self.db[y+i][x-i] == color_count :
        count4 += 1
      else:
        break
    for i in range(1 , 5 ,1 ) :
      if self.db[y+i][x-i] == color_count :
        count4 += 1
      else:
        break
      
    return max(count1 , count2 , count3 , count4)

  #判断输赢
  def game_win(self , y , x , color_count ) :
    if self.chessman_count(y,x,color_count) >= 5 :
      self.flag_win = 1
      self.flag_empty = 0
      return True
    else :
      return False

  #悔棋,清空棋盘,再画剩下的n-1个棋子
  def withdraw(self ) :
    if len(self.order)==0 or self.flag_win == 1:
      return
    self.board.canvas.delete("chessman")
    z = self.order.pop()
    x = z%15
    y = z//15
    self.db[y][x] = 2
    self.color_count = 1
    for i in self.order :
      ix = i%15
      iy = i//15
      self.change_color()
      self.board.canvas.create_oval(25+30*ix-12 , 25+30*iy-12 , 25+30*ix+12 , 25+30*iy+12 , fill = self.color,tags = "chessman")
    self.change_color()
    self.game_print.set("请"+self.color+"落子")
  
  #清空
  def empty_all(self) :
    self.board.canvas.delete("chessman")
    #还原初始化
    self.db = [([2] * 16) for i in range(16)]
    self.order = []
    self.color_count = 0
    self.color = 'black'
    self.flag_win = 1
    self.flag_empty = 1
    self.game_print.set("")

  #将self.flag_win置0才能在棋盘上落子
  def game_start(self) :
    #没有清空棋子不能置0开始
    if self.flag_empty == 0:
      return
    self.flag_win = 0
    self.game_print.set("请"+self.color+"落子")

  def options(self) :
    self.board.canvas.bind("<Button-1>",self.chess_moving)
    Label(self.board.window , textvariable = self.game_print , font = ("Arial", 20) ).place(relx = 0, rely = 0 ,x = 495 , y = 200)
    Button(self.board.window , text= "开始游戏" ,command = self.game_start,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=15)
    Button(self.board.window , text= "我要悔棋" ,command = self.withdraw,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=60)
    Button(self.board.window , text= "清空棋局" ,command = self.empty_all,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=105)
    Button(self.board.window , text= "结束游戏" ,command = self.board.window.destroy,width = 13, font = ("Verdana", 12)).place(relx=0, rely=0, x=495, y=420)
    self.board.window.mainloop()
  
if __name__ == "__main__":
  game = Gobang()

到此这篇关于Python tkinter制作单机五子棋游戏的文章就介绍到这了,更多相关Python tkinter单机五子制作内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python的Tornado框架实现图片上传及图片大小修改功能
Jun 30 Python
python实现图书馆研习室自动预约功能
Apr 27 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
详解Python3 对象组合zip()和回退方式*zip
May 15 Python
使用Python实现跳一跳自动跳跃功能
Jul 10 Python
用Pelican搭建一个极简静态博客系统过程解析
Aug 22 Python
Django框架 查询Extra功能实现解析
Sep 04 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
Python使用requests模块爬取百度翻译
Aug 25 Python
Pytorch 实现变量类型转换
May 17 Python
在Python中如何使用yield
Jun 07 Python
python pygame 开发五子棋双人对弈
May 02 Python
python安装cx_Oracle和wxPython的方法
Sep 14 #Python
python输入中文的实例方法
Sep 14 #Python
python与js主要区别点总结
Sep 13 #Python
python与c语言的语法有哪些不一样的
Sep 13 #Python
python的链表基础知识点
Sep 13 #Python
python文件排序的方法总结
Sep 13 #Python
python识别验证码的思路及解决方案
Sep 13 #Python
You might like
初次接触php抽象工厂模式(Elgg)
2010/03/21 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
php session劫持和防范的方法
2013/11/12 PHP
php实现读取超大文件的方法
2014/07/28 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
php输出反斜杠的实例方法
2019/09/19 PHP
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
详解node中创建服务进程
2017/05/09 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
Python读取mp3中ID3信息的方法
2015/03/05 Python
Python元字符的用法实例解析
2018/01/17 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
HTML中使用SVG与SVG预定义形状元素介绍
2013/06/28 HTML / CSS
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
自我评价范文分享
2014/01/04 职场文书
社会保险接收函
2014/01/12 职场文书
体育比赛口号
2014/06/09 职场文书
专项法律服务方案
2014/06/11 职场文书
财务部岗位职责范本
2015/04/14 职场文书
预备党员群众意见
2015/06/01 职场文书
负责培养人意见
2015/06/05 职场文书
大学生暑期实践报告
2015/07/13 职场文书
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang