打砖块小游戏 C语言编写

#include
#include
#include
#include
#include
#define ESC 0x011b
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define closegr closegraph
/*文件包含程序中调用的库函数的文件库*/

/*设定一个数据结构存放砖块的信息*/
struct brick
{
int x; /*砖块左上角横坐标*/
int y; /*砖块左上角纵坐标*/
int key; /*表示砖块是否被击中过的变量,1表示被击中过,0表示未被击中过*/
}a[7][7];

/*对要用到的自定义函数的声明*/
void initgr();
void start();
void welcome();
void picture();
void draw();
void quitgame();
void losegame();
void wingame();

/*主函数*/
main()
{
int i,j,x,y;
for(i=0,y=0;i<7;i++) /*设置循环存放砖块信息*/
{
x=0;
for(j=0;j<7;j++)
{
a[i][j].x=x;
a[i][j].y=y;
a[i][j].key=0;
x=x+48;
}
y=y+18;
}
initgr();
welcome();
picture();
start();
cleardevice(); /*清除图形屏幕*/
closegraph(); /*关闭图形系统*/
}

/*初始化图形系统函数*/
void initgr()
{
int gdriver,gmode;
gdriver=VGA;
gmode=VGAHI;
registerbgidriver(EGAVGA_driver); /*注册BGI驱动*/
initgraph(&gdriver,&gmode,""); /*初始化图形系统*/
}

/*欢迎界面函数*/
void welcome()
{
int i;
setcolor(WHITE); /*设置文本颜色为白色*/
outtextxy(270,380,"Made by SLY");
outtextxy(200,400,"Press any key to continue ..."); /*在指定位置输出指定文本信息*/
while(!kbhit()) /*检查当前按下的键*/
{
settextstyle(0,0,4); /*设置文本的位置及字体*/
/*此部分通过文本循环变换颜色来达到文本闪烁的效果*/
for(i=1;i<=15;i++)
{
setcolor(i);
outtextxy(230,180,"DxBall");
delay(5000);
}
}
cleardevice(); /*清除图形屏幕*/
}

/*画出游戏界面*/
void picture()
{
int i,j,m,n;
setbkcolor(LIGHTBLUE); /*设置背景色为淡蓝色*/
setcolor(YELLOW); /*设置划线颜色为黄色*/
draw(130,10,360,450); /*在指定位置画出指定大小的矩形*/
/*设置循环画出屏幕上方的砖块*/
for(i=1;i<=7;i++)
{
for(j=1;j<=7;j++)

{
for(m=0;m<7;m++)
{
for(n=0;n<7;n=n++)
{ setfillstyle(SOLID_FILL,YELLOW);
bar(135+m*50,15+n*20,183+m*50,33+n*20);
}
}
}
printf("\n");
}
setfillstyle(SOLID_FILL,WHITE); /*设置填充颜色为白色*/
bar(280,435,340,440); /*在指定位置画出一条形图,即游戏所需挡板*/
}

