⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameeng.txt

📁 数据结构课程设计 描述如下: 现有一个大小为Map_Long * Map_Width的方格地图(每一方格尺寸为BoxSize * BoxSize)
💻 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 + -