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

📄 move.cpp

📁 2D即时战略游戏VC源码
💻 CPP
字号:
#include"basic.h"	      


//extern myarmy *soldier;
//extern TABLE table[34][34];

POINT GoThere(Around ar,int dir)
{POINT delta;
 delta.x=0;
 delta.y=0;

 if(dir>15)dir=dir-16;
 else if(dir<0)dir=dir+16;
 switch(dir)
  {case EAST:
   case EASTSOUTH:
	    if(ar.ee<HILL)
          delta.x++;
        break;
   case SOUTH:
   case WESTSOUTH: 
		if(ar.ss<HILL)
          delta.y++;
		break;
   case WEST:
   case WESTNORTH:
	   if(ar.ww<HILL)
          delta.x--;
	   break;
   case NORTH:
   case EASTNORTH:
	    if(ar.nn<HILL)
          delta.y--;
		break;
}
return(delta);

}

BOOL AllCan(Around ar)
{if((ar.es<HILL)&&(ar.sw<HILL)&&(ar.wn<HILL)&&(ar.ne<HILL))
   return TRUE;
 else return FALSE;
}

BOOL CanGo(Around ar,int direct)
{switch(direct)
{case 1://east
	 if((ar.ee<HILL))
		 return(TRUE);
	 break;
case 16://es
	 if((ar.es<HILL)&&(ar.ee<HILL)&&(ar.ss<HILL))
		 
		 return(TRUE);
	 break;
case 2://s
	 if((ar.ss<HILL))
		 return(TRUE);
	 break;
case 32://sw
	 if((ar.sw<HILL)&&(ar.ss<HILL)&&(ar.ww<HILL))
		 return(TRUE);
	 break;
case 4://w
	 if((ar.ww<HILL))
		
		 return(TRUE);
	 break;
case 64://wn
	 if((ar.wn<HILL)&&(ar.ww<HILL)&&(ar.nn<HILL))
		 return(TRUE);
	 break;
case 8://n
	 if((ar.nn<HILL))
		 return(TRUE);
	 break;
case 128://ne
	 if((ar.ne<HILL)&&(ar.nn<HILL)&&(ar.ee<HILL))
		 
		 return(TRUE);
	 break;
}

return(FALSE);
}


BOOL Beyond(myarmy *soldier)
{//int dir=DecideDect(soldier->firstdot,soldier->placetogo);
 
   {if(soldier->nowdir==1)
     {if(((soldier->nowHL.y-soldier->firstdot.y)*
	    (soldier->placetogo.x-soldier->firstdot.x))>=
		((soldier->nowHL.x-soldier->firstdot.x)*
	    (soldier->placetogo.y-soldier->firstdot.y))
		&&
		(((soldier->nowHL.y>=soldier->firstdot.y)&&
		(soldier->nowHL.y<=soldier->placetogo.y))||
		((soldier->nowHL.y<=soldier->firstdot.y)&&
		(soldier->nowHL.y>=soldier->placetogo.y))))
		return TRUE;
     }
    else if(soldier->nowdir==-1)
     {if(((soldier->nowHL.y-soldier->firstdot.y)*
	    (soldier->placetogo.x-soldier->firstdot.x))<=
		((soldier->nowHL.x-soldier->firstdot.x)*
	    (soldier->placetogo.y-soldier->firstdot.y))
		&&
		(((soldier->nowHL.y>=soldier->firstdot.y)&&
		(soldier->nowHL.y<=soldier->placetogo.y))||
		((soldier->nowHL.y<=soldier->firstdot.y)&&
		(soldier->nowHL.y>=soldier->placetogo.y))))
		return TRUE;
     }



    }



 return FALSE;
}