/*开始游戏*/
void start()
{
int bricknumber=49; /*砖块初始数目为49个*/
int i,j,key;
int ballX,ballY,dx=1,dy=1;
int

brickx,bricky; /*砖块的左上角坐标*/
int boardX=280,boardY=435,x,y;
ballX=310; /*球心初始位置*/
ballY=425;

while(bricknumber>0) /*设置循环直至砖块被打完*/
{
while(!kbhit()) /*检查当前按下的键*/
{
if((ballX<=140||ballX>=480)) /*判断球心的范围以设置斜率控制其反弹*/
dx=-dx;
if((ballY<=20)||(ballY>=450))
dy=-dy;
setcolor(LIGHTRED); /*设置划线颜色为淡红色*/
circle(ballX+=dx,ballY-=dy,7); /*根据判断结果在指定位置画出小球*/
setfillstyle(SOLID_FILL,LIGHTRED); /*将小球填充成淡红色*/
floodfill(ballX,ballY,LIGHTRED);
delay(1000); /*设置小球移动的速度*/
setcolor(LIGHTBLUE); /*设置划线颜色为淡蓝色*/
circle(ballX,ballY,7); /*在小球经过的位置消除其痕迹*/
setfillstyle(SOLID_FILL,LIGHTBLUE); /*将小球填充为淡蓝色*/
floodfill(ballX,ballY,LIGHTBLUE);

/*此部分控制砖块的碰撞及消除*/
for(bricky=15,i=0;bricky<=138;bricky+=20,i++)
for(brickx=135,j=0;brickx<=435;brickx+=50,j++)
{
if((ballX>brickx)&&(ballX=(bricky-7))&&(ballY<=(bricky+27)))&&(a[i][j].key==0)) /*判断小球是否碰到砖块*/
{
dy=-dy;
setfillstyle(SOLID_FILL,LIGHTBLUE); /*将小球碰到的砖块填充成淡蓝色以达到消除方块的效果*/
bar(brickx,bricky,brickx+48,bricky+18);
bricknumber=bricknumber-1; /*砖块数目减一*/
a[i][j].key=1; /*表示击中砖块,存放信息*/
}
}

/*判断挡板是否接住小球*/
if((ballX>=boardX)&&(ballX<=boardX+60)&&(ballY>=425))
dy=-dy;
if(((ballXboardX+60))&&(ballY>445))
{
sleep(1);
losegame(); /*游戏失败*/
}
}

/*键盘控制挡板的运动*/
key=bioskey(0); /*返回所按键的键码*/
if(key==LEFT) /*判断是否按下左箭头*/
{
if(boardX>=134.9) /*设置挡板向左移动的范围*/
{ setfillstyle(SOLID_FILL,LIGHTBLUE); /*挡板移动过的地方填充成背景色以消除痕迹*/
bar(boardX,boardY,boardX+60,boardY+5);
boardX=boardX-10; /*挡板左上角横坐标减小*/
setfillstyle(SOLID_FILL,WHITE); /*在新位置画出一条白色挡板*/
bar(boardX,boardY,boardX+60,boardY+5);
}
}
else if(key==RIGHT) /*判断是否按下右箭头*/
{
if(boardX<=424) /*设置挡板向右移动的范围*/
{ setfillstyle(SOLID_FILL,LIGHTBLUE);
bar(boardX,boardY,boardX+60,boardY+5);
boardX=boardX+10;
setfillstyle(SOLID_FILL,WHITE);
bar(boardX,boardY,boardX+60,boardY+5);
}
}
else if(key==ESC) /*判断是否按下退出键*/
quitgame

(); /*调用退出游戏函数*/
}
wingame(); /*循环结束砖块数目为零,玩家胜利*/
}

/*画方块*/
void draw(int x,int y,int sizex,int sizey)
{
rectangle(x,y,x+sizex,y+sizey);
}

/*退出游戏*/
void quitgame()
{
cleardevice(); /*清除图形屏幕*/
setbkcolor(YELLOW); /*设置背景颜色为黄色*/
setcolor(LIGHTBLUE); /*设置文本颜色为淡蓝色*/
settextstyle(0,0,4); /*设定文本位置及属性*/
outtextxy(180,220,"GAME OVER");
sleep(2); /*执行挂起一段时间*/
cleardevice(); /*清除图形屏幕*/
closegraph(); /*关闭图形系统*/
}

/*游戏失败*/
void losegame()
{
cleardevice(); /*清除图形屏幕*/
setbkcolor(YELLOW);
setcolor(LIGHTBLUE);
settextstyle(0,0,4);
outtextxy(50,220,"SORRY!YOU ARE LOST!");
sleep(2);
cleardevice();
settextstyle(0,0,4);
outtextxy(180,220,"GAME OVER");
sleep(2);
cleardevice();
closegraph();
}

/*玩家胜利*/
void wingame()
{
cleardevice();
setbkcolor(YELLOW);
setcolor(LIGHTBLUE);
settextstyle(0,0,4);
outtextxy(50,220,"WELL DONE!YOU WIN!");
sleep(2);
cleardevice();
settextstyle(0,0,4);
outtextxy(180,220,"GAME OVER");
sleep(2);
cleardevice();
closegraph();
}


相关文档
最新文档