/*
 *
 *	駒が動けるかどうか判断するルーチン
 *
 */



/*  関数のプロトタイプ宣言  */
int	canmove(int *,int ,int ,int ,int ,int );


int canmove(int *board,int gx,int gy,int px,int py,int pl)
{
/*
return =	 0 -> 動ける		 1 -> 取れる
		-1 -> 動けない場所	-2 -> 何らかの原因で動けない
*/

int	gb,pb,qqq,i;

	gb=board[gy*7+gx];
	pb=board[py*7+px];

	switch(gb-pl*20){

	  case 1:
	    if((gy!=py)||(abs(gx-px)!=1)) return -1;
	    break;

	  case 2:
	    if((gy!=py)||(gx==px)) return -1;
	    qqq=0;
	    for(i=1;i<abs(gx-px);i++){
	      if(gx>px) qqq=qqq+board[py*7+px+i];
	      if(gx<px) qqq=qqq+board[gy*7+gx+i];
	      }
	    if(qqq>0) return -2;
	    break;

	  case 3:
	    if(((abs(gy-py)!=1)||(abs(gx-px)!=2))&&((abs(gy-py)!=2)||(abs(gx-px)!=1))) return -1;
	    break;

	  case 4:
	  case 9:
	    if((abs(gx-px)>1)||(abs(gy-py)>1)||(((abs(gx-px)==0)&&(abs(gy-py)==0)))) return -1;
	    break;

	  case 5:
	    if((abs(gy-py)!=abs(gx-px))||((gy==py)&&(gx==px))) return -1;
	    qqq=0;
	    for(i=1;i<abs(gx-px);i++){
	      if((gx>px)&&(gy>py)) qqq=qqq+board[(gy-i)*7+gx-i];
	      if((gx>px)&&(gy<py)) qqq=qqq+board[(gy+i)*7+gx-i];
	      if((gx<px)&&(gy>py)) qqq=qqq+board[(gy-i)*7+gx+i];
	      if((gx<px)&&(gy<py)) qqq=qqq+board[(gy+i)*7+gx+i];
	      }
	    if(qqq>0) return -2;
	    break;

	  case 6:
	    if(((gy!=py)&&(gx!=px))||((gy==py)&&(gx==px))) return -1;
	    qqq=0;
	    for(i=1;i<(abs(gx-px)+abs(gy-py));i++){
	      if((gx>px)&&(gy==py)) qqq=qqq+board[py*7+px+i];
	      if((gx<px)&&(gy==py)) qqq=qqq+board[py*7+gx+i];
	      if((gx==px)&&(gy>py)) qqq=qqq+board[(py+i)*7+px];
	      if((gx==px)&&(gy<py)) qqq=qqq+board[(gy+i)*7+px];
	      }
	    if(qqq>0) return -2;
	    break;

	  case 7:
	    if(((gy!=py)&&(gx!=px)&&(abs(gy-py)!=abs(gx-px)))||((gy==py)&&(gx==px))) return -1;
	    qqq=0;
	    for(i=1;i<(abs(gx-px)*(abs(gx-px)>abs(gy-py))+abs(gy-py)*(abs(gx-px)<=abs(gy-py)));i++){
	      if((gx>px)&&(gy>py)) qqq=qqq+board[(gy-i)*7+gx-i];
	      if((gx>px)&&(gy<py)) qqq=qqq+board[(gy+i)*7+gx-i];
	      if((gx<px)&&(gy>py)) qqq=qqq+board[(gy-i)*7+gx+i];
	      if((gx<px)&&(gy<py)) qqq=qqq+board[(gy+i)*7+gx+i];

	      if((gx>px)&&(gy==py)) qqq=qqq+board[py*7+px+i];
	      if((gx<px)&&(gy==py)) qqq=qqq+board[py*7+gx+i];
	      if((gx==px)&&(gy>py)) qqq=qqq+board[(py+i)*7+px];
	      if((gx==px)&&(gy<py)) qqq=qqq+board[(gy+i)*7+px];
	      }
	    if(qqq>0) return -2;
	    break;

	  case 8:
	    if(((gy!=py)&&(gx!=px)&&(abs(gy-py)!=abs(gx-px)))||((gy==py)&&(gx==px))){
	      if(((abs(gy-py)!=1)||(abs(gx-px)!=2))&&((abs(gy-py)!=2)||(abs(gx-px)!=1))) return -1;
	      }
	    else{
	      qqq=0;
	      for(i=1;i<(abs(gx-px)*(abs(gx-px)>abs(gy-py))+abs(gy-py)*(abs(gx-px)<=abs(gy-py)));i++){
	        if((gx>px)&&(gy>py)) qqq=qqq+board[(gy-i)*7+gx-i];
	        if((gx>px)&&(gy<py)) qqq=qqq+board[(gy+i)*7+gx-i];
	        if((gx<px)&&(gy>py)) qqq=qqq+board[(gy-i)*7+gx+i];
	        if((gx<px)&&(gy<py)) qqq=qqq+board[(gy+i)*7+gx+i];

	        if((gx>px)&&(gy==py)) qqq=qqq+board[py*7+px+i];
	        if((gx<px)&&(gy==py)) qqq=qqq+board[py*7+gx+i];
	        if((gx==px)&&(gy>py)) qqq=qqq+board[(py+i)*7+px];
	        if((gx==px)&&(gy<py)) qqq=qqq+board[(gy+i)*7+px];
	        }
	      if(qqq>0) return -2;
	      }
	    break;
	  }
	if((pb>=pl*20+1)&&(pb<=pl*20+9)) return -2;
	if((pb>=(pl==0)*20+1)&&(pb<=(pl==0)*20+9)) return 1;
	return 0;
}
