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 相关文章推荐
linux系统使用python获取cpu信息脚本分享
Jan 15 Python
python使用win32com在百度空间插入html元素示例
Feb 20 Python
python实现360的字符显示界面
Feb 21 Python
Python使用matplotlib绘制动画的方法
May 20 Python
Python中time模块和datetime模块的用法示例
Feb 28 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
详解python和matlab的优势与区别
Jun 28 Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 Python
Python3 读取Word文件方式
Feb 13 Python
Python基于yield遍历多个可迭代对象
Mar 12 Python
python用字节处理文件实例讲解
Apr 13 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
5.PHP的其他功能
2006/10/09 PHP
一个简单实现多条件查询的例子
2006/10/09 PHP
escape unescape的php下的实现方法
2007/04/27 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
深入理解PHP中的count函数
2016/05/31 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
判断ie的两种简单方法
2013/08/12 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
python实现人人网登录示例分享
2014/01/19 Python
Python实现感知机(PLA)算法
2017/12/20 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
python3跳出一个循环的实例操作
2020/08/18 Python
香港士多网上超级市场:Ztore
2021/01/09 全球购物
优秀应届生推荐信
2013/11/09 职场文书
小区门卫岗位职责
2013/12/31 职场文书
优秀求职信范文分享
2014/01/26 职场文书
体育专业自荐书
2014/05/29 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
小学生春游活动方案
2014/08/20 职场文书
职代会闭幕词
2015/01/28 职场文书
《珍珠鸟》教学反思
2016/02/16 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python
SQL Server数据库基本概念、组成、常用对象与约束
2022/03/20 SQL Server
Python自动化实战之接口请求的实现
2022/05/30 Python