python小游戏(华容道)
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小游戏(华容道)相关推荐
- python编的俄罗斯方块游戏_手把手制作Python小游戏:俄罗斯方块(一)
手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...
- python简单小游戏代码_一个简单的python小游戏---七彩同心圆
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 用pygame做一个简单的python小游戏-七彩同心圆 玩法:每次点击鼠标时,会以鼠标为圆心,不断 ...
- python图形小游戏代码_手把手制作Python小游戏:俄罗斯方块(一)
手把手制作Python小游戏:俄罗斯方块1 大家好,新手第一次写文章,请多多指教 A.准备工作: 这里我们运用的是Pygame库,因为Python没有内置,所以需要下载 如果没有pygame,可以到官 ...
- python小游戏之三
猜拳游戏 Python代码实现猜拳小游戏 Python代码实现猜拳小游戏_zhangtongyuan0909的博客-CSDN博客_python猜拳游戏代码 用python中类与对象写一个猜拳游戏 用p ...
- python小游戏-16行代码实现3D撞球小游戏!-源码下载
python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...
- python小游戏编程arcade----坦克动画图片合成
python小游戏编程arcade----坦克动画图片合成 前言 坦克动画图片合成 1.PIL image 1.1 读取文件并转换 1.2 裁切,粘贴 1.3 效果图 1.4 代码实现 2.处理图片的 ...
- 用pygame做一个简单的python小游戏---贪吃蛇
用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...
- 用pygame做一个简单的python小游戏---七彩同心圆
用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便加强一下pygame库的学习. 玩法:每次点击鼠标时,会以鼠标 ...
- 用pygame做一个简单的python小游戏---生命游戏
用pygame做一个简单的python小游戏-生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授 ...
- Python小游戏——王校长的S8冠军奖杯【下】
[前情提要] 1.pygame的安装:https://blog.csdn.net/Xiaomo_haa/article/details/83962300 2.Python小游戏--王校长的S8冠军奖杯 ...
最新文章
- R语言使用edit函数在Rsudio中生成数据编辑器(在windows中生成编辑器)、在编辑器中输出需要的数据生成最终的dataframe
- 写一个android图表框架1
- uwsgi php,详解uWSGI的编码问题解决方法
- c语言之判断电压最大值最小值,基于单片机的频率计的C语言源代码
- 剑指offer之二维数组中查找
- 论文阅读01:大规模人脸图像检索的深度度量哈希
- 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践
- H3C iMC PLAT 安装部署相关问题及解决方法1
- 学习方法总结-实习心得
- paip.python错误解决 0x64024e96 指令引用的 0x00000135 内存。该内存不能为 read。
- Windform c# pictureBox 更换背景图片
- zabbix监控nginx状态页面
- 驰为 UBook XPro 平板 评测怎么样
- 电脑android模拟器下载地址,菜鸡电脑版怎么下载 安卓模拟器电脑版下载地址
- 【Axure交互教程】利用全局变量实现跨页面传值
- 转行数据分析师后悔了?转行需要做哪些准备?
- matlab 双均线,我的双级别双重均线系统的建立初探
- 电商快递物流的电子面单打印接口API案例代码
- 【练习】面向对象系列(002)——双色球
- 数仓服务平台在唯品会的建设实践