项目: 用easyx实现消砖块
生活随笔
收集整理的這篇文章主要介紹了
项目: 用easyx实现消砖块
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目錄
- 一、最終效果展示
- 二、繪制靜態(tài)的擋板
- 三、控制擋板
- 四、消磚塊
- 五、鼠標(biāo)交互
一、最終效果展示
效果圖如下:
二、繪制靜態(tài)的擋板
代碼如下:
#include<conio.h> #include<graphics.h>#define High 480 //游戲畫面尺寸 #define Width 640//全局變量 int ball_x,ball_y;//小球的坐標(biāo) int ball_vx,ball_vy;//小球的速度 int radius;//小球的半徑 int bar_x,bar_y;//擋板的中心坐標(biāo) int bar_high,bar_width;//擋板的高度和寬度 int bar_left,bar_right,bar_top,bar_bottom;//擋板的左右上下位置坐標(biāo)void startup()//數(shù)據(jù)的初始化 {ball_x=Width/2;ball_y=High/2;ball_vx=1;ball_vy=1;radius=20;bar_high=High/20;bar_width=Width/5;bar_x=Width/2;bar_y=High-bar_high/2;bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;initgraph(Width,High);BeginBatchDraw(); }void clean()//顯示畫面 {setcolor(BLACK);//繪制黑線,黑色填充的圓setfillcolor(BLACK);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//繪制黑色,黑色填充的擋板 }void show()//顯示畫面 {setcolor(YELLOW);//繪制黃線,綠色填充的圓setfillcolor(GREEN);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//繪制黃色,綠色填充的擋板FlushBatchDraw();Sleep(3); }void updateWithoutInput()//與用戶輸入無關(guān)的更新 {ball_x=ball_x+ball_vx;ball_y=ball_y,ball_vy;//更新小球的坐標(biāo)if( (ball_x<=radius)||(ball_x>=Width-radius))ball_vx=-ball_vx;if( (ball_y<=radius)||(ball_y>=High-radius))ball_vy=-ball_vy; }void updateWithInput()//與用戶輸入有關(guān)的更新 {}void gameover() {EndBatchDraw();closegraph(); }int main() {startup();//數(shù)據(jù)的初始化while(1){clean();//把之前繪制的內(nèi)容清除updateWithoutInput();//與用戶輸入無關(guān)的更新updateWithInput();//與用戶輸入有關(guān)的更新show();//顯示新畫面} }效果圖如下:
三、控制擋板
代碼如下:
#include<conio.h> #include<graphics.h>#define High 480 //游戲畫面尺寸 #define Width 640//全局變量 int ball_x,ball_y;//小球的坐標(biāo) int ball_vx,ball_vy;//小球的速度 int radius;//小球的半徑 int bar_x,bar_y;//擋板的中心坐標(biāo) int bar_high,bar_width;//擋板的高度和寬度 int bar_left,bar_right,bar_top,bar_bottom;//擋板的左右上下位置坐標(biāo)void startup()//數(shù)據(jù)的初始化 {ball_x=Width/2;ball_y=High/2;ball_vx=1;ball_vy=1;radius=20;bar_high=High/20;bar_width=Width/5;bar_x=Width/2;bar_y=High-bar_high/2;bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;initgraph(Width,High);BeginBatchDraw(); }void clean()//顯示畫面 {setcolor(BLACK);//繪制黑線,黑色填充的圓setfillcolor(BLACK);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//繪制黑色,黑色填充的擋板 }void show()//顯示畫面 {setcolor(YELLOW);//繪制黃線,綠色填充的圓setfillcolor(GREEN);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//繪制黃色,綠色填充的擋板FlushBatchDraw();Sleep(3); }void updateWithoutInput()//與用戶輸入無關(guān)的更新 {//擋板和小球碰撞,小球反彈if(((ball_y+radius>=bar_top)&&(ball_y+radius<bar_bottom-bar_high/3))||((ball_y-radius<=bar_bottom)&&(ball_y-radius>bar_top-bar_high/3)))if((ball_x>=bar_left)&&(ball_x<=bar_right))ball_vy=-ball_vy;ball_x=ball_x+ball_vx;ball_y=ball_y,ball_vy;//更新小球的坐標(biāo)if( (ball_x<=radius)||(ball_x>=Width-radius))ball_vx=-ball_vx;if( (ball_y<=radius)||(ball_y>=High-radius))ball_vy=-ball_vy; }void updateWithInput()//與用戶輸入有關(guān)的更新 {char input;if(kbhit()){input=getch();if(input=='a'&&bar_left>0){bar_x=bar_x-15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}if(input=='d'&&bar_right<Width){bar_x=bar_x+15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}if(input=='w'&&bar_top>0){bar_y=bar_y-15;//位置左移bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;}if(input=='s'&&bar_bottom<High){bar_y=bar_y+15;//位置右移bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;}} }void gameover() {EndBatchDraw();closegraph(); }int main() {startup();//數(shù)據(jù)的初始化while(1){clean();//把之前繪制的內(nèi)容清除updateWithoutInput();//與用戶輸入無關(guān)的更新updateWithInput();//與用戶輸入有關(guān)的更新show();//顯示新畫面} }效果圖如下:
四、消磚塊
代碼如下:
效果圖如下:
五、鼠標(biāo)交互
先看一個(gè)關(guān)于鼠標(biāo)交互的實(shí)例
代碼如下:
#include<conio.h> #include<graphics.h>#define High 480 //游戲畫面尺寸 #define Width 640 #define Brick_num 10//全局變量 int ball_x,ball_y;//小球的坐標(biāo) int ball_vx,ball_vy;//小球的速度 int radius;//小球的半徑 int bar_x,bar_y;//擋板的中心坐標(biāo) int bar_high,bar_width;//擋板的高度和寬度 int bar_left,bar_right,bar_top,bar_bottom;//擋板的左右上下位置坐標(biāo)int isBrickExisted[Brick_num];//每個(gè)磚塊是否存在,1為存在,0為沒有了 int brick_high,brick_width;//每個(gè)磚塊的高度和寬度void startup()//數(shù)據(jù)的初始化 {ball_x=Width/2;ball_y=High/2;ball_vx=1;ball_vy=1;radius=20;bar_high=High/20;bar_width=Width/5;bar_x=Width/2;bar_y=High-bar_high/2;bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;brick_width=Width/Brick_num;brick_high=High/Brick_num;int i;for(i=0;i<Brick_num;i++)isBrickExisted[i]=1;initgraph(Width,High);BeginBatchDraw(); }void clean()//顯示畫面 {setcolor(BLACK);//繪制黑線,黑色填充的圓setfillcolor(BLACK);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//繪制黑色,黑色填充的擋板int i,brick_left,brick_right,brick_top,brick_bottom;for(i=0;i<Brick_num;i++){brick_left=i*brick_width;brick_right=brick_left+brick_width;brick_top=0;brick_bottom=brick_high;if(!isBrickExisted[i])//磚塊沒有了,繪制黑色fillrectangle(brick_left,brick_top,brick_right,brick_bottom);} }void show()//顯示畫面 {setcolor(YELLOW);//繪制黃線,綠色填充的圓setfillcolor(GREEN);fillcircle(ball_x,ball_y,radius);bar(bar_left,bar_top,bar_right,bar_bottom);//繪制黃色,綠色填充的擋板int i,brick_left,brick_right,brick_top,brick_bottom;for(i=0;i<Brick_num;i++){brick_left=i*brick_width;brick_right=brick_left+brick_width;brick_top=0;brick_bottom=brick_high;if(isBrickExisted[i])//磚塊存在,繪制磚塊{setcolor(WHITE);setfillcolor(RED);fillrectangle(brick_left,brick_top,brick_right,brick_bottom);//繪制磚塊}}FlushBatchDraw();Sleep(3); }void updateWithoutInput()//與用戶輸入無關(guān)的更新 {//擋板和小球碰撞,小球反彈if(((ball_y+radius>=bar_top)&&(ball_y+radius<bar_bottom-bar_high/3))||((ball_y-radius<=bar_bottom)&&(ball_y-radius>bar_top-bar_high/3)))if((ball_x>=bar_left)&&(ball_x<=bar_right))ball_vy=-ball_vy;ball_x=ball_x+ball_vx;ball_y=ball_y+ball_vy;//更新小球的坐標(biāo)//小球和邊界碰撞if( (ball_x<=radius)||(ball_x>=Width-radius))ball_vx=-ball_vx;if( (ball_y<=radius)||(ball_y>=High-radius))ball_vy=-ball_vy;//判斷小球是否和某個(gè)磚塊碰撞int i,brick_left,brick_right,brick_top,brick_bottom;for(i=0;i<Brick_num;i++){if(isBrickExisted[i])//磚塊存在才判斷{brick_left=i*brick_width;brick_right=brick_left+brick_width;brick_bottom=brick_high;if((ball_y==brick_bottom+radius)&&(ball_x>=brick_left)&&(ball_x<=brick_right)){isBrickExisted[i]=0;ball_vy=-ball_vy;}}} }void updateWithInput()//與用戶輸入有關(guān)的更新 {/*char input;if(kbhit()){input=getch();if(input=='a'&&bar_left>0){bar_x=bar_x-15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}if(input=='d'&&bar_right<Width){bar_x=bar_x+15;//位置左移bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;}}*/MOUSEMSG m;//定義鼠標(biāo)信息if(MouseHit())//這個(gè)函數(shù)用于檢測(cè)當(dāng)前是否有鼠標(biāo)消息{m=GetMouseMsg();//獲取一條鼠標(biāo)消息if(m.uMsg==WM_MOUSEMOVE){//擋板的位置等于鼠標(biāo)所在的位置bar_x=m.x;bar_y=m.y;bar_left=bar_x-bar_width/2;bar_right=bar_x+bar_width/2;bar_top=bar_y-bar_high/2;bar_bottom=bar_y+bar_high/2;}else if(m.uMsg==WM_LBUTTONDOWN){ball_x=bar_x;//初始化小球的位置為擋板上面中心ball_y=bar_top-radius-3;}} }void gameover() {EndBatchDraw();closegraph(); }int main() {startup();//數(shù)據(jù)的初始化while(1){clean();//把之前繪制的內(nèi)容清除updateWithoutInput();//與用戶輸入無關(guān)的更新updateWithInput();//與用戶輸入有關(guān)的更新show();//顯示新畫面} }效果圖如下:
總結(jié)
以上是生活随笔為你收集整理的项目: 用easyx实现消砖块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目: 实时钟表(C语言)
- 下一篇: 项目: 双人反弹球游戏