练习2 —— 玩FlappyBird,做数列题 | 玄数 | Page 2

2014-08-05

解:

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,刚好对应于表格中的红色的数据

flappybird code

 

思考:

1.  物理教材上的位移公式是 s = vt + ½at2,与推导出来的 0.5n2 + 0.5n 不一致,为什么?

2.  为什么不按照物理学的 vy = 0, gravity = 9.8 来编程?

练习2 —— 玩FlappyBird,做数列题