python基础运用
1、定义块
定义相应的块,每个方块实际就是一个按钮,所以继承Button类。每个方块的基本数据,除了方块的类型以外还有左上角的坐标,一旦确定方块的类型和坐标后,就可以确定方块对应的角色和位置了。方块左上角坐标用Point类的对象来表示,并在Block类中定义一个属性Location来表示

from tkinter import *
One=1;TowH=2;TowV=1;Four=4
class Point:def __init__(self,x,y): #定义坐标X,Yself.X=xself.Y=y
class Block(Button):   #块类 def __init__(self,p,blockType,master,r,bm):Button.__init__(self,master)self.Location=pself.BType=blockTypeself["text"]=rself["image"]=bmself.bind("<ButtonPress>",btn_MouseDown);self.bind("<ButtonRelease>",btn_Release);self.place(x=self.Location.X*80,y=self.Location.Y*80)

2、定义初始坐标位置,判断条件
坐标图如下:

每个块都相应完成具体的操作,每个块功能如下:
(1) Block类中定义一个函数GetPoints来
获取该方块所占据的所有坐标位置的列表,
通过方块类型和左上角的坐标就可以得到
占据的所有坐标位置。
(2) 再定义函数 IsValid 来判断这个方块是
否在游戏区域内,如果有任何部分出界就
返回False,可以通过方块类型和左上角坐
标来判断。
(3) 函数Intersects(Block b) 用来判断一个
角色是否和另一个角色有重叠部分,如果
有则返回True,通过获取两个角色各自占
据的点来判断是否有重叠。

#定义得到游戏图片的初始位置def getPoints(self):pList=[]if self.BType==One:pList.append(self.Location)elif self.BType==TowH:pList.append(self.Location)pList.append(Point(self.Location.X+1,self.Location.Y))elif self.BType==TowV:pList.append(self.Location)pList.append(Point(self.Location.X,self.Location.Y+1))elif self.BType==Four:pList.append(self.Location)pList.append(Point(self.Location.X,self.Location.Y+1))pList.append(Point(self.Location.X+1,self.Location.Y))pList.append(Point(self.Location.X+1,self.Location.Y+1))return  pListdef isValid(self,width,height): #判断移动边界条件points=self.getPoints()for i in points:if i.X<0 or i.X>=width or i.Y<0 or i.Y>=height:return Falsereturn Truedef Intersects(self,block): #判断角色是否重叠mypoints=self.getPoints()otherpoints=block.getPoints()for i in mypoints:for j in otherpoints:if i.X==j.X and i.Y==j.Y:return Truereturn False

