一.实验描述
使用EasyX随机生成10个半径起始位置的小球,随机设置速度,小球遇到边框反弹
二.代码实现
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
//生成[min,max]之间的随机整数
int randBetweenMinMax(int min, int max)
{
int r = rand() % (max - min + 1) + min;
return r;
}
int main()
{
int width = 800; //窗口长度
int height = 600; //窗口宽度
int xs[10]; //小球x坐标
int ys[10]; //小球y坐标
int rs[10]; //小球半径
int vys[10]; //小球上下移动速度
int vxs[10]; //小球左右移动速度
initgraph(width, height); //窗口初始化,长800,高600
//小球位置速度初始化
setfillcolor(BLUE);//小球填充颜色蓝色
setlinecolor(RED);//小球边框线颜色红色
for (int i = 0; i < 10; i++)
{
xs[i] = randBetweenMinMax(30,width-30);
ys[i] = randBetweenMinMax(30,height-30);
vxs[i] = randBetweenMinMax(-3,3);
vys[i] = randBetweenMinMax(2,5);
rs[i] = randBetweenMinMax(10,20);
}
//BeginBatchDraw();//清除所有绘图,直到FlushBatchDraw()将所有的绘图显示
while(1)
{
//根据速度,更新每个小球位置
for(int i = 0;i < 10;i++)
{
ys[i] += vys[i];
xs[i] += vxs[i];
//小球碰到边界,对应速度反向
if (ys[i] > height - rs[i] || ys[i] < rs[i])
vys[i] = -vys[i];
if (xs[i] > width - rs[i] || xs[i] < rs[i])
vxs[i] = -vxs[i];
}
//重新显示每个小球
cleardevice(); //清屏
for(int i=0;i<10;i++)
{
fillcircle(xs[i], ys[i], rs[i]); //重新画小球
BeginBatchDraw();
}
FlushBatchDraw(); //批量绘制
Sleep(10); //暂停10毫秒
}
return 0;
}
二.心得体会
1.代码的可读性;
2.一些反复出现的功能可以写一个函数,缩短代码同时便于阅读;
3.需要绘制多个圆时,可以先使用BeginBatchDraw()不显示绘图过程,绘制完成后使用FlushBatchDraw()一次性画出所有圆,消除小球残影;
4.数组的使用;
5.使用函数时,函数的参数可以在开头定义变量,便于修改和理解函数的使用。