/*******************************************************************************
*
* 文件名: 乒乓球
*
* 文件描述: 小游戏
*
* 创建人: 张帅威
*
* 版本号: 2.0.0
*
*******************************************************************************/
#include "weih.c"
#include "menu.c"
int key(int vvk); /*由kbhit()函数,来改变球拍坐标*/
int * guanka(void); /*关卡*/
int len_arr(void); /*返回数组长度*/
void Vmain(void);
void play1(void); /*第一关*/
void play2(void); /*其他关*/
void start(void); /*初始化*/
void initgr(void); /*图形初始化*/
void welcome(void); /*欢迎界面,介绍制作人*/
void keystoke(void);
void move_begin(void); /*移动*/
void chronotron(void); /*延时*/
void begin_guan(void); /*每关开始前,移动球拍*/
void paint_ba(int fx,int fy,int fxy,int vstep,int vtan); /*画球*/
/*全局*/
int guan=1; /*第几关*/
int vvx,vvy; /*乒乓球坐标*/
int shuai[20]; /*是否击中.0没有,1被击落*/
int vvangle=45; /*弹出角度*/
int linex,liney; /*球拍的坐标 x轴 */
long vtime=6000; /*延时2000000*/
/*----------------------------------------------------------------------------*/
void main(void)
{Vmain();
initgr();
cleardevice();
gotoxy(31,1);
printf("Welcome to here.");
gotoxy(65,1);
printf("grade:%d.",guan);
start();
play1();
move_begin();
setviewport(10,10,50,50,0);
closegr();/* 恢复TEXT屏幕模式 */
}
/*----------------------------------------------------------------------------*/
/* BGI初始化 */
void initgr()
{int gd = DETECT, gm = 0;
registerbgidriver(EGAVGA_driver);
initgraph(&gd, &gm, "");
/*--- 初始化 ---*/
/*int graphics_driver=DETECT,graphics_modes;
initgraph(&graphics_driver,&graphics_modes,"");*/
}
/*----------------------------------------------------------------------------*/
/* 初始化界面 */
void start()
{rectangle(0,0,getmaxx(),getmaxy());
line(0,20,getmaxx(),20);
linex=getmaxx()/2-20;
liney=getmaxy()-5;
setcolor(2);
line(linex,liney,linex+40,liney);
setcolor(15);
vvx=getmaxx()/2;
vvy=liney-5;
circle(vvx,vvy,4);
gotoxy(2,3);
printf("Input enter play\n");
line(0,20,0,70);
begin_guan();
gotoxy(1,3);
printf(" ");
gotoxy(1,3);
line(0,20,0,70);
}
/*----------------------------------------------------------------------------*/
void play1()
{int * gk,i;
rectangle(0,0,getmaxx(),getmaxy());
line(0,20,getmaxx(),20);
guanka();
for(i=0;i<len_arr();i++)
{shuai[i]=0;
}
/*画墙*/
for(i=0;i<(len_arr()*4);i+=4)
{setfillstyle(1,6);
gk=guanka();
bar(gk[i],gk[i+1],gk[i+2],gk[i+3]);
}
vvangle=45;
}
/*----------------------------------------------------------------------------*/
void play2()
{vtime=4000;
cleardevice();
initgr();
gotoxy(31,1);
printf("Welcome to here.");
gotoxy(65,1);
printf("grade:%d.",guan);
linex=getmaxx()/2-20;
liney=getmaxy()-5;
setcolor(2);
line(linex,liney,linex+40,liney);
setcolor(15);
vvx=getmaxx()/2;
vvy=liney-5;
circle(vvx,vvy,4);
play1();
begin_guan();
}
/*----------------------------------------------------------------------------*/
/*按"回车"后,游戏开始,乒乓球的移动*/
void move_begin()
{float vtan; /*保存tan()求出来的值*/
int vstep=1;/*x坐标每次移动的值*/
int ox=vvx,oy=vvy;/*用于在碰墙后改变方向的坐标old x,old y*/
int flag=1;/*标志,控制乒乓球的移动方向*/
int gk_flag=0;/*关卡标志。为1则进入下一关*/
int i;
vtan=1*tan(vvangle*PI);
do
{/*画球*/
/* getch(); */
if(flag==1)
{ox=vvx;
oy=vvy;
paint_ba(1,-1,1,vstep,vtan);
}
else if(flag==2)
{ox=vvx;
oy=vvy;
paint_ba(-1,-1,2,vstep,vtan);
}
else if(flag==3)
{ox=vvx;
oy=vvy;
paint_ba(-1,1,1,vstep,vtan);
}
else if(flag==4)
{ox=vvx;
oy=vvy;
paint_ba(1,1,2,vstep,vtan);
}
else if(flag==5)
{ox=vvx;
oy=vvy;
paint_ba(-1,1,1,vstep,vtan);
}
else if(flag==6)
{ox=vvx;
oy=vvy;
paint_ba(1,1,1,vstep,vtan);
}
else if(flag==7)
{ox=vvx;
oy=vvy;
paint_ba(1,-1,1,vstep,vtan);
}
else if(flag==8)
{ox=vvx;
oy=vvy;
paint_ba(-1,-1,1,vstep,vtan);
}
/*判断乒乓球碰到障碍物上*/
for(i=0;i<(len_arr()*4);i+=4)
{int f;/*碰到的是障碍物的那个边.1左3右2上4下.*/
int * gk,n=0;
int ret_arr[4];/*局部数组,一个方块的四个坐标值.*/
gk=guanka();
ret_arr[0]=gk[i];
ret_arr[1]=gk[i+1];
ret_arr[2]=gk[i+2];
ret_arr[3]=gk[i+3];
/*边:上,下,左,右*/
if(vvx>ret_arr[0] && vvx<ret_arr[2] && vvy>ret_arr[1]-4 && vvy<ret_arr[1]+4) f=1;
if(vvx>ret_arr[0] && vvx<ret_arr[2] && vvy>ret_arr[3]-4 && vvy<ret_arr[3]+4) f=2;
if(vvy>ret_arr[1] && vvy<ret_arr[3] && vvx>ret_arr[0]-4 && vvx<ret_arr[0]+4) f=3;
if(vvy>ret_arr[1] && vvy<ret_arr[3] && vvx>ret_arr[2]-4 && vvx<ret_arr[2]+4) f=4;
/*角:左上,右上,左下,右下*/
if(vvx>ret_arr[0]-4 && vvx<ret_arr[0]+4 && vvy>ret_arr[1]-4 && vvy<ret_arr[1]+4) f=5;
if(vvx>ret_arr[2]-4 && vvx<ret_arr[2]+4 && vvy>ret_arr[1]-4 && vvy<ret_arr[1]+4) f=6;
if(vvx>ret_arr[0]-4 && vvx<ret_arr[0]+4 && vvy>ret_arr[3]-4 && vvy<ret_arr[3]+4) f=7;
if(vvx>ret_arr[2]-4 && vvx<ret_arr[2]+4 && vvy>ret_arr[3]-4 && vvy<ret_arr[3]+4) f=8;
/*左右上下*/
if(vvx>gk[i]-4 && vvx<gk[i+2]+4 && vvy>gk[i+1]-4 && vvy<gk[i+3]+4)
{int j;
/*障碍物,反弹begin*/
if(shuai[i/4]==0)
{if(f==3)
{/*左*/
if(vvy<oy)
{flag=2;
}
else
{flag=5;
}
}
else if(f==4)
{/*右*/
if(vvy<oy)
{flag=7;
}
else
{flag=4;
}
}
else if(f==1)
{/*上*/
if(vvx<ox)
{flag=8;
}
else
{flag=1;
}
}
else if(f==2)
{/*下*/
if(vvx<ox)
{flag=3;
}
else
{flag=6;
}
}
/*四个角左上,右上,左下,右下*/
else if(f==5)
{flag=8;
}
else if(f==6)
{flag=7;
}
else if(f==7)
{flag=5;
}
else if(f==8)
{flag=6;
}
}/*障碍物,反弹end*/
setfillstyle(1,0);
gk=guanka();
bar(gk[i],gk[i+1],gk[i+2],gk[i+3]);
shuai[i/4]=1;/*被击落*/
/*判断是否进入下一关*/
for(j=0;j<len_arr();j++)
{if(shuai[j]==1)
{n++;/*n表示被击落的障碍物个数*/
}
}
/*是否全部击落*/