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写的图片蜘蛛人代码
Aug 27 Python
python BeautifulSoup使用方法详解
Nov 21 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
PyQt5每天必学之进度条效果
Apr 19 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
python3使用matplotlib绘制条形图
Mar 25 Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 Python
numpy.meshgrid()理解(小结)
Aug 01 Python
什么是Python变量作用域
Jun 03 Python
Keras loss函数剖析
Jul 06 Python
python中的3种定义类方法
Nov 27 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
Phpbean路由转发的php代码
2008/01/10 PHP
PHP进程同步代码实例
2015/02/12 PHP
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
JS抛物线动画实例制作
2018/02/24 Javascript
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
VUEX-action可以修改state吗
2019/11/19 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python中日志logging模块的性能及多进程详解
2017/07/18 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
镇创先争优活动总结
2014/08/28 职场文书
个人租房协议书范本
2014/09/30 职场文书
公司经营目标责任书
2015/01/29 职场文书
小学生交通安全寄语
2015/02/27 职场文书
培训督导岗位职责
2015/04/10 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
Nginx的gzip相关介绍
2022/05/11 Servers