再能实现小球的下落、斜着运动之后,这节我们来实现让小球实现碰墙自动改变方向。那么接着上回的代码大家想想应该如何调整代码


首先,考虑到小球碰到墙之后(这个墙就是窗口的边界),方向是不是要改变,类似光的反射一样,

球的反射

大家注意观察和思考,当球碰到墙(边界)之后,这个球的方向改如何改变?


通过观察可以发现,当球碰撞底部之后,小球的x轴方向其实是没有变化的!而y轴方向变成的反方向!

继续想象,如果是碰到上顶呢?是一样的!

那么上下考虑之后,再考虑左右墙碰撞时候,类似的,小球的y轴方向是没有变化的,而x轴方向变成的反方向!

这个时候,思路基本就清晰了,按照这个思路,我们稍作修改,加一个if边界的判断,将原先的循环改为while死循环使得小球会不停的碰撞运动。

完整代码如下:

//弹球游戏
//www.dotcpp.com
#include <graphics.h>        // 引用图形库头文件
#include <conio.h>
 
#define WIDTH 640
#define HIGH 480
#define R 10
int main()
{
    int i;
	int Vx=5,Vy=5;
    int x=WIDTH/2,y=HIGH/2;                //表示小球的圆心坐标
    initgraph(WIDTH, HIGH);    // 创建绘图窗口,大小为 640x480 像素
    while(1)
    {  
        //绘制小球图案
        setfillcolor(GREEN);   
        fillcircle(x,y,R);
        Sleep(50);
        //原位置擦除小球图案
        setcolor(BLACK);
        setfillcolor(BLACK);
        fillcircle(x,y,R);
         
        x=x+Vx;
        y=y+Vy;
		if(x<=R || x>=WIDTH-R)
			Vx=-Vx;
		if(y<=R || y>=HIGH-R)
			Vy=-Vy;
    }
     
    getch();                // 按任意键继续
    closegraph();           // 关闭绘图窗口
    return 0;
}

代码将原先固定的数值改成了变量,并增加了宏定义规范了代码,运行后效果如下图:

小球碰撞效果


怎么样,是不是可以了?

请大家理解代码,并上机实验~

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)