?? move.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);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -