运动中的球,碰撞墙壁后会45角反弹。消除旧图再画新圆的缺点是圆重叠时会闪烁,而且覆盖的黑圆被看见。
// 反弹球.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "graphics.h"
#include "conio.h"
#include "time.h"
#define MAXCIRCLE 10 //圆的数目
void main( )
{
int point;
int circlenum=0;
int x[MAXCIRCLE],y[MAXCIRCLE],i[MAXCIRCLE],j[MAXCIRCLE];
for(point=MAXCIRCLE;point>=0;point--)//x方向上的移动距离,正负表示方向
{
x[point]=rand()%30+1; //y方向上的移动距离,正负表示方向
y[point]=rand()%30+1;
}
for(point=MAXCIRCLE-1;point>=0;point--)
{
i[point]=590;
j[point]=rand()%380+50;
}
//初始化图形窗口
initgraph(640,480);
//设置当前线型以及填充类型,并画圆
setlinecolor(YELLOW);
setfillcolor(BLUE);
fillcircle(i[circlenum],j[circlenum],50);
BeginBatchDraw();
//圆在45度移动
while(true)
{
//消除旧圆
setlinecolor(BLACK);
setfillcolor(BLACK);
fillcircle(i[circlenum],j[circlenum],50);
//改变坐标
i[circlenum]=i[circlenum]+x[circlenum];
j[circlenum]=j[circlenum]+y[circlenum];
//重绘新圆
setlinecolor(YELLOW);
setfillcolor(BLUE);
fillcircle(i[circlenum],j[circlenum],50);
//边界检测
if(i[circlenum]-50<0 || i[circlenum]+50>640 )
//反弹
x[circlenum]=-x[circlenum];
if(j[circlenum]-50<0 || j[circlenum]+50>480)
y[circlenum]=-y[circlenum];
circlenum++;
if(circlenum>MAXCIRCLE-1)
circlenum=0;
FlushBatchDraw();
Sleep(2);
}
EndBatchDraw();
getch();
//关闭图形窗口
closegraph();
}