用Python写一个简易版弹球游戏
作者:wyh15895833492 发布时间:2022-02-14 04:03:55
我们前面讲了几篇关于类的知识点,为了让大家更好的掌握类的概念,并灵活的运用这些知识,我写了一个有趣又好玩的弹球的游戏,一来可以把类的知识融会一下,二来加深对Python的兴趣.你会发现哎呀Python写小游戏还是蛮方便的,蛮有意思的~~
先看一下我们的最终效果图
我们分9步来讲解如何写这个小游戏
1.创建游戏的主界面
我们用Python的内置模块Tkinter来完成了,它是Python的标准GUI工具包,可以非常方便在制作GUI小工具,因为是跨平台的,可以方便的在win和linux下运行,我们用Tk里的canvas绘图功能来制作一个小游戏.先来把主界面画出来
(1).创建一个tk的实例
(2).然后给这个窗口取一个名字叫game
(3).通知窗口管理器调整布局大小,0,0表示不能被拉升
(4).创建一个长为400*500的界面,背景色为默认,边框为厚度为0
(5).通知窗口管理器注册组件
(6).刷新一下界面
2.创建一个Ball球的类
好主界面有了,我们就开始创建球
(1)首先我们创建一个Ball的类,这个类的初始化参数有两个:
一个canvas也就是画图用来画一个球,一个是color,表示球的颜色
(2)在类的初始化的函数里面
初始化canvas,
画一个实心的球并记录下它的id
创建球的默认在主界面上的位置,我们把它放屏幕中间
然后让球出现在主界面上:
3.我们让球向上动起来
刚才在Ball类里面有一个draw函数,我们现在在draw里面加点东西,让球向上运动
4.让球能回弹
(1).第三步我们球能向上运动,现在我们要让它能碰到墙壁反弹
我们刚才是把self.canvas.move(self.id,0,-1)写死0,-1,表示x坐标不动,y坐标不断的-1也就是球在向上运动
现在我们把这两个值设成两个变量self.x,self.y,当我们的球运动到上边界的时候,就把self.y加1,也就向下运行,
当运动到下边界的时候,就把self.y减1,表示向上运行
(2).那么如何判断球已经碰壁了,很简单,我们动态的去球的坐标[x1,y1,x2,y2],
x1,y1 表示top-left 左上角的坐标
x2,y2 表示bottom-right右下角的坐标
获取了球的坐标之后(它是一个list),判断一下pos[1]和pos[3]就可以了
5.增加球的运行方向
现在我们的球的运动方向是固定的,我们希望每次球的运动方向要随机,不然太low了,怎么做呢,很简单增加一个随机函数就可以了
在__init__()函数里面,我们改一下
self.x = 0
self.y = -1
变成:
starts=[-3,-2,-1,1,1,2,3]
random.shuffle(starts)
self.x=starts[0]#从list里面随机取一个
self.y=-3#-3表示y轴运动的速度
6.增加小木板
现在我们的球已经可以在界面上到处乱窜了,我们现在增加一个木板来打弹球
7.让木板可以移动
我们通过绑定一些键盘事件,让木板可以移动
增加2个函数,左移和右移,有同学会问evt是啥,不急下面会说.
def turn_left(self, evt):
self.x = -2
def turn_right(self, evt):
self.x = 2
在Paddle的初始化函数里面绑定两个键盘事件:
就是按键盘左键就是响应self.turn_left
就是按键盘右键就是响应self.turn_right
evt是向系统注册的事件
8.增加球和木板的碰撞
现在球也有了,木板也有了,而且可以左右挪动,现在最精彩的部分要上演了,就是增加球碰到木板之后反弹,那么如何判断球碰到木板了,简单我们只要在球的类里面增加一个函数来判断是否碰撞了
def draw(self):
--snip--
if self.hit_paddle(pos) == True:
self.y = -3
--snip--
9.判断当球运动到底部游戏结束
经过上面8步,游戏大体功能已经有了,那么如何判断游戏结束呢,我们设定只要球运动底部的时候(可以认为是球碰到了地面),游戏就失败了,加几行代码就搞定了.
class Ball():
def __init__(self,canvas,paddle,color):
--snip--
self.hit_bottom=False
def draw(self):
--snip--
if pos[3]>=self.canvas_height:#判断当球的下沿大于等于主界面的高度
self.hit_bottom=True
--snip--
paddle=Paddle(canvas,"blue")
ball=Ball(canvas,paddle,"red")
while 1:
if ball.hit_bottom==False and ball.paddle.started :
ball.draw()
paddle.draw()
tk.update_idletasks()
tk.update()
time.sleep(0.01)
源码大概100行实现了简单的功能,其实这个游戏还可以增加很多功能,比如记录分数,增加游戏开始和结束的提示,增加木板和球的种类,增加管卡和难度等等大家可以自己发挥一下, 写完很有成就感~~
来源:https://blog.csdn.net/wyh15895833492/article/details/100049405


