📄 gameeng.txt
字号:
/******************************************************************/
/* 本游戏引擎由 黑科技_计算机05-2班_陈诚 独立开发完成,特此声明 */
/* 模块内容:游戏的控制,图形的绘制,事件的响应,队列的调用 */
/* (C) PhiL Cheng Soft 2007 */
/******************************************************************/
/*定义整个活动界面,其中:0为食物,1为空白可走处,2为蛇蛇身体,3为障碍物*/
int MAP[Map_Long][Map_Width]=
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,3,3,3,1,1,1,1,1,1,1,1,1,1,3,3,3,1,
1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,
1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,3,3,1,1,1,
1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,3,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,3,1,1,1,
1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,3,3,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,
1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,
1,1,1,3,3,3,1,1,1,1,1,1,1,1,1,1,3,3,3,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
};
typedef struct /*定义类型Snake,包括蛇蛇头的坐标,蛇的运动方向*/
{int HeadX;
int HeadY;
int DL; /* 方向:上0, 左1, 右2, 下3 */
int Hp; /* 蛇蛇的生命值,血量 */
int Grow; /* 蜕变控制参数,当蛇蛇长度到一定数值后,发生蜕壳 */
} Snake;
typedef struct /*定义食物类型Food,包括Food出现的坐标,颜色,剩余,总共*/
{int FoodX;
int FoodY;
int FoodCl; /*当前食物颜色*/
int FoodRm; /*当前剩余食物数量*/
int FoodAll; /*食物总共数量*/
}Food;
void GamePause() /*游戏暂停*/
{int key,i,OutPause;
OutPause=0;
i=5;
setfillstyle(1,12);
setcolor(12);
pieslice(88,377,0,360,10);
while (!OutPause)
{if (kbhit())
{key=bioskey(0);
if (key==PAUSE1 || key==PAUSE2)
{setfillstyle(1,LIGHTGREEN);
setcolor(LIGHTGREEN);
pieslice(88,377,0,360,10);
setcolor(BLACK);
outtextxy(270,420,"- PAUSE -");
OutPause=1;}
}
if(!OutPause)
{delay(20000);
i=(i==5)*6+5;
setcolor(i);
outtextxy(270,420,"- PAUSE -");
delay(20000);}
}
}
int ExitGame() /*退出游戏*/
{int i;
i=5;
setfillstyle(1,RED);
setcolor(RED);
pieslice(88,377,0,360,10);
setcolor(LIGHTGREEN);
line(88,377,98,377);
settextstyle(3,0,1);
while (!kbhit())
{delay(20000);
i=(i==5)*6+5;
setcolor(i);
outtextxy(200,420,"** Press [Enter] To Exit. **");
delay(20000);}
if (bioskey(0)==ENTER)
{setfillstyle(1,LIGHTGREEN);
setcolor(LIGHTGREEN);
pieslice(88,377,0,360,10);
return TRUE;}
else {setfillstyle(1,LIGHTGREEN);
setcolor(LIGHTGREEN);
pieslice(88,377,0,360,10);
setfillstyle(1,BLACK);
setcolor(BLACK);
bar(200,420,500,500);
return FALSE;}
}
void SetSpeed()
{setcolor(11);
setfillstyle(1,11);
outtextxy(110,410,"Set Game Speed With <= OR => :");
outtextxy(270,438,"+");
outtextxy(440,438,"-");
ScrollBar(280,445,10,1);
setcolor(BLACK);
setfillstyle(1,BLACK);
outtextxy(110,410,"Set Game Speed With <= OR => :");
outtextxy(270,438,"+");
outtextxy(440,438,"-");
}
void NextDL(Snake S,ElemType *next)/*计算出蛇蛇头部的下一步坐标,越界折反,保存到ElemType类型数据中*/
{
switch(S.DL)
{case 0: {next->Y = (S.HeadY-1+Map_Width) % Map_Width ;next->X=S.HeadX;break;}
case 1: {next->X = (S.HeadX-1+Map_Long) % Map_Long ;next->Y=S.HeadY;break;}
case 2: {next->X = (S.HeadX+1) % Map_Long ;next->Y=S.HeadY;break;}
case 3: {next->Y = (S.HeadY+1) % Map_Width;next->X=S.HeadX;break;}
}
}
void DLChange(Snake *S) /*键盘事件(包含运动方向改变)*/
{int key,i;
Snake tmpS;
ElemType tmpE[4];
tmpS.HeadX=S->HeadX;
tmpS.HeadY=S->HeadY;
for (i=0;i<4;i++)
{tmpS.DL=i;NextDL(tmpS,tmpE+i);}
if (kbhit())
{key=bioskey(0);
while(kbhit()) bioskey(0);
switch(key)
{case UP3: if(MAP[tmpE[0].X][tmpE[0].Y]!=2) S->DL=0;break;
case LEFT3: if(MAP[tmpE[1].X][tmpE[1].Y]!=2) S->DL=1;break;
case RIGHT3: if(MAP[tmpE[2].X][tmpE[2].Y]!=2) S->DL=2;break;
case DOWN3: if(MAP[tmpE[3].X][tmpE[3].Y]!=2) S->DL=3;break;
case UP1: if(MAP[tmpE[0].X][tmpE[0].Y]!=2) S->DL=0;break;
case LEFT1: if(MAP[tmpE[1].X][tmpE[1].Y]!=2) S->DL=1;break;
case RIGHT1: if(MAP[tmpE[2].X][tmpE[2].Y]!=2) S->DL=2;break;
case DOWN1: if(MAP[tmpE[3].X][tmpE[3].Y]!=2) S->DL=3;break;
case UP2: if(MAP[tmpE[0].X][tmpE[0].Y]!=2) S->DL=0;break;
case LEFT2: if(MAP[tmpE[1].X][tmpE[1].Y]!=2) S->DL=1;break;
case RIGHT2: if(MAP[tmpE[2].X][tmpE[2].Y]!=2) S->DL=2;break;
case DOWN2: if(MAP[tmpE[3].X][tmpE[3].Y]!=2) S->DL=3;break;
case PAUSE1: {GamePause();break;}
case PAUSE2: {GamePause();break;}
case ESC: if(ExitGame()) exit(0);break;
case SPACE: SetSpeed();break;}
}
}
void DrawSkHead(Snake S,ElemType next) /*画出蛇蛇的头*/
{setfillstyle(1,LIGHTGREEN);
setcolor(LIGHTGREEN);
bar ( BoxSize*S.HeadX+81 , BoxSize*S.HeadY+81 , BoxSize*(S.HeadX+1)+80,BoxSize*(S.HeadY+1)+80 );
setfillstyle(1,GREEN);
setcolor(GREEN);
bar ( BoxSize*next.X+81 , BoxSize*next.Y+81 , BoxSize*(next.X+1)+80,BoxSize*(next.Y+1)+80 );
}
int Crash(ElemType next)
{if (MAP[next.X][next.Y]==2 || MAP[next.X][next.Y]==3) return TRUE;
else return FALSE;
}
void HeadToQ(Snake S,CirQueue *pQSnake) /*蛇蛇的头坐标入队列*/
{ElemType tmp;
tmp.X=S.HeadX;
tmp.Y=S.HeadY;
EnQueue(pQSnake,tmp);
}
void ClearAndOut(CirQueue *pQSnake) /*蛇蛇的尾巴出队列,并且清除*/
{ElemType tmp;
DeQueue(pQSnake,&tmp);
MAP[tmp.X][tmp.Y]=1;
setfillstyle(1,BLACK);
setcolor(BLACK);
bar ( BoxSize*tmp.X+81 , BoxSize*tmp.Y+81 , BoxSize*(tmp.X+1)+80,BoxSize*(tmp.Y+1)+80 );
}
void Slough(CirQueue *pQSnake) /*蛇蛇的蜕壳事件*/
{ElemType tmp;
while(QueueLength(*pQSnake)>3)
{DeQueue(pQSnake,&tmp);
MAP[tmp.X][tmp.Y]=3;
setfillstyle(1,BLACK);
setcolor(BLACK);
bar ( BoxSize*tmp.X+81 , BoxSize*tmp.Y+81 , BoxSize*(tmp.X+1)+80,BoxSize*(tmp.Y+1)+80 );
setfillstyle(INTERLEAVE_FILL,6);
setcolor(6);
bar3d (BoxSize*tmp.X+81 , BoxSize*tmp.Y+82 , BoxSize*(tmp.X+1)+78,BoxSize*(tmp.Y+1)+80,2,1 );}
}
int GetRand(int a) /*产生一个随机数,0~a内*/
{int rand_num;
rand_num=rand()%(a+1);
return rand_num;
}
void FoodArise(Food *pfood) /*随机位置产生一个食物*/
{int x,y;
x=GetRand(Map_Long-1);
y=GetRand(Map_Width-1);
while(MAP[x][y]!=1)
{x=GetRand(Map_Long-1);
y=GetRand(Map_Width-1);}
MAP[x][y]=0;
setcolor(RED);
setfillstyle(1,RED);
pieslice ( BoxSize*x+87 , BoxSize*y+87 , 0,360,5 );
pfood->FoodX=x;
pfood->FoodY=y;
pfood->FoodCl=RED;
pfood->FoodRm --;
}
void ShowMap() /*地图显示*/
{int i,j;
for(i=0; i<Map_Long;i++)
{for (j=0;j<Map_Width;j++)
{ if (MAP[i][j]==3)
{setfillstyle(INTERLEAVE_FILL,6);
setcolor(6);
bar3d (BoxSize*i+81 , BoxSize*j+82 , BoxSize*(i+1)+78,BoxSize*(j+1)+80,2,1 );}}
}
}
void GameIni(Snake *S,CirQueue *pQSnake,Food *pFood) /*游戏初始,蛇蛇的尾、身、头依次入队*/
{
ElemType Shead,Sbody,Srear;
srand((unsigned) time(NULL));
S->DL=2;
S->Hp=100;
S->Grow=100;
Shead.X=S->HeadX=11;
Shead.Y=S->HeadY=8;
Sbody.X=10;
Sbody.Y=8;
Srear.X=9;
Srear.Y=8;
MAP[Shead.X][Shead.Y]=2;
MAP[Sbody.X][Sbody.Y]=2;
MAP[Srear.X][Srear.Y]=2;
EnQueue(pQSnake,Srear);
EnQueue(pQSnake,Sbody);
EnQueue(pQSnake,Shead);
setfillstyle(1,GREEN); /*把蛇蛇的头、身、尾画出来*/
setcolor(GREEN);
bar ( BoxSize*(S->HeadX)+81 , BoxSize*(S->HeadY)+81 , BoxSize*(S->HeadX+1)+80,BoxSize*(S->HeadY+1)+80 );
setfillstyle(1,LIGHTGREEN);
setcolor(LIGHTGREEN);
bar ( BoxSize*Sbody.X+81 , BoxSize*Sbody.Y+81 , BoxSize*(Sbody.X+1)+80,BoxSize*(Sbody.Y+1)+80 );
bar ( BoxSize*Srear.X+81 , BoxSize*Srear.Y+81 , BoxSize*(Srear.X+1)+80,BoxSize*(Srear.Y+1)+80 );
pFood->FoodAll=200;
pFood->FoodRm=pFood->FoodAll+1;
ShowMap();
FoodArise(pFood);
}
void GameProcess(int a) /*游戏进度显示*/
{setcolor(6);
setfillstyle(1,6);
if(a)
{bar(441,374,440+a,379);
setcolor(7);
line (442,380,441+a,380);
line (441+a,375,441+a,380);}
}
void D_Time(long dtime,Food *pf,int changecl) /*延时和食物闪烁*/
{long half=dtime/2;
if (changecl)
{if (pf->FoodCl==RED) pf->FoodCl=BLUE;
else if (pf->FoodCl==BLUE) pf->FoodCl=GREEN;
else if (pf->FoodCl==GREEN) pf->FoodCl=RED;
setcolor(pf->FoodCl);
setfillstyle(1,pf->FoodCl);
pieslice (BoxSize*(pf->FoodX)+87,BoxSize*(pf->FoodY)+87,0,360,5);}
delay(half);
if (changecl)
{if (pf->FoodCl==RED) pf->FoodCl=BLUE;
else if (pf->FoodCl==BLUE) pf->FoodCl=GREEN;
else if (pf->FoodCl==GREEN) pf->FoodCl=RED;
setcolor(pf->FoodCl);
setfillstyle(1,pf->FoodCl);
pieslice (BoxSize*(pf->FoodX)+87,BoxSize*(pf->FoodY)+87,0,360,5);}
delay(half);
}
void HpAndGp (int ps_hp,int ps_gp) /*生命、蜕壳进度显示*/
{int ha,hb;
float hp_high,gp_high;
hp_high=ps_hp*1.87;
gp_high=ps_gp*1.87;
ha=hp_high;
hb=gp_high;
setcolor(BLACK);setfillstyle(1,BLACK);
bar(27,112,38,298);
if (ha!=0)
{setcolor(12);setfillstyle(1,12);
bar (28,299-ha,30,298);
bar (35,299-ha,37,298);
if(ha>1)
{line(27,300-ha,27,297);
line(38,300-ha,38,297);}
}
if (hb!=0)
{setcolor(YELLOW);setfillstyle(1,YELLOW);
bar(31,112,34,111+hb);}
}
void LongToChar(long d,char *p)/*长整型数转成字符串*/
{
char buf[16];
char *pbuf=buf;
if(d<0){d=-d;*p++='-';}
do {*pbuf++=(d%10)+'0';
d/=10;}
while(d);
pbuf--;
while(pbuf>=buf) {*p++ = *pbuf--;}
*p=0;
}
void ShowScore(long speed)/*游戏分数显示*/
{char score[16];
LongToChar(speed,score);
setcolor(BLACK);
setfillstyle(1,BLACK);
bar(180,365,345,390);
setcolor(11);
setfillstyle(1,11);
outtextxy(180,365,score);
}
void Victory() /*游戏胜利通关后,显示该对话框*/
{int i;
setcolor(WHITE);
setfillstyle(1,WHITE);
for (i=0;i<70;i++)
{setcolor(WHITE);
bar(255-i,190-i,255+3*i,190+i);
setcolor(11);
rectangle(255-i,190-i,255+3*i,190+i);
rectangle(254-i,189-i,256+3*i,191+i);
delay(8000);}
setcolor(RED);
setfillstyle(1,RED);
outtextxy(205,120,"********* Victory **********");
outtextxy(205,140," Thanks For Playing ! ");
outtextxy(205,160," Program Design: PhiLCheng");
outtextxy(205,180," QQ:260508801");
outtextxy(205,200," E: philcheng001@126.com");
outtextxy(212,220,"(C) PhiL Cheng Soft 2007");
while(kbhit()) bioskey(0);
bioskey(0);
}
void FaiL() /*游戏失败后,显示该对话框*/
{int i;
setcolor(WHITE);
setfillstyle(1,WHITE);
for (i=0;i<70;i++)
{setcolor(WHITE);
bar(255-i,190-i,255+3*i,190+i);
setcolor(11);
rectangle(255-i,190-i,255+3*i,190+i);
rectangle(254-i,189-i,256+3*i,191+i);
delay(8000);}
setcolor(BLUE);
setfillstyle(1,BLUE);
outtextxy(205,120,"********* FaiL **********");
outtextxy(205,140," Thanks For Playing ! ");
outtextxy(205,160," Program Design: PhiLCheng");
outtextxy(205,180," QQ:260508801");
outtextxy(205,200," E: philcheng001@126.com");
outtextxy(212,220,"(C) PhiL Cheng Soft 2007");
while(kbhit()) bioskey(0);
bioskey(0);
}
void GameMain() /*游戏的主控制,进入游戏后,跳转到此执行程序*/
{int i,food_score;
long score=0,Speed,sp;
float process;
Snake snake;
CirQueue QSnake;
ElemType NextSite;
Food food;
InitQueue(&QSnake);
food_score=2;
Speed=SlBar_item*5000;
sp=0;
GameIni(&snake,&QSnake,&food);
ShowScore(score);
process=(float)(food.FoodAll-(food.FoodRm))/(float)food.FoodAll*100;
i=process;
GameProcess(i);
bioskey(0);
while(1)
{
DLChange(&snake);/*按键改变运行方向*/
Speed=SlBar_item*5000+sp;
NextDL(snake,&NextSite);
if(Crash(NextSite)) /*如果碰到障碍物、或身体*/
{snake.Hp-=1;D_Time(Speed/4,&food,TRUE);
if (snake.Hp<1)
{snake.Hp=0;HpAndGp (snake.Hp,snake.Grow);FaiL();exit(0);}
else {HpAndGp (snake.Hp,snake.Grow);continue;}
}
DrawSkHead(snake,NextSite);
snake.HeadX=NextSite.X;
snake.HeadY=NextSite.Y;
HeadToQ(snake,&QSnake);/*蛇蛇头入队列尾*/
D_Time(Speed,&food,FALSE);
if(!MAP[snake.HeadX][snake.HeadY]) /*如果地图元素为食物*/
{MAP[NextSite.X][NextSite.Y]=2;
FoodArise(&food);
process=(float)(food.FoodAll-(food.FoodRm))/(float)food.FoodAll*100;
i=process;GameProcess(i);
score+=food_score;
ShowScore(score);
snake.Grow-=2;
if(snake.Hp<99) snake.Hp+=2;
if (snake.Grow<1) snake.Grow=0;
if (!snake.Grow)
{snake.Grow=100;snake.Hp=100;
food_score++;Slough(&QSnake);
if (Speed>=15000) sp-=2500;}
HpAndGp (snake.Hp,snake.Grow);
}
else {MAP[NextSite.X][NextSite.Y]=2;ClearAndOut(&QSnake);}/*如果没吃到食物,蛇蛇尾巴(队列头)出队*/
D_Time(Speed,&food,TRUE);
if(!food.FoodRm) {Victory();break;} /*胜利*/
GameProcess(process);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -