/*Project Name:-Chess Mania */
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include<dos.h>
struct game{
int cp[8][8][2];
int kingp[3][3];
int onep[8][8],turn;
int twop[8][8];
int checked,checkmate;
};
game n;
int p[4],goon=1,c=1;
int po[8][2];
void ffp(int x,int y)
{
floodfill(25+x,30+y,15);
floodfill(25+x,37+y,15);
floodfill(25+x,44+y,15); }
void ffk(int x,int y)
{
floodfill(25+x,40+y,15);
floodfill(25+x,3+y,15); }
void ffc(int x,int y)
{ floodfill(25+x,25+y,15); }
void ffcam(int x,int y)
{
floodfill(25+x,13+y,15);
floodfill(25+x,20+y,15);
floodfill(23+x,28+y,15);
floodfill(25+x,40+y,15);
floodfill(25+x,47+y,15); }
void ffq(int x,int y)
{
floodfill(25+x,7+y,15);
floodfill(25+x,12+y,15);
floodfill(25+x,22+y,15);
floodfill(25+x,24+y,15);
floodfill(25+x,30+y,15); }
void ffh(int x,int y)
{ floodfill(25+x,45+y,15);
}
void drawpawn(int x,int y)
{
circle(25+x,30+y,5);
line(15+x,35+y,35+x,35+y);
line(15+x,35+y,15+x,38+y);
line(35+x,35+y,35+x,38+y);
line(15+x,38+y,35+x,38+y);
arc(25+x,50+y,0,180,12);
line(13+x,50+y,37+x,50+y); }
void drawking(int x,int y)
{
line(25+x,0+y,22+x,2+y);
line(25+x,0+y,28+x,2+y);
line(22+x,2+y,25+x,5+y);
line(28+x,2+y,25+x,5+y);
line(25+x,5+y,15+x,9+y);
line(25+x,5+y,35+x,9+y);
line(15+x,9+y,21+x,15+y);
line(35+x,9+y,29+x,15+y);
line(21+x,15+y,15+x,18+y);
line(29+x,15+y,35+x,18+y);
line(15+x,18+y,15+x,20+y);
line(35+x,18+y,35+x,20+y);
line(15+x,20+y,20+x,20+y);
line(35+x,20+y,30+x,20+y);
line(20+x,20+y,18+x,40+y);
line(30+x,20+y,32+x,40+y);
line(18+x,40+y,10+x,45+y);
line(32+x,40+y,40+x,45+y);
line(10+x,45+y,13+x,48+y);
line(40+x,45+y,37+x,48+y);
line(13+x,48+y,10+x,50+y);
line(37+x,48+y,40+x,50+y);
line(10+x,50+y,40+x,50+y); }
void drawcastle(int x,int y)
{
line(15+x,50+y,35+x,50+y);
line(15+x,50+y,15+x,47+y);
line(35+x,50+y,35+x,47+y);
line(15+x,47+y,18+x,47+y);
line(35+x,47+y,32+x,47+y);
line(18+x,47+y,20+x,27+y);
line(32+x,47+y,30+x,27+y);
line(20+x,27+y,15+x,27+y);
line(30+x,27+y,35+x,27+y);
line(15+x,27+y,15+x,20+y);
line(35+x,27+y,35+x,20+y);
line(15+x,20+y,20+x,20+y);
line(35+x,20+y,30+x,20+y);
line(20+x,20+y,20+x,25+y);
line(30+x,20+y,30+x,25+y);
line(20+x,25+y,23+x,25+y);
line(30+x,25+y,27+x,25+y);
line(23+x,25+y,23+x,20+y);
line(27+x,25+y,27+x,20+y);
line(23+x,20+y,27+x,20+y); }
void drawhorse(int x,int y)
{
line(13+x,50+y,37+x,50+y);
line(13+x,50+y,22+x,34+y);
line(37+x,50+y,32+x,26+y);
line(22+x,35+y,8+x,31+y);
line(32+x,26+y,36+x,23+y);
line(36+x,23+y,31+x,20+y);
line(31+x,20+y,28+x,15+y);
line(28+x,15+y,25+x,20+y);
line(25+x,20+y,22+x,15+y);
line(22+x,15+y,19+x,20+y);
line(19+x,20+y,8+x,27+y);
line(8+x,27+y,15+x,29+y);
line(15+x,29+y,8+x,31+y);
circle(25+x,25+y,1); }
void drawcamel(int x,int y)
{
circle(25+x,13+y,2);
line(24+x,14+y,18+x,20+y);
line(26+x,14+y,32+x,20+y);
line(18+x,20+y,22+x,27+y);
line(32+x,20+y,28+x,27+y);
line(22+x,27+y,28+x,27+y);
line(22+x,27+y,22+x,30+y);
line(28+x,27+y,28+x,30+y);
line(22+x,30+y,28+x,30+y);
line(22+x,30+y,15+x,45+y);
line(28+x,30+y,35+x,45+y);
line(15+x,45+y,35+x,45+y);
line(15+x,45+y,15+x,50+y);
line(35+x,45+y,35+x,50+y);
line(15+x,50+y,35+x,50+y); }
void drawqueen(int x,int y)
{
line(10+x,50+y,40+x,50+y);
line(10+x,50+y,10+x,45+y);
line(40+x,50+y,40+x,45+y);
line(10+x,45+y,15+x,45+y);
line(40+x,45+y,35+x,45+y);
line(15+x,45+y,20+x,40+y);
line(35+x,45+y,30+x,40+y);
line(20+x,40+y,20+x,25+y);
line(30+x,40+y,30+x,25+y);
line(15+x,25+y,35+x,25+y);
line(15+x,25+y,15+x,23+y);
line(35+x,25+y,35+x,23+y);
line(15+x,23+y,35+x,23+y);
line(15+x,23+y,20+x,20+y);
line(35+x,23+y,30+x,20+y);
line(20+x,20+y,30+x,20+y);
line(20+x,20+y,20+x,15+y);
line(30+x,20+y,30+x,15+y);
line(20+x,15+y,15+x,13+y);
line(30+x,15+y,35+x,13+y);
line(15+x,13+y,15+x,10+y);
line(35+x,13+y,35+x,10+y);
line(15+x,10+y,20+x,13+y);
line(35+x,10+y,30+x,13+y);
line(20+x,13+y,24+x,8+y);
line(30+x,13+y,26+x,8+y);
circle(25+x,7+y,2); }
void drawcoin(int x,int y,int i,int j,int f)
{
if(n.cp[i][j][1]==1)
{ drawpawn(x,y);
if(f)
ffp(x,y); }
if(n.cp[i][j][1]==2)
{ drawcastle(x,y);
if(f)
ffc(x,y);
}
if(n.cp[i][j][1]==3)
{ drawhorse(x,y);
if(f)
ffh(x,y); }
if(n.cp[i][j][1]==4)
{ drawcamel(x,y);
if(f)
ffcam(x,y);}
if(n.cp[i][j][1]==5)
{ drawqueen(x,y);
if(f)
ffq(x,y); }
if(n.cp[i][j][1]==6)
{ drawking(x,y);
if(f)
ffk(x,y); }
}
void setcoins()
{
int i,j,c,x,y;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{ x=169+j*50;
y=39+i*50;
if(n.cp[i][j][0]==15&&(i+j)%2==0)//white coin and white background
{ setcolor(0);
floodfill(x+25,y+25,15);
drawcoin(x,y,i,j,0);
}
if(n.cp[i][j][0]==15&&(i+j)%2!=0) //white coin and black background
{ setcolor(15);
drawcoin(x,y,i,j,1);
}
if(n.cp[i][j][0]==0&&(i+j)%2!=0) // black coin and black background
{ setcolor(15);
drawcoin(x,y,i,j,0);
}
if(n.cp[i][j][0]==0&&(i+j)%2==0) // black coin and white background
{ setcolor(15);
drawcoin(x,y,i,j,0);
floodfill(x+5,y+5,15);
floodfill(x+45,y+5,15);
}
if(n.cp[i][j][0]==-1&&(i+j)%2==0)
{ setcolor(15);
floodfill(x+25,y+25,15);
}
}
}
void drawboard()
{ int i,j;
int xmin=169,xmax=569,ymin=39,ymax=439;
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "\\tc\\bgi\\");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
for(i=ymin;i<=ymax;i+=50)
line(xmin,i,xmax,i);
for(i=xmin;i<=xmax;i+=50)
line(i,ymin,i,ymax);
outtextxy(589,64,"eight");
outtextxy(589,114,"seven");
outtextxy(589,164,"six");
outtextxy(589,214,"five");
outtextxy(589,264,"four");
outtextxy(589,314,"three");
outtextxy(589,364,"two");
outtextxy(589,414,"one");
outtextxy(544,449,"H");
outtextxy(494,449,"G");
outtextxy(444,449,"F");
outtextxy(394,449,"E");
outtextxy(344,449,"D");
outtextxy(294,449,"C");
outtextxy(244,449,"B");
outtextxy(194,449,"A");
setcoins();
if(n.turn==1)
c=8;
else
c=1;
setfillstyle(CLOSE_DOT_FILL,c);
floodfill(50,50,15);
}
void givevalue()
{
int i,j;
for(i=0;i<8;i++) //making all null
for(j=0;j<8;j++)
n.cp[j][i][0]=-1;
for(i=0;i<8;i++) //giving color to coins
for(j=0;j<2;j++)
n.cp[j][i][0]=0;
for(i=0;i<8;i++)
for(j=6;j<8;j++)
n.cp[j][i][0]=15;
for(i=0;i<8;i++) // placing the coins on the board
for(j=0;j<8;j++) //starting positons
{ n.cp[j][i][1]=-1;
if(j==1||j==6)
n.cp[j][i][1]=1;
if((j==0||j==7)&&(i==0||i==7))
n.cp[j][i][1]=2;
if((j==0||j==7)&&(i==1||i==6))
n.cp[j][i][1]=3;
if((j==0||j==7)&&(i==2||i==5))
n.cp[j][i][1]=4;
if((j==0||j==7)&&i==3)
n.cp[j][i][1]=5;
if((j==0||j==7)&&i==4)
n.cp[j][i][1]=6;
}
}
void open()
{
FILE *fp;
fp=fopen("save.txt","r");
printf("\n\n\t\t\t");
if(fp==NULL)
cprintf("Cannot open file");
else
{ fread(&n,sizeof(n),1,fp);
drawboard();
}
}
void leaf(int f)
{
int gdriver = DETECT, gmode, errorcode,i;
initgraph(&gdriver, &gmode, "\\tc\\bgi\\");
arc(370,540,120,160,330);
arc(260,540,20,60,330);
//first leaf
line(80,385,90,315);
line(90,315,95,330);
line(95,330,120,275);
line(120,275,120,293);
line(120,293,155,250);
line(155,250,150,270);
line(150,270,187,233);
line(187,233,183,250);
line(183,250,251,226);
line(251,226,196,277);
line(196,277,208,280);
line(208,280,164,301);
line(164,301,177,305);
line(177,305,135,330);
line(135,330,148,331);
line(148,331,113,356);
line(113,356,126,356);
line(126,356,80,383);
//right leaf
line(550,380,500,360);
line(500,360,515,357);
line(515,357,470,333);
line(470,333,483,332);
line(483,332,440,304);
line(440,304,454,304);
line(454,304,414,277);
line(414,277,432,279);
line(432,279,372,225);
line(372,225,445,245);
line(445,245,438,230);
line(438,230,478,266);
line(478,266,473,250);
line(473,250,511,298);
line(511,298,508,283);
line(508,283,535,331);
line(535,331,535,315);
line(535,315,550,380);
setfillstyle(3,2);
floodfill(440,250,15);
floodfill(90,350,15);
//king
int x=79,y=50,x1=3,y1=4;
line((25+x)*x1,(0+y)*y1,(25+x)*x1,(50+y)*y1);
line((25+x)*x1,(0+y)*y1,(22+x)*x1,(2+y)*y1);
line((25+x)*x1,(0+y)*y1,(28+x)*x1,(2+y)*y1);
line((22+x)*x1,(2+y)*y1,(25+x)*x1,(5+y)*y1);
line((28+x)*x1,(2+y)*y1,(25+x)*x1,(5+y)*y1);
line((25+x)*x1,(5+y)*y1,(15+x)*x1,(9+y)*y1);
line((25+x)*x1,(5+y)*y1,(35+x)*x1,(9+y)*y1);
line((15+x)*x1,(9+y)*y1,(21+x)*x1,(15+y)*y1);
line((35+x)*x1,(9+y)*y1,(29+x)*x1,(15+y)*y1);
line((21+x)*x1,(15+y)*y1,(15+x)*x1,(18+y)*y1);
line((29+x)*x1,(15+y)*y1,(35+x)*x1,(18+y)*y1);
line((15+x)*x1,(18+y)*y1,(15+x)*x1,(20+y)*y1);
line((35+x)*x1,(18+y)*y1,(35+x)*x1,(20+y)*y1);
line((15+x)*x1,(20+y)*y1,(20+x)*x1,(20+y)*y1);
line((35+x)*x1,(20+y)*y1,(30+x)*x1,(20+y)*y1);
line((20+x)*x1,(20+y)*y1,(18+x)*x1,(40+y)*y1);
line((30+x)*x1,(20+y)*y1,(32+x)*x1,(40+y)*y1);
line((18+x)*x1,(40+y)*y1,(10+x)*x1,(45+y)*y1);
line((32+x)*x1,(40+y)*y1,(40+x)*x1,(45+y)*y1);
line((10+x)*x1,(45+y)*y1,(13+x)*x1,(48+y)*y1);
line((40+x)*x1,(45+y)*y1,(37+x)*x1,(48+y)*y1);
line((13+x)*x1,(48+y)*y1,(10+x)*x1,(50+y)*y1);
line((37+x)*x1,(48+y)*y1,(40+x)*x1,(50+y)*y1);
line((10+x)*x1,(50+y)*y1,(40+x)*x1,(50+y)*y1);
setfillstyle(1,15);
floodfill((21+x)*x1,(40+y)*y1,15);
floodfill((23+x)*x1,(3+y)*y1,15);
setfillstyle(CLOSE_DOT_FILL,8);
floodfill(50,50,15);
printf("\n====================================Creators====================================");
printf("\n DERRICK====================SHRUTI ");
if(f)
{
printf("\n THANK YOU FOR PLAYING CHESS MANIA ");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\n================================================================================");
}
else{
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\n================================================================================");
} delay(3500);
closegraph();
}
void openmenu()
{
clrscr();
textcolor(CYAN + BLINK);
printf("\n\n\n\n\n \t\t\t");
cprintf("Welcome_to_Chess_Mania");
textcolor(CYAN );
printf("\n\n\t\t\t");
cprintf(" Hit Enter to play");
printf("\n\n\t\t\t");
cprintf(" Hit Esc to exit");
int a;
if(getch()==27)
{exit(0);
}
else
{ clrscr();
printf("\n\n");
printf("\n\n\t\t\t");
cprintf("Start new game hit enter");
printf("\n\n\t\t\t");
cprintf(" Load saved game hit L");
printf("\n\n\t\t\t");
cprintf(" Hit Esc to exit");
a=getch();
if(a==27)
{exit(0);
}
else if(a=='l'||a=='L')
{
open();
}
else
{ clrscr();
printf("\n\n\t\t\t");
givevalue();
drawboard();
}}}
void save()
{ FILE *fp;
fp=fopen("save.txt","w");
fwrite(&n,sizeof(n),1,fp);
exit(0);
}
void menu()
{
closegraph();
printf("\n\n\t\t\t");
cprintf("Save game and exit::s");
printf("\n\n\t\t\t");
cprintf(" Exit::E");
printf("\n\n\t\t\t");
cprintf("return to game:any key");
char s=getch();
if(s=='s'||s=='S')
{ leaf(1); save(); }
else if(s=='e'||s=='E')
{
leaf(1);
exit(0);
}
else
{drawboard();
}
}
void calppp(int e)
{ int i,j;
if(e)
for(i=0;i<8;i++)
for(j=0;j<8;j++)
n.onep[i][j]=-1;
if(n.turn) //white pawn
{ //reset
if(p[0]==6)
{ if(n.cp[5][p[1]][0]!=15&&n.cp[5][p[1]][0]!=0)
n.onep[5][p[1]]=1;
if(n.cp[4][p[1]][0]!=15&&n.cp[4][p[1]][0]!=0&&n.cp[5][p[1]][0]==-1)
n.onep[4][p[1]]=1;
}
if(p[0]-1>=0)
{ i=p[0]-1;
j=p[1];
if(n.cp[i][j][0]!=15&&n.cp[i][j][0]!=0)
n.onep[i][j]=1;
if(p[1]+1<8)
if(n.cp[p[0]-1][p[1]+1][0]==0)
n.onep[p[0]-1][p[1]+1]=1;
if(p[1]-1>=0)
if(n.cp[p[0]-1][p[1]-1][0]==0)
n.onep[p[0]-1][p[1]-1]=1;
}
} //turn end
else
{ //for black pawn checkin possibility
if(p[0]==1)
{ if(n.cp[2][p[1]][0]!=15&&n.cp[2][p[1]][0]!=0)
n.onep[2][p[1]]=1;
if(n.cp[3][p[1]][0]!=15&&n.cp[3][p[1]][0]!=0&&n.cp[2][p[1]][0]==-1)
n.onep[3][p[1]]=1;
}
if(p[0]+1<8)
{ i=p[0]+1;
j=p[1];
if(n.cp[i][j][0]!=15&&n.cp[i][j][0]!=0)
n.onep[i][j]=1;
if(p[1]+1<8)
if(n.cp[p[0]+1][p[1]+1][0]==15)
n.onep[p[0]+1][p[1]+1]=1;
if(p[1]-1>=0)
if(n.cp[p[0]+1][p[1]-1][0]==15)
n.onep[p[0]+1][p[1]-1]=1;
}
}
}
void calppc(int e)
{ int i,j,flag=1;
if(e)
for(i=0;i<8;i++) //reset
for(j=0;j<8;j++)
n.onep[i][j]=-1;
if(n.turn) {
for(i=p[1]+1;i<8&&n.cp[p[0]][i][0]!=15&&flag;i++) //marking the right side
{ if(n.cp[p[0]][i][0]==0)
flag=0;
n.onep[p[0]][i]=1;
} flag=1;
for(i=p[1]-1;i>=0&&n.cp[p[0]][i][0]!=15&&flag;i--) //marking the left side
{ if(n.cp[p[0]][i][0]==0)
flag=0;
n.onep[p[0]][i]=1;
} flag=1;
for(i=p[0]+1;i<8&&n.cp[i][p[1]][0]!=15&&flag;i++) //marking the down side
{ if(n.cp[p[0]][i][0]==0)
flag=0;
n.onep[i][p[1]]=1;
} flag=1;
for(i=p[0]-1;i>=0&&n.cp[i][p[1]][0]!=15&&flag;i--) //marking the top side
{ if(n.cp[p[0]][i][0]==0)
flag=0;
n.onep[i][p[1]]=1;
}
}
else
{ flag=1;
for(i=p[1]+1;i<8&&n.cp[p[0]][i][0]!=0&&flag;i++) //marking the right side
{ if(n.cp[p[0]][i][0]==15)
flag=0;
n.onep[p[0]][i]=1;
} flag=1;
for(i=p[1]-1;i>=0&&n.cp[p[0]][i][0]!=0&&flag;i--) //marking the left side
{ if(n.cp[p[0]][i][0]==15)
flag=0;
n.onep[p[0]][i]=1;
} flag=1;
for(i=p[0]+1;i<8&&n.cp[i][p[1]][0]!=0&&flag;i++) //marking the down side
{ if(n.cp[p[0]][i][0]==15)
flag=0;
n.onep[i][p[1]]=1;
} flag=1;
for(i=p[0]-1;i>=0&&n.cp[i][p[1]][0]!=0&&flag;i--) //marking the top side
{ if(n.cp[p[0]][i][0]==15)
flag=0;
n.onep[i][p[1]]=1;
}}}
void calpph(int a)
{
int i,j;
if(a)
for(i=0;i<8;i++) //reset
for(j=0;j<8;j++)
n.onep[i][j]=-1;
if(n.turn)
{ if(p[1]+1<8)
{ if(p[0]-2>=0)
if(n.cp[p[0]-2][p[1]+1][0]!=15)
n.onep[p[0]-2][p[1]+1]=1;
if(p[0]+2<8)
if(n.cp[p[0]+2][p[1]+1][0]!=15)
n.onep[p[0]+2][p[1]+1]=1;
}
if(p[1]+2<8)
{ if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]+2][0]!=15)
n.onep[p[0]-1][p[1]+2]=1;
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]+2][0]!=15)
n.onep[p[0]+1][p[1]+2]=1;
}
if(p[1]-1>=0)
{ if(p[0]-2>=0)
if(n.cp[p[0]-2][p[1]-1][0]!=15)
n.onep[p[0]-2][p[1]-1]=1;
if(p[0]+2<8)
if(n.cp[p[0]+2][p[1]-1][0]!=15)
n.onep[p[0]+2][p[1]-1]=1;
}
if(p[1]-2>=0)
{ if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]-2][0]!=15)
n.onep[p[0]-1][p[1]-2]=1;
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]-2][0]!=15)
n.onep[p[0]+1][p[1]-2]=1;
}
}
else
{
if(p[1]+1<8)
{ if(p[0]-2>=0)
if(n.cp[p[0]-2][p[1]+1][0]!=0)
n.onep[p[0]-2][p[1]+1]=1;
if(p[0]+2<8)
if(n.cp[p[0]+2][p[1]+1][0]!=0)
n.onep[p[0]+2][p[1]+1]=1;
}
if(p[1]+2<8)
{ if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]+2][0]!=0)
n.onep[p[0]-1][p[1]+2]=1;
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]+2][0]!=0)
n.onep[p[0]+1][p[1]+2]=1;
}
if(p[1]-1>=0)
{ if(p[0]-2>=0)
if(n.cp[p[0]-2][p[1]-1][0]!=0)
n.onep[p[0]-2][p[1]-1]=1;
if(p[0]+2<8)
if(n.cp[p[0]+2][p[1]-1][0]!=0)
n.onep[p[0]+2][p[1]-1]=1;
}
if(p[1]-2>=0)
{ if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]-2][0]!=0)
n.onep[p[0]-1][p[1]-2]=1;
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]-2][0]!=0)
n.onep[p[0]+1][p[1]-2]=1;
}
}}
void calppca(int e)
{
int i,j,flag=1;
if(e)
for(i=0;i<8;i++) //reset
for(j=0;j<8;j++)
n.onep[i][j]=-1;
if(n.turn)
{ //checkin left top
for(i=p[0]-1,j=p[1]-1;i>=0&&j>=0&&flag&&n.cp[i][j][0]!=15;i--,j--)
{ if(n.cp[i][j][0]==0)
flag=0;
n.onep[i][j]=1;
} flag=1;
//right top
for(i=p[0]-1,j=p[1]+1;i>=0&&j<8&&flag&&n.cp[i][j][0]!=15;i--,j++)
{ if(n.cp[i][j][0]==0)
flag=0;
n.onep[i][j]=1;
} flag=1;
// right bottom
for(i=p[0]+1,j=p[1]+1;i<8&&j<8&&flag&&n.cp[i][j][0]!=15;i++,j++)
{ if(n.cp[i][j][0]==0)
flag=0;
n.onep[i][j]=1;
} flag=1;
// left bottom
for(i=p[0]+1,j=p[1]-1;i<8&&j>=0&&flag&&n.cp[i][j][0]!=15;i++,j--)
{ if(n.cp[i][j][0]==0)
flag=0;
n.onep[i][j]=1;
}
//End of white
}
else // begin of black
{
for(i=p[0]-1,j=p[1]-1;i>=0&&j>=0&&flag&&n.cp[i][j][0]!=0;i--,j--)
{ if(n.cp[i][j][0]==15)
flag=0;
n.onep[i][j]=1;
} flag=1;
for(i=p[0]-1,j=p[1]+1;i>=0&&j<8&&flag&&n.cp[i][j][0]!=0;i--,j++)
{ if(n.cp[i][j][0]==15)
flag=0;
n.onep[i][j]=1;
} flag=1;
for(i=p[0]+1,j=p[1]+1;i<8&&j<8&&flag&&n.cp[i][j][0]!=0;i++,j++)
{ if(n.cp[i][j][0]==15)
flag=0;
n.onep[i][j]=1;
} flag=1;
for(i=p[0]+1,j=p[1]-1;i<8&&j>=0&&flag&&n.cp[i][j][0]!=0;i++,j--)
{ if(n.cp[i][j][0]==15)
flag=0;
n.onep[i][j]=1;
}
}}
void calppq(int e)
{
int i,j;
if(e)
for(i=0;i<8;i++) //reset possibility array
for(j=0;j<8;j++)
n.onep[i][j]=-1;
calppc(0);
calppca(0);
}
void calppk()
{
int i,j;
for(i=0;i<8;i++) //reset possibility array
for(j=0;j<8;j++)
n.onep[i][j]=-1;
if(n.turn)
{
if(p[1]+1<8)
{ if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]+1][0]!=15)
n.onep[p[0]-1][p[1]+1]=1;
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]+1][0]!=15)
n.onep[p[0]+1][p[1]+1]=1;
if(n.cp[p[0]][p[1]+1][0]!=15)
n.onep[p[0]][p[1]+1]=1;
}
if(p[1]-1>=0)
{ if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]-1][0]!=15)
n.onep[p[0]-1][p[1]-1]=1;
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]-1][0]!=15)
n.onep[p[0]+1][p[1]-1]=1;
if(n.cp[p[0]][p[1]-1][0]!=15)
n.onep[p[0]][p[1]-1]=1;
}
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]][0]!=15)
n.onep[p[0]+1][p[1]]=1;
if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]][0]!=15)
n.onep[p[0]-1][p[1]]=1;
}
else
{ if(p[1]+1<8)
{ if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]+1][0]!=0)
n.onep[p[0]-1][p[1]+1]=1;
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]+1][0]!=0)
n.onep[p[0]+1][p[1]+1]=1;
if(n.cp[p[0]][p[1]+1][0]!=0)
n.onep[p[0]][p[1]+1]=1;
}
if(p[1]-1>=0)
{ if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]-1][0]!=0)
n.onep[p[0]-1][p[1]-1]=1;
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]-1][0]!=0)
n.onep[p[0]+1][p[1]-1]=1;
if(n.cp[p[0]][p[1]-1][0]!=0)
n.onep[p[0]][p[1]-1]=1;
}
if(p[0]+1<8)
if(n.cp[p[0]+1][p[1]][0]!=0)
n.onep[p[0]+1][p[1]]=1;
if(p[0]-1>=0)
if(n.cp[p[0]-1][p[1]][0]!=0)
n.onep[p[0]-1][p[1]]=1;
}
}
int promote()
{ int value=1;
r:
printf("\n Promote Pawn to:\nQueen==5\nBishop==4\nKnight==3\nCastle==2");
printf("\nEnter a no:");
scanf("%d",&value);
if(value>1&&value<6)
return(value);
else
goto r;
}
int kingind(int h,int v)
{ int ret=0,count=0;
int i,j,king,found=1,x,y,nc;
//find the king
if(n.turn)
{ king=15; nc=0;}
else
{ king=0; nc=15;}
for(i=0;i<8&&found;i++)
for(j=0;j<8&&found;j++)
if(n.cp[i][j][0]==king&&n.cp[i][j][1]==6)
found=0;
x=p[0]; y=p[1];
p[0]=i-1; p[1]=j-1;
calppq(1);
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(n.onep[i][j]==1&&n.cp[i][j][0]==nc&&n.cp[i][j][1]!=1&&n.cp[i][j][1]!=3&&n.cp[i][j][1]!=6)
{ ret=1; count++;}
else
n.onep[i][j]=-1;
if(h)
calpph(0);
if(h)
{ for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(n.onep[i][j]==1&&n.cp[i][j][0]==nc&&n.cp[i][j][1]==3)
{ ret=1; count++;}
if(n.turn)
{ if((n.cp[p[0]-1][p[1]+1][0]==nc&&n.cp[p[0]-1][p[1]+1][1]==1)||(n.cp[p[0]-1][p[1]-1][1]==1&&n.cp[p[0]-1][p[1]-1][1]==nc))
{ ret=1; count++; } }
else
{ if((n.cp[p[0]+1][p[1]+1][1]==1&&n.cp[p[0]+1][p[1]+1][0]==nc)||(n.cp[p[0]+1][p[1]-1][1]==1&&n.cp[p[0]+1][p[1]-1][1]==nc))
{ ret=1; count++;}
}
}
p[0]=x; p[1]=y;
if(v==0)
return(ret);
else
return count;
}
void restore(int coin,int rc,int rco)
{
printf("\n The move will\n cause the game to end!!");
getch();
n.cp[p[2]][p[3]][0]=rc;
n.cp[p[2]][p[3]][1]=rco;
if(n.turn)
n.cp[p[0]][p[1]][0]=15;
else
n.cp[p[0]][p[1]][0]=0;
n.cp[p[0]][p[1]][1]=coin;
}
int checkmate()
{
int i,j,v,color,found,c=1,enemy;
v=kingind(1,1);
if(n.turn)
{ color=15; enemy=0; }
else
{ color=0; enemy=15;}
//calculating the next move for all the pieces
for(i=0;i<8;i++)
for(j=0;j<8;j++)
n.onep[i][j]=-1;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(n.cp[i][j][0]==color)
{ p[0]=i; p[1]=j;
if(n.cp[i][j][1]==1)
calppp(0);
if(n.cp[i][j][1]==2)
calppc(0);
if(n.cp[i][j][1]==3)
calpph(0);
if(n.cp[i][j][1]==4)
calppca(0);
if(n.cp[i][j][1]==5)
calppq(0);
}
//find the coins attackin the king
for(i=0;i<8&&found;i++)
for(j=0;j<8&&found;j++)
if(n.cp[i][j][0]==color&&n.cp[i][j][1]==6)
found=0;
int x=i-1,y=j-1,z=0,no=1,ii;
for(i=x-1;i>=0&&no;i--)
{ po[z][0]=i; po[z][1]=y; z++;
if(n.cp[i][y][0]==enemy&&n.cp[i][y][1]!=1&&n.cp[i][y][1]!=3&&n.cp[i][y][1]!=6&&n.cp[i][y][1]!=-1)
for(j=0;j<z;j++)
{n.twop[po[j][0]][po[j][1]]=1;
no=0;
}
} z=0; no=1;
for(i=x+1;i<8&&no;i++)
{ po[z][0]=i; po[z][1]=y; z++;
if(n.cp[i][y][0]==enemy&&n.cp[i][y][1]!=1&&n.cp[i][y][1]!=3&&n.cp[i][y][1]!=6&&n.cp[i][y][1]!=-1)
for(j=0;j<z;j++)
{n.twop[po[j][0]][po[j][1]]=1; no=0;
}
} z=0; no=1;
for(i=y-1;i>=0&&no;i--)
{ po[z][0]=x; po[z][1]=i; z++;
if(n.cp[x][i][0]==enemy&&n.cp[x][i][1]!=1&&n.cp[x][i][1]!=3&&n.cp[x][i][1]!=6&&n.cp[x][i][1]!=-1)
for(j=0;j<z;j++)
{n.twop[po[j][0]][po[j][1]]=1; no=0;
}
} z=0; no=1;
for(i=y+1;i<8&&no;i++)
{ po[z][0]=x; po[z][1]=i; z++;
if(n.cp[x][i][0]==enemy&&n.cp[x][i][1]!=1&&n.cp[x][i][1]!=3&&n.cp[x][i][1]!=6&&n.cp[x][i][1]!=-1)
for(j=0;j<z;j++)
{n.twop[po[j][0]][po[j][1]]=1; no=0;
}
} z=0; no=1;
for(i=x+1,j=y+1;i<8&&j<8&&no;i++,j++)
{
po[z][0]=i; po[z][1]=j; z++;
if(n.cp[i][j][0]==enemy&&n.cp[i][j][1]!=1&&n.cp[i][j][1]!=3&&n.cp[i][j][1]!=6&&n.cp[i][j][1]!=-1)
for(ii=0;ii<z;ii++)
{n.twop[po[ii][0]][po[ii][1]]=1; no=0;
}
} z=0; no=1;
for(i=x-1,j=y-1;i>=0&&j>=0&&no;i--,j--)
{
po[z][0]=i; po[z][1]=j; z++;
if(n.cp[i][j][0]==enemy&&n.cp[i][j][1]!=1&&n.cp[i][j][1]!=3&&n.cp[i][j][1]!=6&&n.cp[i][j][1]!=-1)
for(ii=0;ii<z;ii++)
{n.twop[po[ii][0]][po[ii][1]]=1; no=0;
}
} z=0; no=1;
for(i=x+1,j=y-1;i<8&&j>=0&&no;i++,j--)
{
po[z][0]=i; po[z][1]=j; z++;
if(n.cp[i][j][0]==enemy&&n.cp[i][j][1]!=1&&n.cp[i][j][1]!=3&&n.cp[i][j][1]!=6&&n.cp[i][j][1]!=-1)
for(ii=0;ii<z;ii++)
{n.twop[po[ii][0]][po[ii][1]]=1; no=0;
}
} z=0;no=1;
for(i=x-1,j=y+1;i>=0&&j<8&&no;i--,j++)
{
po[z][0]=i; po[z][1]=j; z++;
if(n.cp[i][j][0]==enemy&&n.cp[i][j][1]!=1&&n.cp[i][j][1]!=3&&n.cp[i][j][1]!=6&&n.cp[i][j][1]!=-1)
for(ii=0;ii<z;ii++)
{n.twop[po[ii][0]][po[ii][1]]=1; no=0;
}
}
int h=0;
if(n.cp[x-2][y-1][0]==enemy&&n.cp[x-2][y-1][1]==3&&x-2>=0&&y-1>=0)
{ h=1; n.twop[x-2][y-1]=3;}
if(n.cp[x-1][y-2][0]==enemy&&n.cp[x-1][y-2][1]==3&&x-1>=0&&y-2>=0)
{ h=1; n.twop[x-1][y-2]=3;}
if(n.cp[x+1][y-2][0]==enemy&&n.cp[x+1][y-2][1]==3&&x+1<8&&y-2>=0)
{ h=1; n.twop[x+1][y-2]=3;}
if(n.cp[x+2][y-1][0]==enemy&&n.cp[x+2][y-1][1]==3&&x+2<8&&y-1>=0)
{ h=1; n.twop[x+2][y-1]=3;}
if(n.cp[x-2][y+1][0]==enemy&&n.cp[x-2][y+1][1]==3&&x-2>=0&&y+1<8)
{ h=1; n.twop[x-2][y+1]=3;}
if(n.cp[x-1][y+2][0]==enemy&&n.cp[x-1][y+2][1]==3&&x-1>=0&&y+2<8)
{ h=1; n.twop[x-1][y+2]=3;}
if(n.cp[x+1][y+2][0]==enemy&&n.cp[x+1][y+2][1]==3&&x+1<8&&y+2<8)
{ h=1; n.twop[x+1][y+2]=3;}
if(n.cp[x+2][y+1][0]==enemy&&n.cp[x+2][y+1][1]==3&&x+2<8&&y+1<8)
{ h=1; n.twop[x+2][y+1]=3;}
if(n.turn)
{ if(n.cp[x-1][y-1][0]==enemy&&n.cp[x-1][y-1][1]==1&&x-1>=0&&y-1>=0)
n.twop[x-1][y-1]=1;
if(n.cp[x-1][y+1][0]==enemy&&n.cp[x-1][y+1][1]==1&&x-1>=0&&y+1<8)
n.twop[x-1][y+1]=1;
}
else
{
if(n.cp[x+1][y-1][0]==enemy&&n.cp[x-1][y-1][1]==1&&x+1<8&&y-1>=0)
n.twop[x-1][y-1]=1;
if(n.cp[x+1][y+1][0]==enemy&&n.cp[x-1][y+1][1]==1&&x+1<8&&y+1<8)
n.twop[x-1][y+1]=1;
}
// check if any coin can block the single attack
if(v==1)
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{ if(n.twop[i][j]==1&&n.onep[i][j]==1)
c=0;
if(h)
if(n.twop[i][j]==3&&n.onep[i][j]==1)
c=0;
}
// see if the king can move
for(i=0;i<8&&found;i++)
for(j=0;j<8&&found;j++)
if(n.cp[i][j][0]==color&&n.cp[i][j][1]==6)
found=0;
p[0]=i-1-1; p[1]=j-1-1;
n.kingp[1][1]=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if((p[0]+i)>=0&&(p[0]+i)<8&&(p[1]+j)>=0&&(p[1]+j)<8)
if(n.cp[p[0]+i][p[1]+j][0]!=color)
{ p[0]=p[0]+i; p[1]=p[1]+j;
if(!kingind(1,0))
n.kingp[i][j]=1;
}
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(n.kingp[i][j]==1&&i!=1&&j!=1)
c=0;
return c;
}
void calpos()
{ int rc,rco;
if(n.cp[p[0]][p[1]][1]==-1)
printf("\nNo Coin\nselected\n");
else
{
if(n.cp[p[0]][p[1]][1]==1) //coin to move is a pawn
{ calppp(1); //calculate possible position for that pawn
if(n.onep[p[2]][p[3]]==1)
{ int j=1;
if(p[2]==0||p[2]==7)
j=promote();
n.cp[p[0]][p[1]][0]=-1;
n.cp[p[0]][p[1]][1]=-1;
if(n.turn)
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=15; }
else
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=0; }
rco=n.cp[p[2]][p[3]][1]; n.cp[p[2]][p[3]][1]=j;
if(kingind(1,0))
{ restore(1,rc,rco);
return;
}
n.turn=(n.turn+1)%2;
}
else
printf("\nNot a\n correct\nmove ");
}
if(n.cp[p[0]][p[1]][1]==2) //coin to move is a castle
{ calppc(1);
if(n.onep[p[2]][p[3]]==1)
{
n.cp[p[0]][p[1]][0]=-1;
n.cp[p[0]][p[1]][1]=-1;
if(n.turn)
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=15; }
else
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=0; }
rco=n.cp[p[2]][p[3]][1]; n.cp[p[2]][p[3]][1]=2;
if( kingind(1,0))
{ restore(2,rc,rco);
return;
}
n.turn=(n.turn+1)%2;
}
else
printf("\nNot a\n correct\nmove ");
}
if(n.cp[p[0]][p[1]][1]==3) //coin to move is a horse
{ calpph(1);
if(n.onep[p[2]][p[3]]==1)
{ n.cp[p[0]][p[1]][0]=-1;
n.cp[p[0]][p[1]][1]=-1;
if(n.turn)
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=15; }
else
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=0; }
rco=n.cp[p[2]][p[3]][1]; n.cp[p[2]][p[3]][1]=3;
if( kingind(1,0))
{ restore(3,rc,rco);
return;
}
n.turn=(n.turn+1)%2;
}
else
printf("\nNot a\n correct\nmove ");
}
if(n.cp[p[0]][p[1]][1]==4) //coin to move is a camel
{ calppca(1);
if(n.onep[p[2]][p[3]]==1)
{ n.cp[p[0]][p[1]][0]=-1;
n.cp[p[0]][p[1]][1]=-1;
if(n.turn)
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=15; }
else
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=0; }
rco=n.cp[p[2]][p[3]][1]; n.cp[p[2]][p[3]][1]=4;
if( kingind(1,0))
{ restore(4,rc,rco);
return;
}
n.turn=(n.turn+1)%2;
}
else
printf("\nNot a\n correct\nmove ");
}
if(n.cp[p[0]][p[1]][1]==5) //coin to move is a queen
{ calppq(1);
if(n.onep[p[2]][p[3]]==1)
{ n.cp[p[0]][p[1]][0]=-1;
n.cp[p[0]][p[1]][1]=-1;
if(n.turn)
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=15; }
else
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=0; }
rco=n.cp[p[2]][p[3]][1]; n.cp[p[2]][p[3]][1]=5;
if( kingind(1,0))
{ restore(5,rc,rco);
return;
}
n.turn=(n.turn+1)%2;
}
else
printf("\nNot a\n correct\nmove ");
}
if(n.cp[p[0]][p[1]][1]==6) //coin to move is a king
{ calppk();
if(n.onep[p[2]][p[3]]==1)
{ n.cp[p[0]][p[1]][0]=-1;
n.cp[p[0]][p[1]][1]=-1;
if(n.turn)
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=15; }
else
{ rc=n.cp[p[2]][p[3]][0]; n.cp[p[2]][p[3]][0]=0; }
rco=n.cp[p[2]][p[3]][1]; n.cp[p[2]][p[3]][1]=66;
if( kingind(1,0))
{ restore(6,rc,rco);
return;
}
n.turn=(n.turn+1)%2;
}
else
printf("\nNot a\n correct\nmove ");
}
if(kingind(1,0))
{ n.checked=1;
n.checkmate=checkmate();
}
else
n.checked=0;
if(n.checkmate)
{ closegraph();
drawboard();
if(n.turn)
printf("\n White Loses ");
else
printf("\n Black loses");
openmenu();
}
}}
void main()
{
clrscr();
n.turn=1;
n.checked=0;
leaf(0);
openmenu();
int a,b,c,d;
while(1){
goon=1;
printf("\nEnter coordinates");
if(n.turn)
printf(" for white");
else
printf(" for black");
if(n.checked)
printf(" YOU HAVE BEEN CHECKED");
if(goon)
{
printf("\nrow:");
a=getch();
if(a==27)
{ menu();
goon=0;
}
if(goon)
printf("%d",a-48);
}
if(goon)
{
printf("\ncolumn:");
b=getche();
if(b==27)
{ menu();
goon=0;
}
if(goon)
printf("%c",b);
}
if(goon)
{
printf("\nrow:");
c=getche();
if(c==27)
{ menu();
goon=0;
}
if(goon)
printf("%d",c-48);}
if(goon)
{
printf("\ncolumn:");
d=getche();
if(d==27)
{ menu();
goon=0;
}
if(goon)
printf("%c",d);
}
if(goon)
{ p[0]=(a-48-8)*-1;
b=toupper(b);
p[1]=b-65;
p[2]=(c-48-8)*-1;
d=toupper(d);
p[3]=d-65;
calpos();
getch();
}
closegraph();
drawboard();
}
}