[项目分享]行空板弹球 精华

14036浏览
查看: 14036|回复: 0

[项目分享] 行空板弹球

[复制链接]
本帖最后由 安卓机器人 于 2022-8-24 12:26 编辑

摇杆控制行空板弹球小游戏

—Python面向对象编程
【关键词】Python编程、程序移植、面向对象
本文介绍把PC机上的Python游戏移植到“行空板”上,并用游戏摇杆操控。
【行空板游戏界面】
游戏摇杆操控

gif-xkb-pbgame 00_00_00-00_00_30.gif

xkb-jm.jpg

【PC机游戏界面】
←、→键盘方向键操控
PC.png
【PC版Python面向对象代码全图】
PC-DM0.png
PC-DM1.png
PC-DM2.png
PC-DM3.png

【行空板Python面向对象代码简图】


【想法】

      7月4日,我的编程作业~PC机版Python弹球小游戏完成。它用PC键盘上的左、右方向键控制蓝色接板的左右水平移动,以使得红色小球不至于落下而结束游戏。

       自己手头上早已有块“行空板”,既然它是掌上便携电脑,应该可以像PC机那样运行纯Python程序吧!所以,准备把PC机小游戏移植到“行空板”上玩玩。显然,“行空板”的A和B键与PC机的←和→一样可以使用 。但是,手感不太好,按键一次也相当于只是在输入0、1数字型信号,不能直接输入模拟信号。因此,控制蓝色接板的左右水平移动的速度不能随时变化

【行空板、摇杆模块】
行空板.png 摇杆模块.png

       在DF的27件传感器套装中有一个“摇杆模块”,吃灰好几年了,一直没用过,先查了DF资料,发现专业品质的游戏手柄上可用的,可以控制 X和Y方向上的模拟量输入,Z端布尔型(True/False)输入。我想尝试用于控制“行空板”看看行不行。想到就做!
【连线】
行空板-摇杆LX.png
LX-SW.jpg


【程序移植】
【Python模式积木块式编程测试】
dm00.png
发现:摇杆的X、Y模拟量范围0~2^12=4096,而我们“行空板”屏幕240*320,摇杆左右移动的速度得映射为10以内。

dm01.png
再发现:映射为小数了,移动像素是整数,所以得四舍五入取整。Y方向操作与屏幕反向,故映射也反向即可。
dm02.png
这里PC机源码是面向对象,积木块可能不便,需采用纯代码方式编程。因此,把积木块正常运行的“自动生成”代码全选复制下来。
dm03.png
USB连好Mind+与“行空板”,在“行空板”中新建文件夹,再新建py文件,把刚复制的代码粘贴过来,修改PC机代码以适应“行空板”的软硬件环境。反复调试,直到成功。
dm04.png


【面向对象】
面向对象程序设计(object oriented programming OOP)的思想主要针对大型软件。万事万物皆可看作为“一个一个的对象”。日益复杂的软件引用这个思想,能更好地支持代码复用、设计服用,具有更好的可读性,可扩展性,大幅降低软件开发的难度。
       将程序中的数据以及对数据的操作封装在一起,组成一个相互依存,不可分割的整体,这就是所谓的“对象”。程序中的所有对象都是通过“类”来创建的。“类”类似创建相同类型的对象的蓝图或模板,决定了能够得到什么样的对象。面向对象程序设计的关键就是如何合理的定义这些类,并且合理组织多个类之间的关系。

       我们的弹球游戏中明显有“球”、“板”两个具体对象,根据需要还有个“得分”对象。
【行空板程序整体框架】

       xkb-frame0.png
xkb-frame1.png
此页中与行空板硬件密切相关的移植代码必须有第1、2、17、18行。第18行指游戏中只采用了X方向(左右移动)的摇杆模拟量。

那么,我们究竟如何来创建“球”、“板”、"得分”三个对象呢?要创建对象,我们首先需要准备制作对象的蓝图或模板——类。即Ball类、Paddle类、Score类。如下图。

【"球”、“板”、"得分”三个类的框架】
XKB-classes.png

class Ball(球类):__init__()创建球体的属性数据;hit_paddle()球体的行为之一”碰撞“;draw()球体的”运动“轨迹绘制行为等。
class Paddle(球板类):__init__()创建球板的属性数据;draw()球板的”运动“轨迹绘制行为等;turn_left_right()球板的左右移动(根据摇杆数据)行为等;numberMap()从开始积木块测试摇杆时复制的映射代码,用于摇杆数据映射修正,供turn_left_right()正确使用。
class Score(得分类):检测球板与球的正常碰撞以积分,并随时更新显示在屏幕右上角。

【代码解读】
xkb-dm0.png
3(行号,下同):导入tkinter图形库,弃用行空板的GUI库。

6:导入sys模块,用于在104停止程序或控制台。
注:每个函数首参数出现的self关键字表示对对象本身的一个引用。
9~11:球对象将与画布、球板、得分发生关系。
12~13:画球,放在最初位置。
15:对14列表中的元素洗牌式重排。
16~19:球分别在X、Y方向的移动速度(像素数),画布宽、高。

xkb-dm1.png

22~28:球位置与球板位置关系判定是否碰撞,若碰撞则积分。
其中25:碰撞时球速会随球板速度影响(可看视频发现)。
30~41:绘制球动画,碰撞屏幕边界处理。
xkb-dm2.png
44~66:意同Ball类。
xkb-dm3.png
69~75:屏幕右上方显示得分、球与球板碰撞即更新得分。

77~78:行空板专用,摇杆X只需一个3P线连接行空板P21。
80~86:画布中创建窗口属性。
xkb-dm4.png
88~90:创建三个对象。当然,你可以 "blueBall = Ball(...)"再创建一个蓝色球对象,红蓝两个球一起玩,仅需增添微量代码。
91~92:屏幕标签。
xkb-dm5.png
95~97:判定球是否碰撞到屏幕底部。
98~104:判定球是否碰撞到屏幕底部,是则处理游戏结束。
107:控制整体速度(因运行机器平台 有关)。

【效果】

【参考】《趣学Python编程》





您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail