AllBoard.h
上传用户:kf1822
上传日期:2021-06-02
资源大小:2156k
文件大小:7k
- #include <graphics.h>
- #include "SetTime.h"
- typedef struct Board /* 板组子新类型 */
- {
- int x;
- int y;
- int speed; /* 板子的速度 */
- int chosse; /* 随即选择板子的类型标记量 */
- int isShow; /* 标记板子是否被描绘出来,主作用于用与会消失的板子 */
- int direct; /* 用于标记滑板滑动的方向 1-向右 0-向左 */
- int temp;
- int tempR; /* 标记滑板传送带向右运动 */
- int tempL; /* 标记滑板传送带向左运动 */
- int isChange; /* 标记板子的数值是否需要被改变 1-可被改变 0-不可被改变 */
- }Board;
- typedef struct ExpStar /* 爆炸板子专用 */
- {
- int x;
- int y;
- int tempX;
- int tempY;
- int vx;
- int vy;
- int isShow; /* 是否被描绘 */
- int signX; /* X方向标量 */
- int signY; /* Y方向标量 */
- }ExpStar;
- void drawSBoard(Board s) /* 画安全板 */
- {
- setfillstyle(1,YELLOW);
- bar(s.x,s.y,s.x+90,s.y+10); /* 安全板的长宽为91x11 */
- setcolor(BROWN);
- rectangle(s.x,s.y,s.x+90,s.y+10);
- }
- void drawTBoard(Board b) /* 话刺板 刺板由刺和板子组成 */
- {
- int xy[7][3][2]; /* 定义有21个点共21个X坐标21个Y坐标的数组 */
- int i;
- int j;
- int k;
- int temp;
- setfillstyle(1,WHITE); /* 话出刺板下的板子 */
- bar(b.x,b.y+5,b.x+90,b.y+10);
- for(i=0;i<7;i++) /* 根据传进来的b对21个点赋值 */
- {
- for(j=0;j<3;j++)
- {
- if(j==1)
- b.x=b.x+12;
- for(k=0;k<2;k++)
- {
- if(j<2)
- {
- if(k==0)
- xy[i][j][k]=b.x;
- else
- xy[i][j][k]=b.y+4;
- }
- else
- {
- if(k==0)
- xy[i][j][k]=b.x-6;
- else
- xy[i][j][k]=b.y;
- }
- }
- }
- b.x++;
- }
- for(i=0;i<7;i++) /* 画出刺板的刺 */
- {
- setfillstyle(1,RED);
- setcolor(WHITE);
- fillpoly(3,*xy[i]);
- }
- }
- void drawExpBoard(Board b) /* 画爆炸的板子 触碰引发爆炸 (explosive爆炸的) */
- {
- int i; /* 此紧画无爆炸状态下的爆炸板 */
- if(b.isShow==1)
- {
- setfillstyle(1,GREEN);
- bar(b.x,b.y,b.x+90,b.y+10);
- setcolor(RED);
- rectangle(b.x,b.y,b.x+90,b.y+10);
- for(i=0;i<7;i++)
- {
- setcolor(RED);
- line(b.x+12+i*13,b.y,b.x+i*13,b.y+10);
- }
- }
- }
- void initExpEdBoard(Board b,ExpStar s[],int n) /* 初始化已经爆炸的板子 */
- {
- int i;
- int temp;
- for(i=0;i<n;i++)
- {
- s[i].x=b.x+45;
- s[i].y=b.y+5;
- s[i].tempX=b.x;
- s[i].tempY=b.y;
- s[i].isShow=1;
- temp=rand()%10;
- if(temp<5)
- {
- s[i].signX=1;
- }
- else
- {
- s[i].signX=-1;
- }
- temp=rand()%10;
- if(temp<5)
- {
- s[i].signY=1;
- }
- else
- {
- s[i].signY=-1;
- }
- temp=rand()%2+1;
- s[i].vx=temp;
- temp=rand()%2+1;
- s[i].vy=temp;
- }
- }
- void moveExpEdBoard(ExpStar s[],int n)
- {
- int i;
- for(i=0;i<n;i++)
- {
- s[i].x=s[i].x+s[i].vx*s[i].signX;
- s[i].y=s[i].y+s[i].vy*s[i].signY;
- if(s[i].x<=s[i].tempX || s[i].x>=s[i].tempX+90 ||
- s[i].y<=s[i].tempY-20 || s[i].y>=s[i].tempY+28) /* 判断星星的位置是否超过限定范围 */
- {
- s[i].isShow=0; /* 如果上述成立 就改变该星星的isShow 让他不被描绘 */
- }
- }
- }
- void drawExpEdBoard(ExpStar s[],int n) /* 已经爆炸的板子 */
- {
- int i;
- for(i=0;i<n;i++)
- {
- if(s[i].isShow==1)
- {
- setfillstyle(1,RED);
- fillellipse(s[i].x,s[i].y,2,1);
- }
- }
- }
- void drawStrBoard(Board b) /* 有弹性的板子 (stretch有弹性的) */
- { /* 画原始状态下的弹板、在此视压缩状态为原始状态 */
- int i;
- setfillstyle(1,BLUE);
- bar(b.x,b.y,b.x+90,b.y+1);
- bar(b.x,b.y+9,b.x+90,b.y+10);
- for(i=0;i<3;i++)
- {
- setcolor(RED);
- line(b.x+16+i*26,b.y+2,b.x+10+i*26,b.y+5); /* 画压缩状态下弹簧的左半边 */
- line(b.x+10+i*26,b.y+5,b.x+16+i*26,b.y+8);
- line(b.x+21+i*26,b.y+2,b.x+27+i*26,b.y+5); /* 画压缩状态下弹簧的右半边 */
- line(b.x+27+i*26,b.y+5,b.x+21+i*26,b.y+8);
- }
- }
- void drawExtBoard(Board b) /* 画伸展状态下的弹板 (extend伸展) */
- {
- int i;
- setfillstyle(1,BLUE);
- bar(b.x,b.y-3,b.x+90,b.y-2);
- bar(b.x,b.y+9,b.x+90,b.y+10);
- for(i=0;i<3;i++)
- {
- setcolor(RED);
- line(b.x+16+i*26,b.y-1,b.x+16+i*26,b.y+8); /* 伸展状态下弹簧的左半边 */
- line(b.x+21+i*26,b.y-1,b.x+21+i*26,b.y+8); /* 伸展状态下弹簧的右半边 */
- }
- }
- void drawSlipBoard(Board b) /* 画滑动的板子 分为向左和向右滑动 */
- {
- setfillstyle(1,MAGENTA); /* 洋红 */
- bar(b.x,b.y,b.x+90,b.y+2);
- bar(b.x,b.y+8,b.x+90,b.y+10);
- if(b.direct==1) /* 模拟传送带向右运动 */
- {
- setfillstyle(1,LIGHTBLUE); /* 淡蓝色 */
- bar(b.x+b.tempR*13,b.y+3,b.x+b.tempR*13+12,b.y+7);
- }
- else /* 两者需用两个不同的时间中断分开运动 */
- {
- setfillstyle(1,LIGHTBLUE); /* 淡蓝色 */
- bar(b.x+b.tempL*13,b.y+3,b.x+b.tempL*13+12,b.y+7);
- }
- }
- void chooseBoard(Board b[],int n,int m) /* n为数组大小,m为循环i的起始值 */
- {
- int temp;
- int i;
- for(i=m;i<n;i++)
- {
- temp=rand()%100;
- if(temp<55)
- b[i].temp=0; /* 0代表平板 %55机会 */
- else if(temp<70)
- b[i].temp=1; /* 1代表滑板 %15机会 */
- else if(temp<85)
- b[i].temp=2; /* 2代表弹板 %15机会 */
- else if(temp<95)
- b[i].temp=3; /* 3代表爆炸板 %10机会*/
- else if(temp<100)
- b[i].temp=4; /* 4代表刺板 %5机会 */
- }
- }
- void initAllBoard(Board b[],int n,int m) /* m表示循环内i的起始值 */
- {
- int i;
- for(i=m;i<n;i++)
- {
- b[i].x=rand()%250+79; /* 随即给板子赋X值 因为游戏版面范围在79--418 */
- /* 考虑到板子的91长度问题 所以取值在79--328 */
- b[i].y=357;
- b[i].direct=rand()%2; /* 如果为滑板 随即为它取方向0-左或1-右 */
- b[i].isShow=1; /* 如果为爆炸板 先标示为未爆炸 */
- b[i].tempR=0;
- b[i].tempL=6;
- b[i].isChange=0;
- b[i].speed=1;
- }
- }
- void drawBoards(Board b) /* 根据b.temp选择要画的板子 */
- {
- switch(b.temp)
- {
- case 0:
- drawSBoard(b); /* 0代表平板 %55机会 */
- break;
- case 1:
- drawSlipBoard(b); /* 1代表滑板 %15机会 */
- break;
- case 2:
- drawStrBoard(b); /* 2代表弹板 %15机会 */
- break;
- case 3:
- drawExpBoard(b); /* 3代表爆炸板 %10机会 */
- break;
- case 4:
- drawTBoard(b); /* 4代表刺板 %5机会 */
- break;
- case 5: /* 当弹板被触发时 此变量才有效 */
- cleardevice();
- drawExtBoard(b); /* 弹板的伸展状态 */
- }
- }