C语言EasyX详解(小球碰撞)
生活随笔
收集整理的這篇文章主要介紹了
C语言EasyX详解(小球碰撞)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
首先先來認識下EasyX
EasyX 是針對 C/C++ 的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。
比如,可以用 VC + EasyX 很快的用幾何圖形畫一個房子,或者一輛移動的小車,可以編寫俄羅斯方塊、貪吃蛇、黑白棋等小游戲,可以練習圖形學的各種算法,等等。
文章目錄
- 1.靜止小球
- 2.顏色漸變實現(xiàn)
- 3.圍棋棋盤
- 4.國際象棋棋盤
- 5.小球運動
- 6.多個小球移動
- 7.多個小球碰撞
1.靜止小球
#include <conio.h> #include <graphics.h> int main() {initgraph(640,480); //初始化畫布大小setcolor(YELLOW); //圓的線條顏色setfillcolor(GREEN); //圓內(nèi)部填充顏色fillcircle(100,100,20); //圓位置以及半徑getch(); //按任意鍵繼續(xù)closegraph(); //關(guān)閉圖形界面initgraph(640,256); //初始化畫布for(int y=0;y<256;y++){setcolor(RGB(0,y,y));line(0,y,640,y); //畫線}getch();closegraph();return 0; }2.顏色漸變實現(xiàn)
#include <conio.h> #include <graphics.h> int main() {initgraph(640,256); //初始化畫布for(int y=0;y<256;y++){setcolor(RGB(0,y,y));line(0,y,640,y); //畫線}getch();closegraph();return 0; }3.圍棋棋盤
#include <conio.h> #include <graphics.h> int main() {initgraph(800,800); setcolor(YELLOW);for(int i=0;i<801;i++){line(0,i,841,i);}setcolor(BLACK);for(int j=40;j<761;j+=40){line(40,j,760,j);line(j,40,j,760); }setfillcolor(BLACK);fillcircle(160,160,4); //在圍棋的九個點上畫圓fillcircle(160,400,4);fillcircle(160,640,4);fillcircle(400,160,4);fillcircle(400,400,4);fillcircle(400,640,4);fillcircle(640,160,4);fillcircle(640,400,4);fillcircle(640,640,4);getch();closegraph();return 0; }4.國際象棋棋盤
#include <conio.h> #include <graphics.h> int main() {//國際象棋棋盤initgraph(640,640); for(int i=0;i<640;i+=80){for(int j=0;j<640;j+=80){if(j/80%2==0){if(i/80%2==0){setfillcolor(BLACK);fillrectangle(j,i,j+80,i+80);}if(i/80%2==1){setfillcolor(WHITE);fillrectangle(j,i,j+80,i+80);}}if(j/80%2==1){if(i/80%2==1){setfillcolor(BLACK);fillrectangle(j,i,j+80,i+80);}if(i/80%2==0){setfillcolor(WHITE);fillrectangle(j,i,j+80,i+80);}}}}getch();closegraph();return 0; }5.小球運動
#include <conio.h> #include <graphics.h> #include <time.h> int main() {int ball_x,ball_y; //小球位置坐標int ball_vx=1; //小球X軸與Y軸的速度int ball_vy=1;//隨機生成小球初始位置srand((unsigned)time(NULL));ball_x=rand()%600+20;ball_y=rand()%360+20;initgraph(640,400);BeginBatchDraw(); //這個函數(shù)用于開始批量繪圖,執(zhí)行后任何繪圖操作都將暫時不輸出到屏幕上。while(1){setcolor(YELLOW);setfillcolor(GREEN);fillcircle(ball_x,ball_y,20);Sleep(2);FlushBatchDraw(); //將之前的繪圖輸出,這個函數(shù)用于執(zhí)行未完成的繪圖人物。setcolor(BLACK);setfillcolor(BLACK);fillcircle(ball_x,ball_y,20);ball_x=ball_x+ball_vx;ball_y=ball_y+ball_vy;//當小球表面接觸墻壁時發(fā)生碰撞反彈if(ball_x<=20||ball_x>=620)ball_vx=-ball_vx;if(ball_y<=20||ball_y>=380)ball_vy=-ball_vy;}EndBatchDraw(); //結(jié)束批量繪制,并執(zhí)行未完成的繪圖任務closegraph();return 0; }6.多個小球移動
#include <conio.h> #include <graphics.h> #include <time.h> #define number 10 //小球個數(shù) struct Ball {int ball_x;int ball_y;int ball_vx;int ball_vy; }; Ball balls[number]; int main() { //初始化所有小球位置srand((unsigned)time(NULL));for(int i=0;i<number;i++){balls[i].ball_x=rand()%600+20;balls[i].ball_y=rand()%360+20;balls[i].ball_vx=1;balls[i].ball_vy=1;//printf("[%d,%d]\n",balls[i].ball_x,balls[i].ball_y);}initgraph(640,400);BeginBatchDraw();while(1){setcolor(YELLOW);setfillcolor(GREEN);//繪制所有小球for(int i=0;i<number;i++){fillcircle(balls[i].ball_x,balls[i].ball_y,20);}Sleep(2);FlushBatchDraw();setcolor(BLACK);setfillcolor(BLACK);//改變所有小球坐標for(i=0;i<number;i++){fillcircle(balls[i].ball_x,balls[i].ball_y,20);balls[i].ball_x=balls[i].ball_x+balls[i].ball_vx;balls[i].ball_y=balls[i].ball_y+balls[i].ball_vy;if(balls[i].ball_x<=20||balls[i].ball_x>=620)balls[i].ball_vx=-balls[i].ball_vx;if(balls[i].ball_y<=20||balls[i].ball_y>=380)balls[i].ball_vy=-balls[i].ball_vy;}}EndBatchDraw();closegraph(); }7.多個小球碰撞
從上面可以看出,多個小球運動是有相互交錯的部分,我們可以增加碰撞功能
#include <conio.h> #include <graphics.h> #include <time.h> #define number 10 //小球個數(shù) struct Ball {int ball_x;int ball_y;int ball_vx;int ball_vy;int distance[2]; //記錄某個小球,距離它最近的小球的距離,以及這個小球的下標 }; Ball balls[number];int main() {void get_distance(struct Ball balls[number]);void knock(struct Ball balls[number]);//初始化所有小球位置srand((unsigned)time(NULL));for(int i=0;i<number;i++){balls[i].ball_x=rand()%600+20;balls[i].ball_y=rand()%360+20;for(int j=0;j<number;j++)if(i!=j) //不用和自己比{//初始化讓小球不會輕易重疊if((balls[i].ball_x>=balls[j].ball_x-20)&&(balls[i].ball_x<=balls[j].ball_x+20)&&(balls[i].ball_y>=balls[j].ball_y-20)&&(balls[i].ball_y<=balls[j].ball_y+20)){balls[i].ball_x=rand()%600+20;balls[i].ball_y=rand()%360+20;}}balls[i].ball_vx=1;balls[i].ball_vy=1;//printf("[%d,%d]\n",balls[i].ball_x,balls[i].ball_y);}for (i=0;i<number;i++){balls[i].distance[0] = 99999999;balls[i].distance[1] = -1;}initgraph(640,400);BeginBatchDraw();while(1){setcolor(YELLOW);setfillcolor(GREEN);//繪制所有小球for(int i=0;i<number;i++){fillcircle(balls[i].ball_x,balls[i].ball_y,20);}get_distance(balls);knock(balls);Sleep(2);FlushBatchDraw();setcolor(BLACK);setfillcolor(BLACK);//改變所有小球坐標for(i=0;i<number;i++){fillcircle(balls[i].ball_x,balls[i].ball_y,20);balls[i].ball_x=balls[i].ball_x+balls[i].ball_vx;balls[i].ball_y=balls[i].ball_y+balls[i].ball_vy;if(balls[i].ball_x<=20||balls[i].ball_x>=620)balls[i].ball_vx=-balls[i].ball_vx;if(balls[i].ball_y<=20||balls[i].ball_y>=380)balls[i].ball_vy=-balls[i].ball_vy;}}EndBatchDraw();closegraph();return 0; } int i,j; void get_distance(struct Ball balls[number]) {// 求解所有小球兩兩之間的距離平方for (i=0;i<number;i++){for (j=0;j<number;j++){if (i!=j) // 自己和自己不需要比{int dist2;dist2 = (balls[i].ball_x - balls[j].ball_x)*(balls[i].ball_x - balls[j].ball_x)+(balls[i].ball_y - balls[j].ball_y)*(balls[i].ball_y - balls[j].ball_y);if (dist2<balls[i].distance[0]){balls[i].distance[0] = dist2;balls[i].distance[1] = j;}}}} }void knock(struct Ball balls[number]) {// 判斷球之間是否碰撞for (i=0;i<number;i++){if (balls[i].distance[0]<=4*(20*20)) // 最小距離小于閾值,發(fā)生碰撞{j = balls[i].distance[1];// 交換速度 int temp;temp = balls[i].ball_vx; balls[i].ball_vx = balls[j].ball_vx; balls[j].ball_vx = temp;temp = balls[i].ball_vy; balls[i].ball_vy = balls[j].ball_vy; balls[j].ball_vy = temp;balls[j].distance[0] = 99999999; // 避免交換兩次速度,將兩個小球重新賦值balls[j].distance[1] = -1;balls[i].distance[0] = 99999999; balls[i].distance[1] = -1;}} }
總結(jié)
以上是生活随笔為你收集整理的C语言EasyX详解(小球碰撞)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HybridApp
- 下一篇: ctfmon是什么启动项_我MSCONF