[TOC]

在本文,将研究如何实现小球受重力影响加速下落后,碰到地面反弹的效果。

1 显示一个静止小球

【代码实现】

1
2
3
4
5
6
7
8
9
10
#include<graphics.h>//引用图形库头文件
#include <conio.h>
int main()
{
initgraph(400, 400); //创建窗口大小为400x400像素
circle(200, 200, 100); //画圆,圆心(200,200),半径100
_getch(); //按任意键继续,防止闪退
closegraph(); //关闭绘图窗口
return 0;
}

【效果展示】

微信截图_20240704214842

2 显示多个小球

【代码实现】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<graphics.h>//引用图形库头文件
#include <conio.h>
#include<stdio.h>

int main()
{
initgraph(400, 400); //创建窗口大小为400x400像素
fillcircle(200, 100, 50); //画实心圆,圆心(200,100),半径50
fillcircle(200, 200, 50); //画实心圆,圆心(200,200),半径50
fillcircle(200, 300, 50); //画实心圆,圆心(200,300),半径50
_getch(); //按任意键继续,防止闪退
closegraph(); //关闭绘图窗口
return 0;
}

【效果展示】

微信截图_20240704215629

利用四则运算,可以让3个小球上下均匀分布

【代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<graphics.h>//引用图形库头文件
#include <conio.h>
#include<stdio.h>

int main()
{
int hight = 800;
initgraph(600, hight);
fillcircle(200, 1 * hight / 4, 50);
fillcircle(200, 2 * hight / 4, 50);
fillcircle(200, 3 * hight / 4, 50);
_getch(); //按任意键继续,防止闪退
closegraph(); //关闭绘图窗口
return 0;
}

微信截图_20240704220235

用变量step记录小球之间的距离,用y记录小球的起始位置。

每一次输出小球就增加一次距离,实现输出多个均匀分布的小球

【代码】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<graphics.h>//引用图形库头文件
#include <conio.h>
#include<stdio.h>

int main()
{
int y = 100;
int step = 100;
initgraph(600, 600);
fillcircle(300, y, 20);
y = y + step;
fillcircle(300, y, 20);
y = y + step;
fillcircle(300, y, 20);
y = y + step;
fillcircle(300, y, 20);
y = y + step;
fillcircle(300, y, 20);
y = y + step;
_getch(); //按任意键继续,防止闪退
closegraph(); //关闭绘图窗口
return 0;
}

微信截图_20240704222338

3 小球下落动画

cleardevice();//清屏函数

Sleep(1000);//表示程序暂停100毫秒

【代码实现】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<graphics.h>//引用图形库头文件
#include <conio.h>
#include<stdio.h>

int main()
{
int y = 100;
int step = 100;
initgraph(600, 600);
while (1) {
cleardevice();//清屏函数,在绘制新小球前清除画面上的内容
fillcircle(300, y, 20);
Sleep(100);//表示程序暂停100毫秒
y = y + step;

}
_getch(); //按任意键继续,防止闪退
closegraph(); //关闭绘图窗口
return 0;
}

4 小球重复下落

通过不断的执行y坐标的增加使小球下落,当小球到底时,使y值回归

【代码实现】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<graphics.h>//引用图形库头文件
#include <conio.h>
#include<stdio.h>

int main()
{
int y = 50;
initgraph(600, 600);
while (1) {
y++;
if (y > 620)
y = -20;
cleardevice();//清屏函数,在绘制新小球前清除画面上的内容
fillcircle(300, y, 20);
Sleep(10);//表示程序暂停10毫秒

}
_getch(); //按任意键继续,防止闪退
closegraph(); //关闭绘图窗口
return 0;

}

5 小球上下反弹

通过增加一个变量xy值,记录小球在y轴方向上的速度。

当小球和下窗口接触时,坐标=600-20=580,和上窗口接触时,坐标=20。

为了实现反弹,只需要把xy反向。即xy=-xy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<graphics.h>//引用图形库头文件
#include <conio.h>
#include<stdio.h>

int main()
{
int y = 50;
int xy = 3;//速度
initgraph(600, 600);
while (1) {
y += xy;
if (y >= 580 || y<20)
xy = -xy;
cleardevice();//清屏函数,在绘制新小球前清除画面上的内容
fillcircle(300, y, 20);
Sleep(10);//表示程序暂停10毫秒

}
_getch(); //按任意键继续,防止闪退
closegraph(); //关闭绘图窗口
return 0;

}

6 小球加速下落

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<graphics.h>//引用图形库头文件
#include <conio.h>
#include<stdio.h>

int main()
{
float y = 100;//y坐标
float xy = 0;//y方向速度
float g = 0.5;//y方向加速度
initgraph(600, 600);
while (1) {
cleardevice();//清屏函数,在绘制新小球前清除画面上的内容
xy = xy + g;//利用加速度更新xy速度
y = y + xy;
if (y >= 580)
xy = -0.95*xy;//受阻力影响
if (y > 580) y = 580; //防止小球穿过地面
fillcircle(300, y, 20);
Sleep(10);//表示程序暂停10毫秒

}
_getch(); //按任意键继续,防止闪退
closegraph(); //关闭绘图窗口
return 0;

}