[原创]用C++(TC3.0)做的贪吃蛇游戏---(2)

类别:编程语言 点击:0 评论:0 推荐:

//**画蛇的相关类,实现时并没有用到多态性**//
class AbstractDraw{
public:
 virtual void Draw(int x,int y)=0;
};
class Drawhead:public AbstractDraw{
public:
 void Draw(int x,int y);
};
class Drawbody:public AbstractDraw{
public:
 void Draw(int x,int y);
 };
class Cleantail:public AbstractDraw{
public:
 void Draw(int x,int y);
};

class DrawBean:public AbstractDraw{
public:
 void Draw(int x,int y);
};
 

void Drawhead::Draw(int x,int y){
 SuperCol Brush;
 int sx,sy;
 sx=getmaxx()/2-19*fudu;sy=getmaxy()/2-14*fudu;
 Brush.circle3(sx+(x+0.5)*fudu,sy+(y+0.5)*fudu,fudu/2,BLUE,RED);
 }
void Drawbody::Draw(int x,int y){
 SuperCol Brush;
 int sx,sy;
 sx=getmaxx()/2-19*fudu;sy=getmaxy()/2-14*fudu;
 Brush.bar2(sx+x*fudu,sy+y*fudu,sx+(x+1)*fudu,sy+(y+1)*fudu,BLUE);
 }
void Cleantail::Draw(int x,int y){
 SuperCol Brush;
 int sx,sy;
 sx=getmaxx()/2-19*fudu;sy=getmaxy()/2-14*fudu;
 Brush.bar2(sx+x*fudu,sy+y*fudu,sx+(x+1)*fudu,sy+(y+1)*fudu,BLACK);
 }
void DrawBean::Draw(int x,int y){
 SuperCol Brush;
 int sx,sy;
 sx=getmaxx()/2-19*fudu;sy=getmaxy()/2-14*fudu;
 Brush.circle3(sx+(x+0.5)*fudu,sy+(y+0.5)*fudu,fudu/2,YELLOW,WHITE);
}

//* /*负责图形函数的起始与静态场景的绘制*/  *//
class ScreenLayOut{
 public:
  void GraphicStart();
  void GraphicEnd();
  void ErrorDetect();
  void test();
 };

void ScreenLayOut::GraphicStart(){
 int gdriver,gmode;
 gdriver=DETECT;
 gmode=VGAHI;
 //Kinitgraph(&gdriver,&gmode,"D:\\TC\\BGI");//Bgi's address shoud be compitabled with Source File
 initgraph(&gdriver,&gmode,address);
 cleardevice();//Haha Got it!!!
 }
void ScreenLayOut::GraphicEnd(){
       closegraph();
       }
void ScreenLayOut::ErrorDetect(){
 int errorcode=0;
 errorcode = graphresult();
        if (errorcode != grOk)  /* an error occurred */
        {
    GameStatur=Exit;
    printf("Graphics error: %s\n", grapherrormsg(errorcode));
    printf("Press any key to halt:");
    getch();
        }
 }
void ScreenLayOut::test(){
;
 }

class Snake{//核心的蛇类
 public:
  void Insert(Snake *now);
  void DirChan();
  void CheckEatSelf();
  void CheckEatBean();
  Snake(){
   mx=0;my=0;mdir=Right;next=NULL;
  }
  Snake(int x,int y,Direction dir,Snake *s=NULL){
   mx=x;
   my=y;
   mdir=dir;
   next=s;
  }
  void show();
  //void Bianli();
  int getx(){return mx;}
  int gety(){return my;}
  int getdir(){return mdir;}
  void setdir(Direction p){mdir=p;
      DirChan(); }
  void Bianlidir();//精->遍链表并改变相关变量值的函数
     bool EatSelf();
  //void SetTail(){this->next=NULL;}
  bool HitWall();//碰墙检测
     void MakeNewBean(Obstacle Ob[],int num,Bean &tmpD);//产生新豆
  bool HitBrack(Obstacle Ob[],int num);//碰障碍物检测
     bool GotBean(Bean dou);//吃到豆子的检测

 private:
  int mx;
  int my;
  Direction mdir;
  Snake *next;
//here you didn't use  new/delete ,which is surely a hidden dangerous.
//As a beginner ,I forgive you.
};
void Snake::show(){
cout<<" x: "<<mx<<" y: "<<my<<" dir "<<mdir<<" -> ";
if(next)next->show();
else cout<<"End\n";
}
void Snake::DirChan(){
 switch(this->mdir){
 case Up:this->my--;break;
 case Down:this->my++;break;
 case Left:this->mx--;break;
 case Right:this->mx++;break;
 default:break;
}
}
void Snake::Insert(Snake *now){
 now->next=this->next;//注意了,now 的内部是可以访问的,这给没有友元的TC带来很大的方便.
 this->next=now;
 now->mx=this->mx;now->my=this->my;now->mdir=this->mdir;
    // cout<<(now->next==NULL);
 DirChan();//yes
}

void Snake::Bianlidir(){//from tail to head ,not head to tail
    if(next){
 next->Bianlidir();
 next->mdir=this->mdir;
 next->DirChan();
 }
}
bool Snake::EatSelf(){
 bool flag=false;
 Snake *pTmp=NULL;
 if(next){
 for(pTmp=next;pTmp!=NULL;pTmp=pTmp->next)
 {if((this->getx()==pTmp->getx())&&(this->gety()==pTmp->gety()))
  {
  flag=true;
  break;
  }
 }
 }
 return flag;
}
bool Snake::HitWall(){
 bool flag=false;
 //Bad smell,for the bare number!.
 if((this->mx<0)||(this->mx>37)||(this->my<0)||(this->my>27))
 {
 flag=true;
 
 }
 return flag;
}
void Snake::MakeNewBean(Obstacle Ob[],int num,Bean &tmpD){
 bool flag=true;
 int i=0,j=0,dx=0,dy=0;
    Snake *pTmp=NULL;
 int tmpArray[38][28];
 for(i=0;i<38;i++){
  for(j=0;j<28;j++){
   tmpArray[i][j]=0;
   }
  }
    randomize();
    for(i=0;i<num;i++){
  if(Ob[i].flag){
      tmpArray[Ob[i].x][Ob[i].y]=1;
    
      }
 }
    if(next){
      for(pTmp=next;pTmp!=NULL;pTmp=pTmp->next)
   {
   tmpArray[pTmp->getx()][pTmp->gety()]=1;
   }
   }
    flag=false;
    while(!flag)
    {dx=random(35)+1;
     dy=random(25)+1;
    // cout<<"dx"<<dx;
    if(tmpArray[dx][dy]==0){
    tmpD.x=dx;
    tmpD.y=dy;
    flag=true;
      }

  }
gotoxy(2,2);
printf("Score:%d",Score);
Score++;
}

bool Snake::HitBrack(Obstacle Ob[],int num)
{       bool flag=false;
     int i=0 ;
  for(i=0;i<num;i++){
  if(Ob[i].flag){
   if((Ob[i].x==this->getx())&&(Ob[i].y==this->gety()))flag=true;
   }
  }
  return flag;
}

bool Snake::GotBean(Bean dou){
//Consider a multiple beans mode?Too complicated ,maybe.
   bool flag=false;
   if((dou.x==this->getx())&&(dou.y==this->gety()))flag=true;
   return flag;
}

本文地址:http://com.8s8s.com/it/it23606.htm