Game.h
上传用户:kf1822
上传日期:2021-06-02
资源大小:2156k
文件大小:10k
- #include <stdlib.h>
- #include "Back.h"
- #include "Human.h"
- #include "Word.h"
- #define VK_LEFT 0x4b00
- #define VK_RIGHT 0x4d00
- #define VK_SPACE 0x3920
- #define VK_ESC 0x011b
- void game() /* 目前等同与Game函数 */
- {
- int temp;
- int i;
- int tempY; /* 用于标示两个板子之间的距离 */
- int countBo; /* 作用与判断板子是否能的修改的一个辅助标量 */
- int key;
- int count=0; /* 标记Human的颜色何时需要被修改 */
- int countT=0;/* 标记Human的颜色何时需要被修改 */
- int tempHu=0; /* 用与标记该描绘1-Human 还是 0-Human1 */
- int tempBo; /* 用来标记弹板伸缩变化的标量 */
- int isCarry;
- int begin=0; /* 爆炸 0-没开始 1-开始 */
- int end=0; /* 爆炸结束标记量 */
- int gameStyle=0; /* 游戏界面转换标量 0-开始界面 1-游戏截面 2-游戏结束截面 */
- int select=1; /* 游戏开始界面选择star 和 exit 的标量 1-start 0-exit */
- int color[2]={5,7};
- int pr=0; /* 层数标记 */
- int speed=3; /* 全局速度变化量 */
- int page=0;
- int isChange=0; /* 标示画面是否被改变了 */
- Human h;
- Board b[7];
- Thorn t[34];
- ExpStar st[20];
- stars s[70];
- randomize();
- initThorn(t,34);
- initStars(s,70);
- while(1)
- {
- timeCounter++;
- if(bioskey(1))
- key=bioskey(0);
- else
- key=0;
- switch(key)
- {
- case VK_LEFT:
- if(gameStyle!=1)
- {
- if(select==0)
- select=1;
- }
- if(gameStyle==1)
- {
- count++;
- if(count%2==1) /* 当按LEFT键的次数为双数时 颜色才需要改变一次 */
- {
- leftHuman(&h);
- }
- if(h.speed>0)
- {
- h.speed=-1*h.speed;
- }
- moveHuman(&h);
- if(h.x-7<=79)
- {
- h.x=86;
- }
- if(tempHu==1)
- {
- tempHu=0;
- }
- else /* 在此对Human的两个图象进行交替描绘 以模拟旋转状态 */
- {
- tempHu=1;
- }
- if(tempHu==0)
- countT=0;
- else
- countT=1;
- }
- break;
- case VK_RIGHT:
- if(gameStyle!=1)
- {
- if(select==1)
- select=0;
- }
- if(gameStyle==1)
- {
- countT++; /* 当按RIGHT键的次数为单数时 颜色才需要被改变一次 */
- if(countT%2==0)
- {
- rightHuman(&h);
- }
- if(h.speed<0)
- {
- h.speed=-1*h.speed;
- }
- moveHuman(&h);
- if(h.x+7>=418)
- {
- h.x=411;
- }
- if(tempHu==1)
- {
- tempHu=0;
- }
- else /* 在此对Human的两个图象进行交替描绘 以模拟旋转状态 */
- {
- tempHu=1;
- }
- if(tempHu==1)
- count=1;
- else
- count=0;
- }
- break;
- case VK_SPACE:
- if(gameStyle!=1)
- {
- if(select==1)
- {
- isChange=1;
- setfillstyle(1,BLACK);
- bar(0,0,639,349);
- initAllBoard(b,7,0);
- drawDoor();
- b[0].isChange=1; /* 初始状态下先让第一个板子可以上升 */
- b[0].y=340; /* 让第一块板子从340这个Y坐标开始 因为考虑到Human在开始时在第一块板上出现 */
- b[0].temp=0; /* 让第一块板子为普通板 */
- initHuman(&h,b[0]);
- h.isCarry=1;
- gameStyle=1; /* 进入游戏界面 */
- h.life=10;
- pr=0;
- speed=3;
- }
- else
- return;
- }
- break;
- case VK_ESC:
- return;
- }
- setactivepage(page);
- if(isChange==1)
- {
- setfillstyle(1,BLACK);
- bar(0,0,639,349);
- isChange=2;
- }
- if(gameStyle!=1)
- {
- if(gameStyle==0)
- {
- drawMainBoard();
- beginBack(color,2);
- }
- if(gameStyle==2)
- {
- if(isChange==2)
- {
- setfillstyle(1,BLACK);
- bar(0,0,639,349);
- isChange=0;
- }
- endBoard();
- }
- if(select==1)
- {
- setfillstyle(1,BLACK);
- bar(407,231,444,236);
- setfillstyle(1,GREEN);
- bar(175,231,212,236);
- }
- else
- {
- setfillstyle(1,BLACK);
- bar(175,231,212,236);
- setfillstyle(1,GREEN);
- bar(407,231,444,236);
- }
- setcolor(RED);
- rectangle(175,231,212,236);
- setcolor(RED);
- rectangle(407,231,444,236);;
- }
- if(gameStyle==1)
- {
- setfillstyle(1,BLACK);
- bar(79,0,418,349);
- drawThorn(t,34);
- drawAllStars(s,70);
- drawPrBoard(pr); /* 记层数牌 */
- drawLife(h.life); /* 记生命牌 */
- if(begin==1)
- {
- drawExpEdBoard(st,20);
- for(i=0;i<20;i++)
- {
- if(st[i].isShow==0)
- end++;
- if(end==20) /* 当所有的爆炸星星都消失后 爆炸结束 */
- {
- begin=0;
- end=0;
- }
- }
- }
- for(i=0;i<7;i++)
- {
- drawBoards(b[i]);
- }
- if(tempHu==1) /* 当无按键状态时 保持Human最后状态 无须交替状态 */
- drawHuman1(h);
- else
- drawHuman(h);
- }
- if(timeCounter>speed) /* 速度会改变的用这个时间中断 */
- {
- timeCounter=0;
- if(gameStyle==0)
- {
- changeColor(color,2);
- }
- if(gameStyle==1)
- {
- tempY=rand()%40+40; /* 标示板与板之间的距离为随即的14--24 (考虑到板子厚度) */
- for(i=0;i<7;i++)
- {
- if(b[i].temp==5)
- {
- b[i].temp=2;
- }
- }
- for(i=0;i<70;i++) /* 移动星星 */
- {
- if(s[i].py>=353)
- s[i].py=0;
- s[i].py++;
- }
- for(i=0;i<7;i++)
- {
- if(b[i].isChange==1)
- {
- b[i].y=b[i].y-b[i].speed; /* 板子的移动Y坐标变化量 */
- b[i].tempL--; /* 滑板传送带向左移动的速度变化和范围 */
- if(b[i].tempL<0)
- b[i].tempL=6;
- b[i].tempR++; /* 滑板传送带向右移动的速度变化和范围 */
- if(b[i].tempR>=7)
- b[i].tempR=0;
- }
- if(i==6) /* 判断第一块板子在最后一块板子下面的情况 */
- {
- countBo=0;
- }
- else
- {
- countBo=i+1;
- }
- if(b[countBo].y-b[i].y>=tempY) /* 判断前一个板子与后一个板子的距离是否在限定范围内 */
- {
- b[countBo].isChange=1;
- }
- }
- for(i=0;i<7;i++)
- {
- if(b[i].y<=62) /* 46为游戏界面刺的起始Y坐标 */
- {
- pr++;
- if(pr%5==0) /* 5块板子为一个速度等级的跳跃 */
- {
- if(speed>0) /* 实际速度等级只有3个级别 当speed为0时最高 */
- speed--;
- }
- chooseBoard(b,i+1,i); /* 如果发现有板子移动超过上述范围 */
- initAllBoard(b,i+1,i); /* 就重新选择板子类型并且给该板子重新赋初始值 */
- }
- }
- carryHuman(&h,b,7);
- h.y=h.y+h.vy;
- h.x=h.x+h.vx;
- if(h.y<=68) /* 加上半径小于刺的下端 */
- {
- h.vy=5;
- h.isCarry=0;
- h.life=h.life-3;
- }
- if(h.y>=349 || h.life<1) /* 判断游戏结束 */
- {
- setfillstyle(1,BLACK);
- bar(0,0,639,349);
- gameStyle=2; /* 当游戏结束了以后 进入游戏结束画面 */
- }
- if(h.time==7) /* 记时10次 爆炸引发*/
- {
- b[h.isCarry-1].isShow=0; /* 爆炸开始 无爆炸状态下的爆炸板子就不用描绘了 */
- h.time=0; /* 记时还原 */
- initExpEdBoard(b[h.isCarry-1],st,20);
- h.isCarry=0; /* Human变为无承载状态 开始下落 */
- begin=1;
- }
- if(begin==1)
- {
- moveExpEdBoard(st,20);
- }
- }
- }
- page=(page+1)%2;
- setvisualpage(page);
- }
- /*killTimer();*/
- }