#include<stdio.h>
 #include<graphics.h>
 #include <bios.h>
#define LEFT 0x4b00 
#define RIGHT 0x4d00 
#define DOWN 0x5000 
#define UP 0x4800 
#define ESC 0x011b
#define space 0x3920
#define enter 0x1c0d


 #define H (y-100)/10
 #define L (x-100)/10
 int Mark[20][20];
 int Change=2;
 
 
 void InitMark()
{int i,j;
 for(i=0;i<20;i++)
    for(j=0;j<20;j++)
    Mark[i][j]=0;
}


 void Screen()
{int i;
 cleardevice();
          settextstyle(1,0,8); 
          outtextxy(120,80,"WU  ZI  QI");
          settextstyle(1,0,4);
          outtextxy(270,270,"V  S");
        i=bioskey(0);  
        while(i==space)
        		{ 
          			
					
		  			cleardevice();
          			settextstyle(0, 0, 2);
          			outtextxy(50,50,"BLACK WHITE CHESS");
          			settextstyle(0,0,1);
          			outtextxy(4,354,"ESC -->OVER!!");
          			outtextxy(4,364,"A -->Try Again!!");
          			setcolor(1);
         			rectangle(100,100,300,300);
         			rectangle(1,350,170,450);
        			for(i=1;i<21;i++)
    				{
						line(100+10*i,100,100+10*i,300);
     					line(100,100+10*i,300,100+10*i);
    				}   
					
     				
				}
}



 void PicBlock(int x,int y)
{if(Change==1) setcolor(RED);
 else setcolor(YELLOW);
 line(x+1,y+1,x+1,y+3);line(x+9,y+1,x+9,y+3);
 line(x+1,y+9,x+1,y+7);line(x+9,y+9,x+9,y+7);
 line(x+1,y+1,x+3,y+1);line(x+1,y+9,x+3,y+9);
 line(x+9,y+1,x+7,y+1);line(x+9,y+9,x+7,y+9);
}


 void CoverBlock(int x,int y)
{setcolor(BLACK);
 line(x+1,y+1,x+1,y+3);line(x+9,y+1,x+9,y+3);
 line(x+1,y+9,x+1,y+7);line(x+9,y+9,x+9,y+7);
 line(x+1,y+1,x+3,y+1);line(x+1,y+9,x+3,y+9);
 line(x+9,y+1,x+7,y+1);line(x+9,y+9,x+7,y+9);
}


 void DrawBlack(int x,int y)
{setcolor(RED);
 circle(x+5,y+5,3);
}


 void DrawWhite(int x,int y)
{setcolor(YELLOW);
 circle(x+5,y+5,3);
}


 void CoverPic(int x,int y)
{setfillstyle(1,BLACK);
 bar(x+2,y+2,x+8,y+8);
}


 void Score()
{int i,j,M,a,b;
 a=0;b=0;
 DrawBlack(370,198);
 DrawWhite(370,219);
 setfillstyle(1,BLACK);
 bar(419,189,449,229);
 setcolor(WHITE);
 rectangle(350,170,450,230);
 settextstyle(0, 0, 1);
 outtextxy(352,190,"Play I:");
 outtextxy(352,200,"VS");
 outtextxy(352,210,"Play II:");
 for(i=0;i<20;i++)
    for(j=0;j<20;j++)
       {if(Mark[i][j]==1) a++;
        if(Mark[i][j]==2) b++;
       }
 j=0;
 M=a;
 for(i=0;i<2;i++)
    {
     switch (M/100)
           {case 0:outtextxy(420,190+20*j,"0");break;
            case 1:outtextxy(420,190+20*j,"1");break;
            case 2:outtextxy(420,190+20*j,"2");break;
            case 3:outtextxy(420,190+20*j,"3");break;
            case 4:outtextxy(420,190+20*j,"4");break;
           }
     switch (M%100/10)
           {case 0:outtextxy(430,190+20*j,"0");break;
            case 1:outtextxy(430,190+20*j,"1");break;
            case 2:outtextxy(430,190+20*j,"2");break;
            case 3:outtextxy(430,190+20*j,"3");break;
            case 4:outtextxy(430,190+20*j,"4");break;
            case 5:outtextxy(430,190+20*j,"5");break;
            case 6:outtextxy(430,190+20*j,"6");break;
            case 7:outtextxy(430,190+20*j,"7");break;
            case 8:outtextxy(430,190+20*j,"8");break;
            case 9:outtextxy(430,190+20*j,"9");break;
           }
     switch (M%10)
           {case 0:outtextxy(440,190+20*j,"0");break;
            case 1:outtextxy(440,190+20*j,"1");break;
            case 2:outtextxy(440,190+20*j,"2");break;
            case 3:outtextxy(440,190+20*j,"3");break;
            case 4:outtextxy(440,190+20*j,"4");break;
            case 5:outtextxy(440,190+20*j,"5");break;
            case 6:outtextxy(440,190+20*j,"6");break;
            case 7:outtextxy(440,190+20*j,"7");break;
            case 8:outtextxy(440,190+20*j,"8");break;
            case 9:outtextxy(440,190+20*j,"9");break;
           }
      M=b;j++;
    }
}      


 void MoveBlock(int x,int y)
{int i,k,Counter;
 Counter=0;/*record the path walk*/
 while(1)
      {k=getch();
       if(k==77&&x<290) 
	   {CoverBlock(x,y);x+=10;PicBlock(x,y);}  
	   
       else if(k==75&&x>100) 
	   {CoverBlock(x,y);x-=10;PicBlock(x,y);
	   
	
	   }
       else if(k==72&&y>100)
	   {CoverBlock(x,y);y-=10;PicBlock(x,y);
        
		
		}  
		 
       else if(k==80&&y<290) 
	   {CoverBlock(x,y);y+=10;PicBlock(x,y);
	   
		
		}   
	   
	    else if(k==13&&Mark[H][L]==0)
              {Counter=PreControl(x,y);
               if(Change==1&&Counter)
                 {DrawBlack(x,y);
                  Mark[H][L]=1;
                  AftControl(Counter,x,y);
                  Change++;Counter=0;
                  Score();
                 }
               else if(Change==2&&Counter)
                 {DrawWhite(x,y);
                  Mark[H][L]=2;
                  AftControl(Counter,x,y);
                  Change--;Counter=0;
                  Score();
                 }
                }
      
        else if(k==27) break;
        delay(100);
       }
}
 
 int PreControl(int x,int y)
{int TT,X,Y;
 int T;
 T=0;TT=1;X=x;Y=y;
 while(x<290)/*right*/
      {x+=10;
       if(Mark[H][L]==0||(Mark[H][L]==Change&&TT==1)) break;
       if(Mark[H][L]==Change&&TT!=1) {T+=1;break;}
       TT++;
      }
 TT=1;x=X;y=Y;
 while(x<290&&y>100)/*right and up*/
      {x+=10;y-=10;
       if(Mark[H][L]==0||(Mark[H][L]==Change&&TT==1)) break;
       if(Mark[H][L]==Change&&TT!=1) {T+=2;break;}
       TT++;
      }
 TT=1;x=X;y=Y;
 while(y>100) /*up*/
      {y-=10;
       if(Mark[H][L]==0||(Mark[H][L]==Change&&TT==1)) break;
       if(Mark[H][L]==Change&&TT!=1){T+=4;break;}
       TT++;
      }
 TT=1;x=X;y=Y;
 while(x>100&&y>100) /*up and left*/
      {x-=10;y-=10;
       if(Mark[H][L]==0||(Mark[H][L]==Change&&TT==1)) break;
       if(Mark[H][L]==Change&&TT!=1){T+=8;break;}
       TT++;
      }
 TT=1;x=X;y=Y;
 while(x>100)/*left*/
      {x-=10;
       if(Mark[H][L]==0||(Mark[H][L]==Change&&TT==1)) break;
       if(Mark[H][L]==Change&&TT!=1){T+=16;break;}
       TT++;
      }
 TT=1;x=X;y=Y;
 while(x>100&&y<290)/*left and down*/
      {x-=10;y+=10;
       if(Mark[H][L]==0||(Mark[H][L]==Change&&TT==1)) break;
       if(Mark[H][L]==Change&&TT!=1){T+=32;break;}
       TT++;
      }
 TT=1;x=X;y=Y;
 while(y<290)/*down*/
      {y+=10;
       if(Mark[H][L]==0||(Mark[H][L]==Change&&TT==1)) break;
       if(Mark[H][L]==Change&&TT!=1){T+=64;break;}
       TT++;
      }
 TT=1;x=X;y=Y;
 while(x<290&&y<290)/*down and right*/
      {x+=10;y+=10;
       if(Mark[H][L]==0||(Mark[H][L]==Change&&TT==1)) break;
       if(Mark[H][L]==Change&&TT!=1) {T+=128;break;}
       TT++;
      }
 return T;
}          


 int AftControl(int Counter,int x,int y)
{int X,Y;
 X=x;Y=y;
 if(Counter-128>=0)
   {Counter-=128;
    x+=10;y+=10;
    while(Mark[H][L]!=Change)
         {CoverPic(x,y);
          if(Change==1) DrawBlack(x,y);
          else DrawWhite(x,y);
          Mark[H][L]=Change;
          x+=10;y+=10;
         }
    }
 x=X;y=Y;
 if(Counter-64>=0)
   {Counter-=64;
    y+=10;
    while(Mark[H][L]!=Change)
         {CoverPic(x,y);
          if(Change==1) DrawBlack(x,y);
          else DrawWhite(x,y);
          Mark[H][L]=Change;
          y+=10;
         }
    }
 x=X;y=Y;
 if(Counter-32>=0)
   {Counter-=32;
    x-=10;y+=10;
    while(Mark[H][L]!=Change)
         {CoverPic(x,y);
          if(Change==1) DrawBlack(x,y);
          else DrawWhite(x,y);
          Mark[H][L]=Change;
          x-=10;y+=10;
         }
    }
 x=X;y=Y;
 if(Counter-16>=0)
   {Counter-=16;
    x-=10;
    while(Mark[H][L]!=Change)
         {CoverPic(x,y);
          if(Change==1) DrawBlack(x,y);
          else DrawWhite(x,y);
          Mark[H][L]=Change;
          x-=10;
         }
    }
 x=X;y=Y;
 if(Counter-8>=0)
    {Counter-=8;
     x-=10;y-=10;
     while(Mark[H][L]!=Change)
          {CoverPic(x,y);
           if(Change==1) DrawBlack(x,y);
           else DrawWhite(x,y);
           Mark[H][L]=Change;
           x-=10;y-=10;
          }
     }
 x=X;y=Y;
 if(Counter-4>=0)
   {Counter-=4;
    y-=10;
    while(Mark[H][L]!=Change)
         {CoverPic(x,y);
          if(Change==1) DrawBlack(x,y);
          else DrawWhite(x,y);
          Mark[H][L]=Change;
          y-=10;
         }
    }
 x=X;y=Y;
 if(Counter-2>=0)
   {Counter-=2;
    x+=10;y-=10;
    while(Mark[H][L]!=Change)
         {CoverPic(x,y);
          if(Change==1) DrawBlack(x,y);
          else DrawWhite(x,y);
          Mark[H][L]=Change;
          x+=10;y-=10;
         }
    }
 x=X;y=Y;
 if(Counter-1>=0)
   {Counter-=1;
    x+=10;
    while(Mark[H][L]!=Change)
         {CoverPic(x,y);
          if(Change==1) DrawBlack(x,y);
          else DrawWhite(x,y);
          Mark[H][L]=Change;
          x+=10;
         }
    }
 if(Counter==0) outtextxy(100,320,"ok!");
 else outtextxy(350,100,"wrong!");
}          

 

 void main()
{	int gdriver=DETECT,gmode;
	initgraph(&gdriver,&gmode,"C:\\TC20\\BGI");

 Screen();
DrawBlack(200,200);

 Score();
 PicBlock(200,200);
 MoveBlock(200,200);
 InitMark();

 closegraph();
}