54646| 0
|
[项目分享] 行空板弹球 |
本帖最后由 安卓机器人 于 2022-8-24 12:26 编辑 摇杆控制行空板弹球小游戏 —Python面向对象编程 【关键词】Python编程、程序移植、面向对象本文介绍把PC机上的Python游戏移植到“行空板”上,并用游戏摇杆操控。 【行空板游戏界面】 游戏摇杆操控 【PC机游戏界面】 ←、→键盘方向键操控 【PC版Python面向对象代码全图】 【行空板Python面向对象代码简图】 【想法】 7月4日,我的编程作业~PC机版Python弹球小游戏完成。它用PC键盘上的左、右方向键控制蓝色接板的左右水平移动,以使得红色小球不至于落下而结束游戏。 自己手头上早已有块“行空板”,既然它是掌上便携电脑,应该可以像PC机那样运行纯Python程序吧!所以,准备把PC机小游戏移植到“行空板”上玩玩。显然,“行空板”的A和B键与PC机的←和→一样可以使用 。但是,手感不太好,按键一次也相当于只是在输入0、1数字型信号,不能直接输入模拟信号。因此,控制蓝色接板的左右水平移动的速度不能随时变化。 【行空板、摇杆模块】 在DF的27件传感器套装中有一个“摇杆模块”,吃灰好几年了,一直没用过,先查了DF资料,发现专业品质的游戏手柄上可用的,可以控制 X和Y方向上的模拟量输入,Z端布尔型(True/False)输入。我想尝试用于控制“行空板”看看行不行。想到就做! 【连线】 【程序移植】 【Python模式积木块式编程测试】 发现:摇杆的X、Y模拟量范围0~2^12=4096,而我们“行空板”屏幕240*320,摇杆左右移动的速度得映射为10以内。再发现:映射为小数了,移动像素是整数,所以得四舍五入取整。Y方向操作与屏幕反向,故映射也反向即可。 这里PC机源码是面向对象,积木块可能不便,需采用纯代码方式编程。因此,把积木块正常运行的“自动生成”代码全选复制下来。 USB连好Mind+与“行空板”,在“行空板”中新建文件夹,再新建py文件,把刚复制的代码粘贴过来,修改PC机代码以适应“行空板”的软硬件环境。反复调试,直到成功。 【面向对象】 面向对象程序设计(object oriented programming OOP)的思想主要针对大型软件。万事万物皆可看作为“一个一个的对象”。日益复杂的软件引用这个思想,能更好地支持代码复用、设计服用,具有更好的可读性,可扩展性,大幅降低软件开发的难度。 将程序中的数据以及对数据的操作封装在一起,组成一个相互依存,不可分割的整体,这就是所谓的“对象”。程序中的所有对象都是通过“类”来创建的。“类”类似创建相同类型的对象的蓝图或模板,决定了能够得到什么样的对象。面向对象程序设计的关键就是如何合理的定义这些类,并且合理组织多个类之间的关系。 我们的弹球游戏中明显有“球”、“板”两个具体对象,根据需要还有个“得分”对象。 【行空板程序整体框架】 此页中与行空板硬件密切相关的移植代码必须有第1、2、17、18行。第18行指游戏中只采用了X方向(左右移动)的摇杆模拟量。 那么,我们究竟如何来创建“球”、“板”、"得分”三个对象呢?要创建对象,我们首先需要准备制作对象的蓝图或模板——类。即Ball类、Paddle类、Score类。如下图。 【"球”、“板”、"得分”三个类的框架】 class Ball(球类):__init__()创建球体的属性数据;hit_paddle()球体的行为之一”碰撞“;draw()球体的”运动“轨迹绘制行为等。 class Paddle(球板类):__init__()创建球板的属性数据;draw()球板的”运动“轨迹绘制行为等;turn_left_right()球板的左右移动(根据摇杆数据)行为等;numberMap()从开始积木块测试摇杆时复制的映射代码,用于摇杆数据映射修正,供turn_left_right()正确使用。 class Score(得分类):检测球板与球的正常碰撞以积分,并随时更新显示在屏幕右上角。 【代码解读】 3(行号,下同):导入tkinter图形库,弃用行空板的GUI库。 6:导入sys模块,用于在104停止程序或控制台。 注:每个函数首参数出现的self关键字表示对对象本身的一个引用。 9~11:球对象将与画布、球板、得分发生关系。 12~13:画球,放在最初位置。 15:对14列表中的元素洗牌式重排。 16~19:球分别在X、Y方向的移动速度(像素数),画布宽、高。 22~28:球位置与球板位置关系判定是否碰撞,若碰撞则积分。 其中25:碰撞时球速会随球板速度影响(可看视频发现)。 30~41:绘制球动画,碰撞屏幕边界处理。 44~66:意同Ball类。 69~75:屏幕右上方显示得分、球与球板碰撞即更新得分。 77~78:行空板专用,摇杆X只需一个3P线连接行空板P21。 80~86:画布中创建窗口属性。 88~90:创建三个对象。当然,你可以 "blueBall = Ball(...)"再创建一个蓝色球对象,红蓝两个球一起玩,仅需增添微量代码。 91~92:屏幕标签。 95~97:判定球是否碰撞到屏幕底部。 98~104:判定球是否碰撞到屏幕底部,是则处理游戏结束。 107:控制整体速度(因运行机器平台 有关)。 【效果】 【参考】《趣学Python编程》 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed