//消砖块
#include <conio.h>
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#define high 480 //游戏画面尺寸
#define width 640
#define brick_num 10 //砖块的个数
//全局变量
int ball_x,ball_y; //小球的坐标
int ball_vx,ball_vy; //小球的速度
int bar_x,bar_y; //挡板的中心坐标
int bar_high,bar_width; //挡板的高度和宽度
int bar_left,bar_right,bar_top,bar_bottom; //挡板的上下左右的坐标
int radius; //小球的半径
int isbrickexist[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_high=high/brick_num;
brick_width=width/brick_num;
int i;
for(i=0;i<brick_num;i++)
{
isbrickexist[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(!isbrickexist[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_top,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(isbrickexist[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_bottom;
for(i=0;i<brick_num;i++)
{
if(isbrickexist[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))
{
isbrickexist[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;
}
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();
}
gameover();
return 0;
}
消砖块
猜你喜欢
转载自blog.csdn.net/qq_40501731/article/details/86746854
今日推荐
周排行