解:
1. 小鸟在游戏中的运动实际上是两段不一样的匀变速运动,每段匀变速运动,小鸟的每帧速度,构成了一个等差数列。玩游戏时,假如不在游戏界面上做点击,你会看到小鸟先网上飞一小段距离,做的是匀减速运动;当速度减到0之后,小鸟做的是匀加速运动,直到撞到地上。
. 由程序的(5)和(10) 可知小鸟的初速度 v0 = vyClick = -10;
. 由程序的(1)和(8)可得,当小鸟往上运动时,她的加速度是-1; 当小鸟往下运动时,她的加速度是1。用n表示帧数,当不在游戏界面上做点击时,每1帧的速度vy的初速度和位移如下
帧数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
初速度 vyn-1 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
末速度 vyn = vyn-1+ a | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
位移 △sn = vyn × 1 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
初坐标 bird.y = 260+∑△sn-1 | 260 | 251 | 243 | 236 | 230 | 225 | 221 | 218 | 216 | 215 |
末坐标 bird.y = 初坐标 +△sn | 251 | 243 | 236 | 230 | 225 | 221 | 218 | 216 | 215 | 215 |
帧数 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | … | n |
初速度 vyn-1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | … | n – 11 |
末速度 vyn = vyn-1+ a | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | … | n – 10 |
位移 △sn = vyn × 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | … | n – 11 |
初坐标 bird.y = 215+∑△sn-1 | 215 | 216 | 218 | 221 | 225 | 230 | 236 | 243 | … | ? ≤ 514 |
末坐标 bird.y = 初坐标 +△sn | 216 | 218 | 221 | 225 | 230 | 236 | 243 | 251 | … |
帧数 | 总位移 △s |
11 | 1 |
12 | 1+2 = 3 |
13 | 1+2+3 = 6 |
14 | 1+2+3+4 = 10 |
… | … |
n | 1+2+3+4+…+n = n(n+1)/2 |
2. 求小鸟过多长时间撞到地上,是给出等差数列的速度 vy,和位移 s,先求帧数n,再求时间t
由提示<6> 游戏开始时:bird.y = 260, 游戏结束时:bird.y = 514 ,再根据表一知道当速度vyn =0时,bird.y = 215,
得位移 s = 514 – 215 = 299 (像素)
n(n+1)/2 = 0.5n2 + 0.5n
解方程 0.5n2 + 0.5n = 299 得
· n1≈ 23.96, n2 ≈ -24.96(舍去)
但是n是帧数,所以它只能取自然数,是取23还是24呢?
注意到第n帧的初坐标 bird.y = 215+∑△sn-1≤ 514,因为到了514,小鸟就撞到地上,停止运动了。此时执行程序(11):gameOver()。因此不需要再有下一帧了。
∴ n = 23
∵ 在速度是0之前已经运动了10帧
∴ ntotal = 33
∵ 提示<2>告知本游戏的帧频是40,即1秒内有40帧,也即每1帧经过的时间是 1/40 秒
∴ 时间 t = n/40 = 33/40 =0.825 (秒)
∴ 撞到地上时的速度: 末速度 vyn = ntotal – 10 = 23 (像素/秒)
3. 这是程序打印出来的每一帧的速度和小鸟所在的y坐标,即 bird.y,刚好对应于表格中的红色的数据
思考:
1. 物理教材上的位移公式是 s = vt + ½at2,与推导出来的 0.5n2 + 0.5n 不一致,为什么?
2. 为什么不按照物理学的 vy = 0, gravity = 9.8 来编程?