int const  Xnum=66;
int const Ynum=66;
POINT Howtogo(POINT nowHL,int dect,POINT objectplace,myarmy *soldier,TABLE table[Xnum][Ynum])
{POINT placetogo=nowHL; 
 Around ar;
 if(soldier->size<BS)
 {ar.nn=table[nowHL.x+1][nowHL.y].whatin;
 ar.ne=table[nowHL.x+2][nowHL.y].whatin; 
 ar.ee=table[nowHL.x+2][nowHL.y+1].whatin;
 ar.es=table[nowHL.x+2][nowHL.y+2].whatin;
 ar.ss=table[nowHL.x+1][nowHL.y+2].whatin;
 ar.sw=table[nowHL.x][nowHL.y+2].whatin;
 ar.ww=table[nowHL.x][nowHL.y+1].whatin;
 ar.wn=table[nowHL.x][nowHL.y].whatin;
 }
 else if(soldier->size>=BS)
 {if((table[nowHL.x+1][nowHL.y].whatin<HILL)&&(table[nowHL.x+2][nowHL.y].whatin<HILL)) 
     ar.nn=0;
  else if ((table[nowHL.x+1][nowHL.y].whatin==CAR)&&(table[nowHL.x+2][nowHL.y].whatin==CAR)) 
  {if((table[nowHL.x+1][nowHL.y].CarOb->state==WALK)||
      (table[nowHL.x+2][nowHL.y].CarOb->state==WALK)) 
	  ar.nn=CAR;
   else ar.nn=HILL;
  }
  else	  ar.nn=HILL;



  if((table[nowHL.x+2][nowHL.y].whatin<HILL)
	  &&(table[nowHL.x+3][nowHL.y].whatin<HILL)
	  &&(table[nowHL.x+3][nowHL.y+1].whatin<HILL))
     ar.ne=0;
  else if((table[nowHL.x+2][nowHL.y].whatin==CAR)
	  &&(table[nowHL.x+3][nowHL.y].whatin==CAR)
	  &&(table[nowHL.x+3][nowHL.y+1].whatin==CAR))
     {if((table[nowHL.x+2][nowHL.y].CarOb->state==WALK)
	  ||(table[nowHL.x+3][nowHL.y].CarOb->state==WALK)
	  ||(table[nowHL.x+3][nowHL.y+1].CarOb->state==WALK))
	      ar.ne=CAR;
      else ar.ne=HILL;
     }
  else ar.ne=HILL;



 if((table[nowHL.x+3][nowHL.y+1].whatin<HILL)&&(table[nowHL.x+3][nowHL.y+2].whatin<HILL)) 
     ar.ee=0;
  else if((table[nowHL.x+3][nowHL.y+1].whatin==CAR)&&(table[nowHL.x+3][nowHL.y+2].whatin==CAR)) 
  {if((table[nowHL.x+3][nowHL.y+1].CarOb->state==WALK)||
   (table[nowHL.x+3][nowHL.y+2].CarOb->state==WALK)) 
     ar.ee=CAR; 
  else ar.ee=HILL;
  }
 else ar.ee=HILL;
 




   if((table[nowHL.x+3][nowHL.y+3].whatin<HILL)
	  &&(table[nowHL.x+3][nowHL.y+2].whatin<HILL)
	  &&(table[nowHL.x+2][nowHL.y+3].whatin<HILL))
     ar.es=0;
   else if((table[nowHL.x+3][nowHL.y+3].whatin==CAR)
	  &&(table[nowHL.x+3][nowHL.y+2].whatin==CAR)
	  &&(table[nowHL.x+2][nowHL.y+3].whatin==CAR))
   {if((table[nowHL.x+3][nowHL.y+3].CarOb->state==WALK)
	  ||(table[nowHL.x+3][nowHL.y+2].CarOb->state==WALK)
	  ||(table[nowHL.x+2][nowHL.y+3].CarOb->state==WALK))
       ar.es=CAR;
	else ar.es=HILL;
   }
  else ar.es=HILL;




  if((table[nowHL.x+1][nowHL.y+3].whatin<HILL)&&(table[nowHL.x+2][nowHL.y+3].whatin<HILL)) 
     ar.ss=0;
  else if((table[nowHL.x+1][nowHL.y+3].whatin==CAR)&&(table[nowHL.x+2][nowHL.y+3].whatin==CAR)) 
  {if((table[nowHL.x+1][nowHL.y+3].CarOb->state==WALK)
   ||(table[nowHL.x+2][nowHL.y+3].CarOb->state==WALK)) 
     ar.ss=CAR;
   else  ar.ss=HILL;}
  else ar.ss=HILL;

if((table[nowHL.x+1][nowHL.y+3].whatin<HILL)
	  &&(table[nowHL.x][nowHL.y+3].whatin<HILL)
	  &&(table[nowHL.x][nowHL.y+2].whatin<HILL))
     ar.sw=0;
else if((table[nowHL.x+1][nowHL.y+3].whatin==CAR)
	  &&(table[nowHL.x][nowHL.y+3].whatin==CAR)
	  &&(table[nowHL.x][nowHL.y+2].whatin==CAR))
{if((table[nowHL.x+1][nowHL.y+3].CarOb->state==WALK)
	  ||(table[nowHL.x][nowHL.y+3].CarOb->state==WALK)
	  ||(table[nowHL.x][nowHL.y+2].CarOb->state==WALK))
	  ar.sw=CAR;

else	ar.sw=HILL;
}
  else ar.sw=HILL;



  if((table[nowHL.x][nowHL.y+1].whatin<HILL)&&(table[nowHL.x][nowHL.y+2].whatin<HILL)) 
     ar.ww=0;
  else  if((table[nowHL.x][nowHL.y+1].whatin==CAR)&&(table[nowHL.x][nowHL.y+2].whatin==CAR)) 
  { if((table[nowHL.x][nowHL.y+1].CarOb->state==WALK)||(table[nowHL.x][nowHL.y+2].CarOb->state==WALK)) 
     ar.ww=CAR;
 
    else ar.ww=HILL;
  }
  else ar.ww=HILL;



  if((table[nowHL.x][nowHL.y+1].whatin<HILL)
	  &&(table[nowHL.x][nowHL.y].whatin<HILL)
	  &&(table[nowHL.x+1][nowHL.y].whatin<HILL))
     ar.wn=0;
  else  if((table[nowHL.x][nowHL.y+1].whatin==CAR)
	  &&(table[nowHL.x][nowHL.y].whatin==CAR)
	  &&(table[nowHL.x+1][nowHL.y].whatin==CAR))
  { if((table[nowHL.x][nowHL.y+1].CarOb->state==WALK)
	  ||(table[nowHL.x][nowHL.y].CarOb->state==WALK)
	  ||(table[nowHL.x+1][nowHL.y].CarOb->state==WALK))
     ar.wn=CAR;
	else  ar.wn=HILL;
  }
  else ar.wn=HILL;



 }



 int deltax=soldier->placetogo.x-soldier->nowHL.x;
 int deltay=soldier->placetogo.y-soldier->nowHL.y;


 int direct=DecideDir(nowHL,soldier->placetogo);
 if(soldier->around==0xff){//soldier->bAround=TRUE;//ready to stop;
						   soldier->around=0;
						   placetogo.x=-1;
						   return(placetogo);
							
						}
   soldier->around|=direct;

 //direct=DecideDir(nowHL,soldier->placetogo);

if((abs(deltax)<=2)&&(abs(deltay)<=2)
   &&(table[soldier->placetogo.x+1][soldier->placetogo.y+1].whatin>HILL))
  {placetogo.x=-1;
   return(placetogo);
}

else{
	

   if(soldier->nowdir==1)
			{if(Beyond(soldier)||AllCan(ar))
			  {
	            if(CanGo(ar,direct))
				{
				soldier->nowdir=0;
				return(objectplace);
				}
			  }	
	 
	 
	 
	         if((GoThere(ar,soldier->dir+4).x!=0)
			   ||(GoThere(ar,soldier->dir+4).y!=0))
			   {placetogo.x+=GoThere(ar,soldier->dir+4).x;
			    placetogo.y+=GoThere(ar,soldier->dir+4).y;}
			else if((GoThere(ar,soldier->dir).x!=0)
			   ||(GoThere(ar,soldier->dir).y!=0))
			   {placetogo.x+=GoThere(ar,soldier->dir).x;
			    placetogo.y+=GoThere(ar,soldier->dir).y;}
			else if((GoThere(ar,soldier->dir-4).x!=0)
			   ||(GoThere(ar,soldier->dir-4).y!=0))
			   {placetogo.x+=GoThere(ar,soldier->dir-4).x;
			    placetogo.y+=GoThere(ar,soldier->dir-4).y;}
			else if((GoThere(ar,soldier->dir-8).x!=0)
			   ||(GoThere(ar,soldier->dir-8).y!=0))
			   {placetogo.x+=GoThere(ar,soldier->dir-8).x;
			    placetogo.y+=GoThere(ar,soldier->dir-8).y;}
				   
			 
			}
 else if(soldier->nowdir==-1)
			{if(Beyond(soldier)||AllCan(ar))
			  {if(CanGo(ar,direct))
				{soldier->nowdir=0;
				return(objectplace);
				} 
			  } 
	 
	        if((GoThere(ar,soldier->dir-4).x!=0)
			   ||(GoThere(ar,soldier->dir-4).y!=0))
			   {placetogo.x+=GoThere(ar,soldier->dir-4).x;
			    placetogo.y+=GoThere(ar,soldier->dir-4).y;}
			else if((GoThere(ar,soldier->dir).x!=0)
			   ||(GoThere(ar,soldier->dir).y!=0))
			   {placetogo.x+=GoThere(ar,soldier->dir).x;
			    placetogo.y+=GoThere(ar,soldier->dir).y;}
			else if((GoThere(ar,soldier->dir+4).x!=0)
			   ||(GoThere(ar,soldier->dir+4).y!=0))
			   {placetogo.x+=GoThere(ar,soldier->dir+4).x;
			    placetogo.y+=GoThere(ar,soldier->dir+4).y;}
			else if((GoThere(ar,soldier->dir-8).x!=0)
			   ||(GoThere(ar,soldier->dir-8).y!=0))
			   {placetogo.x+=GoThere(ar,soldier->dir-8).x;
			    placetogo.y+=GoThere(ar,soldier->dir-8).y;} 
			}

else if((deltax>0)&&(deltay>=0)) 
{
         if((ar.ee>=HILL)||(ar.ss>=HILL)||(ar.es>=HILL))
		  {
		 if(ar.ee<HILL)
		     { 
				   placetogo.x+=1;
			//	   if((deltax<0)&&(deltay!=0))soldier->nowdir=1;
				   soldier->nowdir=0;
			  }  
		     
			   
		 else if(ar.ss<HILL)
			  {    
				   placetogo.y+=1;
				   if(deltay==0)soldier->nowdir=-1;
				   else soldier->nowdir=0;
			  }
				
		else if((ar.ee==CAR)||(ar.ss==CAR))
		       {placetogo.y=-99;
		        return(placetogo);
		       }
			   
		else if(ar.ww<HILL)        
				  {soldier->firstdot=soldier->nowHL; 
				   placetogo.x-=1;
				   soldier->nowdir=-1;
				    
				  }		
		 else if(ar.nn<HILL)        
				  {soldier->firstdot=soldier->nowHL; 
			      placetogo.y-=1;
				   soldier->nowdir=1;
				                      		          
		           }
				      
			 else 	
			     {placetogo.x=-1;
				 return(placetogo);}
			        //for stop          
				   
	       
	 }
	
}	
       
 //for the north move 

else if((deltax>=0)&&(deltay<0)) 
{
          
      if((ar.ee>=HILL)||(ar.nn>=HILL)||(ar.ne>=HILL))
		  {
		 if(ar.nn<HILL)
		     { 
				   placetogo.y-=1;
			//	   if((deltay>0)&&(deltax!=0))soldier->nowdir=1;
				   soldier->nowdir=0;
			  }  
		     
			   
	 else if(ar.ee<HILL)
			  { 
				   placetogo.x+=1;
				   if(deltax==0)soldier->nowdir=-1;
				   else  soldier->nowdir=0;
			  }
	 else if((ar.ee==CAR)||(ar.nn==CAR))
		       {placetogo.y=-99;
		        return(placetogo);
		       }
				     
		else if(ar.ss<HILL)        
				  {soldier->firstdot=soldier->nowHL; 
				   placetogo.y+=1;
				   soldier->nowdir=-1;
				    
				  }		
		 else if(ar.ww<HILL)        
				  {soldier->firstdot=soldier->nowHL;
			       placetogo.x-=1;
				   soldier->nowdir=1;
				    
                    		          
		           }
				      
			 else 	
			     {placetogo.x=-1;
				 return(placetogo);}
			        //for stop          
				   
	       
	 }
	
	
 }       
   
  
		     
		     
//for the WEST move


else if((deltax<0)&&(deltay<=0)) 
{	
   
	
		 if((ar.ww>=HILL)||(ar.nn>=HILL)||(ar.wn>=HILL))
		  {
		 if(ar.ww<HILL)
		     { 
				   placetogo.x-=1;
			//	   if((deltax>0)&&(deltay!=0))soldier->nowdir=1;
				   soldier->nowdir=0;
			  }  
		     
			   
		 else if(ar.nn<HILL)
			  { 
				   placetogo.y-=1;
				   if(deltay==0)soldier->nowdir=-1;
				   else soldier->nowdir=0;
			  }
	     else if((ar.ww==CAR)||(ar.nn==CAR))
		       {placetogo.y=-99;
		        return(placetogo);
		       }			     
			   
		else if(ar.ee<HILL)        
				  { soldier->firstdot=soldier->nowHL;
				   placetogo.x+=1;
				   soldier->nowdir=-1;
				    
				  }		
		 else if(ar.ss<HILL)        
				  {soldier->firstdot=soldier->nowHL;
			     placetogo.y+=1;
				   soldier->nowdir=1;
				   
                    		          
		           }
				      
			 else 	
			     {placetogo.x=-1;
				 return(placetogo);}
			        //for stop          
				   
	       
	 }
	
	
}      
	   
 //for the west move   
 
 
//for the south move

else if((deltax<=0)&&(deltay>0)) 
{	        
 if((ar.ww>=HILL)||(ar.ss>=HILL)||(ar.sw>=HILL))
		  {
		 if(ar.ss<HILL)
		     { 
				   placetogo.y+=1;
				//   if((deltax!=0)&&(deltay<0))soldier->nowdir=1;
				   soldier->nowdir=0;
			  }  
		     
			   
		 else if(ar.ww<HILL)
			  { 
				   placetogo.x-=1;
				   if(deltax==0)soldier->nowdir=-1;
				   else soldier->nowdir=0;
			  }
				     
		 else if((ar.ww==CAR)||(ar.ss==CAR))
		       {placetogo.y=-99;
		        return(placetogo);
		       }

		else if(ar.ee<HILL)        
				  { soldier->firstdot=soldier->nowHL;
				   placetogo.x+=1;
				   soldier->nowdir=1;
				    
				  }		
		 else if(ar.nn<HILL)        
				  {soldier->firstdot=soldier->nowHL;
			      placetogo.y-=1;
				   soldier->nowdir=-1;
				         
		           }
				      
			 else 	
			     {placetogo.x=-1;
				 return(placetogo);}
			        //for stop          
	       
	    }
	         
    }           


 //for the south move          

				
				
 
			
 if((placetogo.x!=nowHL.x)||(placetogo.y!=nowHL.y))
		 {if((table[placetogo.x+1][placetogo.y+1].whatin<HILL)
		    ||(table[placetogo.x+1][placetogo.y+1].CarOb==soldier))
			 return(placetogo);
		
			  
			  
		 else {placetogo.y=-99;
		           return(placetogo);    }
	      }
		   			
   else return(objectplace); 

 

   


  }




}                       
																
																
  
			     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -