再能實(shí)現(xiàn)小球的下落、斜著運(yùn)動(dòng)之后,這節(jié)我們來實(shí)現(xiàn)讓小球?qū)崿F(xiàn)碰墻自動(dòng)改變方向。那么接著上回的代碼大家想想應(yīng)該如何調(diào)整代碼
首先,考慮到小球碰到墻之后(這個(gè)墻就是窗口的邊界),方向是不是要改變,類似光的反射一樣,
大家注意觀察和思考,當(dāng)球碰到墻(邊界)之后,這個(gè)球的方向改如何改變?
通過觀察可以發(fā)現(xiàn),當(dāng)球碰撞底部之后,小球的x軸方向其實(shí)是沒有變化的!而y軸方向變成的反方向!
繼續(xù)想象,如果是碰到上頂呢?是一樣的!
那么上下考慮之后,再考慮左右墻碰撞時(shí)候,類似的,小球的y軸方向是沒有變化的,而x軸方向變成的反方向!
這個(gè)時(shí)候,思路基本就清晰了,按照這個(gè)思路,我們稍作修改,加一個(gè)if邊界的判斷,將原先的循環(huán)改為while死循環(huán)使得小球會(huì)不停的碰撞運(yùn)動(dòng)。
完整代碼如下:
//彈球游戲 //www.sztianhecheng.cn #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; //表示小球的圓心坐標(biāo) initgraph(WIDTH, HIGH); // 創(chuàng)建繪圖窗口,大小為 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(); // 按任意鍵繼續(xù) closegraph(); // 關(guān)閉繪圖窗口 return 0; }
代碼將原先固定的數(shù)值改成了變量,并增加了宏定義規(guī)范了代碼,運(yùn)行后效果如下圖:
怎么樣,是不是可以了?
請(qǐng)大家理解代碼,并上機(jī)實(shí)驗(yàn)~
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程