猜你喜欢
- 一、简介说明:索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于
- 为什么使用事务 当对多个表进行更新的时候,某条执行失败。为了保持数据的完整性,需要使用事务回滚。 显示设置事务 代码如下:beg
- 本文实例为大家分享了Django实现分页功能,为了容易区别功能的展现,先创建一个数据库,用数据库中的数据做演示。创建数据库步骤如下:1.创建
- 在项目的根目录下建立一个.gitignore的文件(和.git文件同级).gitignore文件用记事本打开,输入如下内容:## Ignor
- 一、先描述一下问题吧如下创建表时候报错了CREATE TABLE `xxx` ( `id` bigint(20) NOT NUL
- 本文实例讲述了Python异常模块traceback用法。分享给大家供大家参考,具体如下:traceback模块被用来跟踪异常返回信息. 如
- 本文实例为大家分享了JS中FormData类实现文件上传的具体代码,供大家参考,具体内容如下上篇文章讲到了FormReader类实现文件上传
- Python 用了好长一段时间了,起初是基于对爬虫的兴趣而接触到的。随着不断的深入,慢慢的转了其它语言,毕竟工作机会真的太少了。很多技能长时
- 本文介绍了python opencv之SIFT算法示例,分享给大家,具体如下:目标:学习SIFT算法的概念 学习在图像中查找SIFT关键的和
- 定义:select语句中嵌套select语句,被嵌套的select语句是子查询。子查询可以出现在:select ....(select)..
- 1. 图片加载、灰度图、 显示和保存from PIL import Imageimg = Image.open('01.jpg
- 如果字典中存储了一些值,我想要取出来该怎么操作呢?1、我要取出字典中所有的键-值对取出字典中所有的键-值对时,可以使用items()返回一个
- (1)使用python生成pdf文档需要的最基本的包是pdfgen。它属于reportlab模块,而reportlab模块并没有默认集成到p
- 二元运算二元运算是指由两个元素形成第三个元素的一种规则,例如数的加法及乘法;更一般地,由两个集合形成第三个集合的产生方法或构成规则称为二次运
- 在爬虫的获取数据上,一直在讲一些爬取的方法,想必小伙伴们也学习了不少。在学习的过程中遇到了问题,大家也会一起交流解决,找出不懂和出错的地方。
- 1、 try-catch语句ECMA-262第3版引入了try-catch语句,作为JavaScript中处理异常的一种标准方式。语法:tr
- Blog的全名应该是Web log,中文意思是“网络日志”,后来缩写为Blog,而博客(Blogger)就是写Blog的人。从理解上讲,博客
- 借助 GitHub 的网络钩子webhook,开发者可以创建很多有用的服务。从触发一个 Jenkins 实例上的 CI(持续集成) 任务到配
- Perl的特殊符号@ 数组 &nb
- 本文介绍了网页中插入视频播放的代码全集:有avi格式的视频,mpg格式,smi格式,rm格式,wmv格式,wma格式,Windows Med