C語言用easyx實現消磚塊游戲
更新時間:2022年05月12日 16:03:32 作者:輝小歌
這篇文章主要為大家詳細介紹了C語言消磚塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文項目為大家分享了C語言用easyx實現消磚塊游戲的具體代碼,供大家參考,具體內容如下
一、最終效果展示
效果圖如下:
這個項目還是有很多的細節(jié)漏洞的。例如: 邊界控制這里還是有點問題的。
二、繪制靜態(tài)的擋板
代碼如下:
#include<conio.h> #include<graphics.h> #define High 480 //游戲畫面尺寸 #define Width 640 //全局變量 int ball_x,ball_y;//小球的坐標 int ball_vx,ball_vy;//小球的速度 int radius;//小球的半徑 int bar_x,bar_y;//擋板的中心坐標 int bar_high,bar_width;//擋板的高度和寬度 int bar_left,bar_right,bar_top,bar_bottom;//擋板的左右上下位置坐標 void startup()//數據的初始化 { ?? ?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()//與用戶輸入無關的更新 { ?? ??? ?ball_x=ball_x+ball_vx; ?? ??? ?ball_y=ball_y,ball_vy;//更新小球的坐標 ?? ??? ?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()//與用戶輸入有關的更新 { } void gameover() { ?? ?EndBatchDraw(); ?? ?closegraph(); } int main() { ?? ?startup();//數據的初始化 ?? ?while(1) ?? ?{ ?? ??? ?clean();//把之前繪制的內容清除 ?? ??? ?updateWithoutInput();//與用戶輸入無關的更新 ?? ??? ?updateWithInput();//與用戶輸入有關的更新 ?? ??? ?show();//顯示新畫面 ?? ?} }
效果圖如下:
三、控制擋板
代碼如下:
#include<conio.h> #include<graphics.h> #define High 480 //游戲畫面尺寸 #define Width 640 //全局變量 int ball_x,ball_y;//小球的坐標 int ball_vx,ball_vy;//小球的速度 int radius;//小球的半徑 int bar_x,bar_y;//擋板的中心坐標 int bar_high,bar_width;//擋板的高度和寬度 int bar_left,bar_right,bar_top,bar_bottom;//擋板的左右上下位置坐標 void startup()//數據的初始化 { ?? ?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()//與用戶輸入無關的更新 { ?? ?//擋板和小球碰撞,小球反彈 ?? ?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;//更新小球的坐標 ?? ?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()//與用戶輸入有關的更新 { ?? ?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();//數據的初始化 ?? ?while(1) ?? ?{ ?? ??? ?clean();//把之前繪制的內容清除 ?? ??? ?updateWithoutInput();//與用戶輸入無關的更新 ?? ??? ?updateWithInput();//與用戶輸入有關的更新 ?? ??? ?show();//顯示新畫面 ?? ?} }
效果圖如下:
四、消磚塊
代碼如下:
#include<conio.h> #include<graphics.h> #define High 480 //游戲畫面尺寸 #define Width 640 #define Brick_num 10 //全局變量 int ball_x,ball_y;//小球的坐標 int ball_vx,ball_vy;//小球的速度 int radius;//小球的半徑 int bar_x,bar_y;//擋板的中心坐標 int bar_high,bar_width;//擋板的高度和寬度 int bar_left,bar_right,bar_top,bar_bottom;//擋板的左右上下位置坐標 int isBrickExisted[Brick_num];//每個磚塊是否存在,1為存在,0為沒有了 int brick_high,brick_width;//每個磚塊的高度和寬度 void startup()//數據的初始化 { ?? ?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()//與用戶輸入無關的更新 { ?? ?//擋板和小球碰撞,小球反彈 ?? ?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;//更新小球的坐標 ?? ?//小球和邊界碰撞 ?? ?if( (ball_x<=radius)||(ball_x>=Width-radius)) ?? ??? ?ball_vx=-ball_vx; ?? ?if( (ball_y<=radius)||(ball_y>=High-radius)) ?? ??? ?ball_vy=-ball_vy; ?? ?//判斷小球是否和某個磚塊碰撞 ?? ?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()//與用戶輸入有關的更新 { ?? ?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; ?? ??? ?} ?? ?} } void gameover() { ?? ?EndBatchDraw(); ?? ?closegraph(); } int main() { ?? ?startup();//數據的初始化 ?? ?while(1) ?? ?{ ?? ??? ?clean();//把之前繪制的內容清除 ?? ??? ?updateWithoutInput();//與用戶輸入無關的更新 ?? ??? ?updateWithInput();//與用戶輸入有關的更新 ?? ??? ?show();//顯示新畫面 ?? ?} }
效果圖如下:
五、鼠標交互
先看一個關于鼠標交互的實例
#include<graphics.h> #include<conio.h> int main(void) { ?? ?initgraph(640,480);//初始化圖形窗口 ?? ?MOUSEMSG m;//定義鼠標消息 ?? ?while(1) ?? ?{ ?? ??? ?m=GetMouseMsg();//獲取一條鼠標消息 ?? ??? ?if(m.uMsg==WM_MOUSEMOVE) ?? ??? ?{ ?? ??? ??? ?putpixel(m.x,m.y,WHITE);//鼠標移動的時候畫小白點 ?? ??? ?} ?? ??? ?else if(m.uMsg==WM_LBUTTONDOWN) ?? ??? ?{ ?? ??? ??? ?rectangle(m.x-5,m.y-5,m.x+5,m.y+5); ?? ??? ??? ?//鼠標左鍵按下時在鼠標位置畫一個方塊 ?? ??? ?} ?? ??? ?else if(m.uMsg==WM_RBUTTONUP) ?? ??? ?{ ?? ??? ??? ?circle(m.x,m.y,10); ?? ??? ??? ?//鼠標右鍵按下時在鼠標位置畫一個圓 ?? ??? ?} ?? ?} ?? ?return 0; }
用鼠標控制擋板移動,按鼠標左鍵初始化小球位置
代碼如下:
#include<conio.h> #include<graphics.h> #define High 480 //游戲畫面尺寸 #define Width 640 #define Brick_num 10 //全局變量 int ball_x,ball_y;//小球的坐標 int ball_vx,ball_vy;//小球的速度 int radius;//小球的半徑 int bar_x,bar_y;//擋板的中心坐標 int bar_high,bar_width;//擋板的高度和寬度 int bar_left,bar_right,bar_top,bar_bottom;//擋板的左右上下位置坐標 int isBrickExisted[Brick_num];//每個磚塊是否存在,1為存在,0為沒有了 int brick_high,brick_width;//每個磚塊的高度和寬度 void startup()//數據的初始化 { ?? ?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()//與用戶輸入無關的更新 { ?? ?//擋板和小球碰撞,小球反彈 ?? ?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;//更新小球的坐標 ?? ?//小球和邊界碰撞 ?? ?if( (ball_x<=radius)||(ball_x>=Width-radius)) ?? ??? ?ball_vx=-ball_vx; ?? ?if( (ball_y<=radius)||(ball_y>=High-radius)) ?? ??? ?ball_vy=-ball_vy; ?? ?//判斷小球是否和某個磚塊碰撞 ?? ?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()//與用戶輸入有關的更新 { ?? ?/*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;//定義鼠標信息 ?? ?if(MouseHit())//這個函數用于檢測當前是否有鼠標消息 ?? ?{ ?? ??? ?m=GetMouseMsg();//獲取一條鼠標消息 ?? ??? ?if(m.uMsg==WM_MOUSEMOVE) ?? ??? ?{ ?? ??? ??? ?//擋板的位置等于鼠標所在的位置 ?? ??? ??? ?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();//數據的初始化 ?? ?while(1) ?? ?{ ?? ??? ?clean();//把之前繪制的內容清除 ?? ??? ?updateWithoutInput();//與用戶輸入無關的更新 ?? ??? ?updateWithInput();//與用戶輸入有關的更新 ?? ??? ?show();//顯示新畫面 ?? ?} }
效果圖如下:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。