【EV3】小球碰撞-机器人-热点资讯-野望文存-科技 
    欢迎来到野望文存-科技!
当前位置:野望文存-科技 > 热点资讯 > 机器人 >  【EV3】小球碰撞

【EV3】小球碰撞

发表时间:2019-11-07 01:55:00  来源:野望文存  浏览:次   【】【】【


点击蓝字关注我们

立 冬


每周更新有意思的机器人课程,Scratch、EV3、Wedo不定。

本公众号中分享的课程并非完全原创,如果有参考其他老师或者书刊的部分,会在文末列出。



最近实在是比较忙,所以有一阵子没有更新公众号了,先给大家道个歉。


接下来到年底的这一段时间相对来说空闲时间会多一些,我尽量在保证质量的基础上加快频率,争取能够两周三更。


好了,闲话到此为止,接下来进入今天的内容。


今天给大家带来的是一节EV3纯编程的课程:小球碰撞。


这节课是在蓝桥杯EV3组的一道真题的基础上,加以改进、完善而成的。


适合三年级以上学习EV3,24-36节课的学生学习(这个标准是以我个人的教学经验而论,不一定适合所有同学,具体情况因人而异)。


首先我们看一下完成版的视频:


原理分析

start of winter

看完视频之后,我们来分析一下这个小游戏。


我们这个游戏分成三个部分:游戏背景、横板、小球。


游戏背景很简单,画出游戏区域的框线,然后在下方显示分数就行了。


横板的动作是在屏幕中左右移动。


小球的动作是在屏幕中来回弹射,如果落在横板外则游戏失败。


那么我们来分析一下这个程序结构应该如何设计。


按照一般的情况来说,遇到这一类的程序,我们一般会把它分成两个并列运行的循环,一个循环用来进行变量的运算,另一个循环用来显示。


但是今天我想带大家尝试一种新的思路,就是我们把这个游戏按照功能来进行拆分,每一种功能用一个并行的循环来完成。


这种做法虽然会让整个程序的结构看起来很松散,但是能够大大降低程序的难度,非常适合初学者使用。


结构设计

start of winter

根据上面的分析,我们把这个程序进行一下拆分,分成了四个功能:

  1. 小球的坐标控制;

  2. 小球的移动值变化与胜负判定;

  3. 横板的坐标控制;

  4. 显示;


按照这个思路,我们把程序流程图画一下:



初始化

start of winter

首先我们规划一下程序中可能会用到的变量。


  1. 用来控制游戏速度的变量:

    speed

  2. 用来记录游戏分数的变量:

    score

  3. 用来记录小球位置的变量:

    ballX、ballY

  4. 用来控制小球移动的变量:

    moveX、moveY

  5. 用来记录横板位置的变量:

    boardX、boardY


对变量进行初始化之后,我们再把游戏区域以及得分显示的位置也做好初始化。


我这个样例程序中使用的游戏区域是左上角为(5,5),宽170,高100的长方形区域。


我们看一下初始化的程序:



小球坐标

start of winter

小球的坐标在程序运行中是会时刻改变的,而具体的改变量是由移动变量moveX、moveY来控制的。


所以在这一部分,我们不用去理会其他的东西,只要每循环一次,就把现有的坐标加上移动变量,生成新的坐标就行了。


值得一提的是,怎样控制速度变化?


我们希望游戏过程中,小球的运动越来越快,那么我们就需要让等待的时间随着循环次数的增加,越来越短。


这个等待的时间我们是用了一个变量speed来记录,在对这个变量进行处理的适合,我是让它每循环一次乘以0.99,已经是每循环一次加快1%。


这个地方很多学生会选择另一种做法,也就是每循环一次,将速度减少一个固定的值,比如0.01秒。


使用这种做法,速度的变化会比较稳定,但是也有其弊病,当运行了一段时间之后,这个speed会变成0,然后再继续运行,它就会变成一个负数。


那么等待一个负的秒数很显然是没有意义的。


而使用乘法的话,就可以让我们的speed变量无限趋向于0,却永远不会小于或等于0。


我们来看一下程序:



移动值变化与胜负判定

start of winter

首先我们想一下,在哪些情况下,移动值会发生变化:

  1. 当碰到左边界时

    判定条件是ballX<5,此时要把moveX调整为3

    需要注意的是,这个ballX<5是一个理论值,我们在实际编写的时候需要让他小于更大的数,例如10或者15,一方面要留出小球的半径,另一方面也要考虑到程序的延迟,这样才能避免小球出框。以下几种情况也要做相同的处理

  2. 当碰到右边界时

    判定条件为ballX>175,此时要把moveX调整为-3。

  3. 当碰到上边界时

    判定条件为ballY<5,此时要把moveY调整为3。

  4. 当碰到横板时

    判定条件为ballY>105,并且ballX在横板范围内,此时要把moveY调整为-3。

    那么怎样判断ballX是否在横板范围内呢?

    我们通过横板的横坐标来进行判断,横板的横坐标boardX是横板的最左侧,假定横板的宽度为40,那么横板的最右侧坐标就是boardX+40,所以我们只需要进行判断,当ballY>105时,ballX是否在[ballX,ballX+40]这个区间内即可。




在考虑完移动值的变化之后,接下来我们要做的就是胜负判定。


仅在一种情况下,游戏会失败,那就是:当ballY>105时,ballX不在[ballX,ballX+40]区间内。


但是当ballY>105时,ballX在[ballX,ballX+40]区间内时,我们就需要给玩家加上一分,将score变量增加1。




这时候我们就要跳出循环,然后播放结束音效、显示分数,然后结束所有程序。



横板移动

start of winter

横板由按键控制,纵坐标与宽度都是固定的,只有横坐标会进行变化。


当按下左移键的时候横坐标减少,按下右移键横坐标增加。


需要注意,横板不能出框,所以要把横坐标控制在[5,135]这个区间内:当横坐标小于5时,要把它设定为5;当横坐标大于135时,要把它设定为135。


这部分应该没什么难点,我们看一下程序:



显示

start of winter

在显示这里,我们必须不断地刷新屏幕,否则小球和横板就会在屏幕上留下运动的轨迹。


那么我们为了不影响游戏背景,所以我们刷新屏幕的方式就和常规的方式有一些不同。


我这里是用了这样的一个办法:我在游戏区域内,画一个比游戏区域略小一些的白色实心长方形,每循环一次,就用这个长方形把旧的球和横板擦除,然后再画上新的。


需要给大家解释一下,为什么最后要加一个等待0.1秒。


因为如果不加的话,屏幕刷新得太快,会产生闪烁的现象,加上后,显示的时间加长,刷新屏幕这个动作的时间在程序中所占的比重就小了,屏幕看起来闪烁就没有那么严重了。


但是这个等待数值的设置需要大家根据自己的情况斟酌着调整,等待的数值越大,闪烁越不明显,但是程序的延迟越严重;反之,数值越小,程序延迟越少,但是闪烁越严重。


基本上这个等待的时间最多不要超过0.2秒,在0.1到0.2之间是比较合适的。


总结

start of winter

这个程序的使用的多个循环并行的思路,看起来可能会比较松散,但是实际操作还是比较简单的。


在这里把总的程序晒一下,还是那句话,在课程中贴出示例程序图,仅是为了大家能够对照、检查自己编写的程序,切勿直接照着示例程序写自己的程序。





这是一个分享青少儿机器人课程的期刊类公众号,热爱机器人的你,不关注一下吗~~


Sky的机器人教室

微信号 : yetianyu_sky


▇ 扫码关注我们


责任编辑:蔡学森