3定义Game控制游戏
(1). 定义Game类并定义一些变量
首先包含场地的宽度和高度,
在华容道中宽度为4格,高度为5
格,在类中定义变量 Width=4;
Height=5类中定义一个列表保存
游戏中的所有方块,开始为空:
Blocks = [ ],类中再定义一个
变量保存结束位置坐标,变量名
和代码:finishPoint = Point(1,3)
(2). 在类中定义函数GetBlockByPos(self, p )获取指定位置方块
(3). AddBlock(self, block) 用于向列表Blocks中添加方块,
可用来编辑游戏。需要判断添加的方块是否已经在列表内,是否在有效范围内,以及是否和任何已在列表中的方块有重叠,都符合条件才允许添加,代码如有图。
(4). 定义函数MoveBlock用来移动角色的方块
MoveBlock所做的是将移动的方块先朝指
定方向移动,然后判断该方块是否出界,是否
与其他方块有重叠,如果是则保留在原来的位
置,否则进行移动更新位置。
(5). 定义函数GameWin判断游戏是否胜利
根据类的全局变量WinFlag的值来判断
游戏是否胜利。在函数MoveBlock中会判断
曹操是否移动到位置(1,3)这个坐标,如果是
则把WinFlag的值置为True。

   class Game(): #控制游戏模块,Width=4Height=5WinFlag=FalseBlocks=[]finishPoint=Point(1,3)def GetBlockByPos(self,p):for i in self.Blocks:if i.Location.X==p.X and i.Location.Y==p.Y:return ireturn Falsedef AddBlock(self,block):if block in self.Blocks:return Falseif not block.isValid(self.Width,self.Height):return Falsefor i in self.Blocks:if i.Intersects(block):return Falseself.Blocks.append(block)return Truedef MoveBlock(self,block,direction):if block not in self.Blocks:returnoldx=block.Location.Xoldy=block.Location.Yif direction=="Up":block.Location.Y-=1elif direction=="Down":block.Location.Y+=1elif direction=="Left":block.Location.X-=1elif direction=="Right":block.Location.X+=1moveOK=Trueif not block.isValid(self.Width,self.Height):moveOK=Falseelse:for i in self.Blocks:if (block is not i) and block.Intersects(i):moveOK=Falsebreakif moveOK==False:block.Location=Point(oldx,oldy)else:if block["text"]=="曹操" and block.Location.X==1 and block.Location.Y==3:self.WinFlag=Truereturn moveOKdef GameWin(self):return self.WinFlagoldx=0    #保存方块移动之前的x轴坐标oldy=0    #保存方块移动之前的y轴坐标BlockSize = 80   #方块的显示范围mouseDownPoint=Point(0,0)#鼠标按下位置mouseDown=False    #标记鼠标是否按下

4、游戏结果处理
(1). 控制游戏的全局变量
oldx=0 #保存方块移动之前的x轴坐标
oldy=0 #保存方块移动之前的y轴坐标
BlockSize = 80 #方块的显示范围
mouseDownPoint=Point(0,0)#鼠标按下位置
mouseDown=False #标记鼠标是否按下
(2). 函数btn_MouseDown(event)
处理鼠标按下的事件,
把按下坐标值保存到各个变量。
(3). 函数btn_Realse(event)
处理鼠标松开的事件,根据鼠标拖动的水平和
垂直方向偏移量超过方格大小1/3,
则向此方向移动。

def btn_MouseDown(event):global oldx,oldy,mouseDownPoint,mouseDownmouseDownPoint=Point(event.x,event.y)mouseDown=Trueoldx=event.xoldy=event.yprint(event.x,event.y)
def btn_Release(event):global oldx,oldy,mouseDownPoint,mouseDownif not mouseDown:returnmoveH=event.x-mouseDownPoint.XmoveV=event.y-mouseDownPoint.Yx=int(event.widget.place_info()["x"])//80y=int(event.widget.place_info()["y"])//80block=game.GetBlockByPos(Point(x,y))if moveH>=BlockSize//3:game.MoveBlock(block,"Right")elif moveH<=-BlockSize//3:game.MoveBlock(block,"Left")elif moveV>=BlockSize//3:game.MoveBlock(block,"Down")elif moveV<=-BlockSize//3:game.MoveBlock(block,"Up")else:returnevent.widget.place(x=block.Location.X*80,y=block.Location.Y*80)if game.GameWin():print("游戏胜利")mouseDown=False#win=Tk()
win=Toplevel()
win.title("华容道游戏")
win.geometry("320x400")game=Game()role=["曹操","关羽","黄忠","张飞","马超","赵云","兵","兵","兵","兵"]
bm=[PhotoImage(file="bmp\\%s.png"%(i)) for i in role]
block_para=[(Point(1,0),Four),(Point(1,2),TowH),(Point(3,2),TowV),(Point(0,0),TowV),(Point(0,2),TowV),(Point(3,0),TowV),(Point(1,3),One),(Point(2,3),One),(Point(0,4),One),(Point(3,4),One)]
for i in range(10):b=Block(block_para[i][0],block_para[i][1],win,role[i],bm[i])game.AddBlock(b)win.mainloop()

参考资料链接: https://pan.baidu.com/s/1sGQFOyJpsDDCmnj68c4FFw 密码: rzqa

python小游戏(华容道)相关推荐

  1. python编的俄罗斯方块游戏_手把手制作Python小游戏:俄罗斯方块(一)

    手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...

  2. python简单小游戏代码_一个简单的python小游戏---七彩同心圆

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 用pygame做一个简单的python小游戏-七彩同心圆 玩法:每次点击鼠标时,会以鼠标为圆心,不断 ...

  3. python图形小游戏代码_手把手制作Python小游戏:俄罗斯方块(一)

    手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...

  4. python小游戏之三

    猜拳游戏 Python代码实现猜拳小游戏 Python代码实现猜拳小游戏_zhangtongyuan0909的博客-CSDN博客_python猜拳游戏代码 用python中类与对象写一个猜拳游戏 用p ...

  5. python小游戏-16行代码实现3D撞球小游戏!-源码下载

    python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...

  6. python小游戏编程arcade----坦克动画图片合成

    python小游戏编程arcade----坦克动画图片合成 前言 坦克动画图片合成 1.PIL image 1.1 读取文件并转换 1.2 裁切,粘贴 1.3 效果图 1.4 代码实现 2.处理图片的 ...

  7. 用pygame做一个简单的python小游戏---贪吃蛇

    用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...

  8. 用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便加强一下pygame库的学习. 玩法:每次点击鼠标时,会以鼠标 ...

  9. 用pygame做一个简单的python小游戏---生命游戏

    用pygame做一个简单的python小游戏-生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授 ...

  10. Python小游戏——王校长的S8冠军奖杯【下】

    [前情提要] 1.pygame的安装:https://blog.csdn.net/Xiaomo_haa/article/details/83962300 2.Python小游戏--王校长的S8冠军奖杯 ...

最新文章

  1. R语言使用edit函数在Rsudio中生成数据编辑器(在windows中生成编辑器)、在编辑器中输出需要的数据生成最终的dataframe
  2. 写一个android图表框架1
  3. uwsgi php,详解uWSGI的编码问题解决方法
  4. c语言之判断电压最大值最小值,基于单片机的频率计的C语言源代码
  5. 剑指offer之二维数组中查找
  6. 论文阅读01:大规模人脸图像检索的深度度量哈希
  7. 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践
  8. H3C iMC PLAT 安装部署相关问题及解决方法1
  9. 学习方法总结-实习心得
  10. paip.python错误解决 0x64024e96 指令引用的 0x00000135 内存。该内存不能为 read。
  11. Windform c# pictureBox 更换背景图片
  12. zabbix监控nginx状态页面
  13. 驰为 UBook XPro 平板 评测怎么样
  14. 电脑android模拟器下载地址,菜鸡电脑版怎么下载 安卓模拟器电脑版下载地址
  15. 【Axure交互教程】利用全局变量实现跨页面传值
  16. 转行数据分析师后悔了?转行需要做哪些准备?
  17. matlab 双均线,我的双级别双重均线系统的建立初探
  18. 电商快递物流的电子面单打印接口API案例代码
  19. 【练习】面向对象系列(002)——双色球
  20. 数仓服务平台在唯品会的建设实践

热门文章

  1. Linux驱动视频教程推荐,隆重推荐:linux驱动基础开发系列免费教程独家版本
  2. 上海首批双学士学位项目来了,复合型人才如何培养?
  3. 新零售全能商城多商户拼团砍价秒杀周期购分销论坛投票收银台点餐外卖小程序公众号
  4. 如何查看网页元素使用的js
  5. ThinkCMF-smeta扩展字段
  6. 程序员接私活去哪儿?给大家推荐几个接私活平台
  7. ROS基础篇(二)-- 基础知识
  8. 【Xcode使用技巧】Xcode调试方法
  9. python使用pika操作rabbitmq总结(一)
  10. 哈希算法--暴雪的mpq技术