20210407

回顾 | 心理班会PPT | Flappy Bird

Table of Contents

回顾

恋词复习

心理班会

收钱做事做了个PPT。他们说风格很我。 存一下链接:PPT

Flappy Bird

明天就要讲了,今天最后发现还有几个重要的点可以讲。

  1. 关于P1、P2管道的初始化问题。即初始化opening_height,这里其实非常巧妙。

Windows和Linux的RAND_MAX值不一样!rand()有区别

p1.center = (int)(1.2 * (NUM_COLS - 1));
p1.opening_height = rand() / ((float) INT_MAX) * 0.5 + 0.25;
p2.center = (int)(1.75 * (NUM_COLS - 1));
p2.opening_height = rand() / ((float) INT_MAX) * 0.5 + 0.25;

如代码所示,这里有个点想说一下。关于rand()的最大值在

所以上面rand()中的数值介于0~2147483647,又INT_MAX数值为2147483647
所以$\frac{rand()}{(float) INT'MAX}$介于0~1之间的小数,所以$\frac{rand()}{(float) INT'MAX}* 0.5 + 0.25$ 的值就介于00.5+0.25~10.5+0.25之间,即$\frac{1}{4}$~$\frac{3}{4}$之间,即意味着开口高度opening_height所占控制台高度初始化的值虽然随机,可是随机在了$\frac{1}{4}$~$\frac{3}{4}$`,妙!

  1. 关于返回开口上端与下端的函数(在画管道的时候有用)
int get_orow(vpipe p, int top) {
return p.opening_height * (NUM_ROWS - 1) -(top ? 1 : -1) * OPENING_WIDTH / 2;
}

在这里用到了:

// Draw vertical part of upper half of pipe. //画出管道上半部的垂直部分。
for(i = ceiling_row + 1; i < get_orow(p, 1); i++) {
if ((p.center - PIPE_RADIUS) >= 0 &&
(p.center - PIPE_RADIUS) < NUM_COLS - 1) {
chtostr(vch, c);
mvprintw(i, p.center - PIPE_RADIUS, c);
}
if ((p.center + PIPE_RADIUS) >= 0 &&
(p.center + PIPE_RADIUS) < NUM_COLS - 1) {
chtostr(vch, c);
mvprintw(i, p.center + PIPE_RADIUS, c);
}
}
upper_terminus = i;

上面说过opening_height是所占控制台高度的几分之己,所以管道是这么设计的,并且管道是这么画的。

一切都很明了,我就不说了。

  1. 第三点就是ncurses库的使用。这个库的诞生太大意义了,真的为c语言开发设计了很大的方便。具体函数看之前写的这篇文章吧->https://tanxy.typlog.io/2021/20210402

就这样,拜拜。噢对,关于FLAPPY-BIRD讲解我还做了一个幻灯片->FLAPPY-BIRD