#include
#include
#include
#include
#include
/* INITIALIZE ARRAY */
int Status[8][8]={{1,5,1,5,1,5,1,5},{5,1,5,1,5,1,5,1},{1,5,1,5,1,5,1,5},{5,0,5,0,5,0,5,0},{0,5,0,5,0,5,0,5},{5,3,5,3,5,3,5,3},{3,5,3,5,3,5,3,5},{5,3,5,3,5,3,5,3}};
/* DRAW DAMA BOARD */
void DAMABOARD ()
{
cleardevice();
setcolor(14); settextstyle(SANS_SERIF_FONT,HORIZ_DIR,3);
outtextxy(335,70 ," LET'S PLAY CHECKERS!");
setcolor(10); settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
outtextxy(320,100," ÉÍËÍËÍËÍËÍËÍËÍËÍ»");
outtextxy(320,115,"0º º º º º º º º º");
outtextxy(320,130," ÌÍÎÍÎÍÎÍÎÍÎÍÎÍÎ͹");
outtextxy(320,145,"1º º º º º º º º º");
outtextxy(320,160," ÌÍÎÍÎÍÎÍÎÍÎÍÎÍÎ͹");
outtextxy(320,175,"2º º º º º º º º º");
outtextxy(320,190," ÌÍÎÍÎÍÎÍÎÍÎÍÎÍÎ͹");
outtextxy(320,205,"3º º º º º º º º º");
outtextxy(320,220," ÌÍÎÍÎÍÎÍÎÍÎÍÎÍÎ͹");
outtextxy(320,235,"4º º º º º º º º º");
outtextxy(320,250," ÌÍÎÍÎÍÎÍÎÍÎÍÎÍÎ͹");
outtextxy(320,265,"5º º º º º º º º º");
outtextxy(320,280," ÌÍÎÍÎÍÎÍÎÍÎÍÎÍÎ͹");
outtextxy(320,295,"6º º º º º º º º º");
outtextxy(320,310," ÌÍÎÍÎÍÎÍÎÍÎÍÎÍÎ͹");
outtextxy(320,325,"7º º º º º º º º º");
outtextxy(320,340," ÈÍÊÍÊÍÊÍÊÍÊÍÊÍÊͼ");
outtextxy(320,355," 0 1 2 3 4 5 6 7 ");
setcolor(11); settextstyle(SMALL_FONT,HORIZ_DIR,5);
outtextxy(5,380," Direction:");
outtextxy(5,400," Press a number from 0 to 7, to get the row and column value.");
outtextxy(5,420," Press
}
/* ADJUST ROW VALUE */
int AdjX(int X)
{ return (30 * X) + 113; }
/* ADJUST COLUMN VALUE */
int AdjY(int Y)
{ return (32 * Y) + 352; }
/* DRAW BLOCKS AND GAME STATUS TAKEN FROM THE ARRAY */
void DRAWBOARD()
{
int X,Y; int XO,YO;
for(Y=0; Y<8; Y++)
{
for(X=0; X<8; X++)
{
XO = AdjX(X); YO = AdjY(Y);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
/* FIELD IS EMPTY */
if(Status[X][Y] == 0) { setcolor(0); outtextxy(YO,XO," "); }
/* FIELD IS OCCUPIED BY PLAYER 1 PIECE */
if(Status[X][Y] == 1) { setcolor(4); outtextxy(YO,XO,""); }
/* FIELD IS OCCUPIED BY PLAYER 1 PIECE WITH CROWN */
if(Status[X][Y] == 2) { setcolor(6); outtextxy(YO,XO,""); }
/* FIELD IS OCCUPIED BY PLAYER 2 PIECE */
if(Status[X][Y] == 3) { setcolor(9); outtextxy(YO,XO,""); }
/* FIELD IS OCCUPIED BY PLAYER 2 PIECE WITH CROWN */
if(Status[X][Y] == 4) { setcolor(11); outtextxy(YO,XO,""); }
/* FIELD IS FOR BLOCKS */
if(Status[X][Y] == 5) { setcolor(10); outtextxy(YO,XO,"±"); }
}
}
}
/* CHECK IF PLAYER 1 WINS */
int Check01win()
{
int X01,Y01;
int win = 0;
for(X01=0; X01<8; X01++)
{ for(Y01=0; Y01<8; Y01++)
/* CHECK IF PLAYER 2 STILL HAS A PIECE */
{ if(Status[X01][Y01] == 3 || Status[X01][Y01] == 4)
{ win = 1; break; }
} if(win == 1) { break; }
}
return win;
}
/* CHECK IF PLAYER 2 WINS */
int Check02win()
{
int X02,Y02;
int win = 0;
for(X02=0; X02<8; X02++)
{ for(Y02=0; Y02<8; Y02++)
/* CHECK IF PLAYER 1 STILL HAS A PIECE */
{ if(Status[X02][Y02] == 1 || Status[X02][Y02] == 2)
{ win = 1; break; }
} if(win == 1) { break; }
}
return win;
}
/* DRAW PLAYER WINS */
void DRAWWINS()
{
setfillstyle(SOLID_FILL,0); bar(1,295,312,325);
setcolor(11); settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(1,295,"ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð");
outtextxy(1,303,"ð ð");
outtextxy(1,311,"ð ð");
outtextxy(1,318,"ð ð");
outtextxy(1,325,"ð ð");
outtextxy(1,332,"ð ð");
outtextxy(1,339,"ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð");
setcolor(10); settextstyle(TRIPLEX_FONT,HORIZ_DIR,4);
outtextxy(30,305,"PLAYER WINS!");
}
/* RETURNS SIGN OF NUMBERS
If Number is Positive SGN returns 1
If Number is Negative SGN returns -1
If Number is Zero SGN returns 0
*/
int SGN(int Num)
{
int SGN_Val;
if(Num < 0) { SGN_Val = -1; }
if(Num > 0) { SGN_Val = 1; }
if(Num == 0) { SGN_Val = 0; }
return SGN_Val;
}
/* GET'S INPUT FROM PLAYERS */
char GetInput()
{
char Ans='N';
int NumericVal=-1;
NumericVal = getch();
do
{
switch(NumericVal)
{
case 27:
/* IF PLAYER PRESS
goto Eksit;
default:
/* CONVERTS THE ASCII VALUE FROM GETCH() KEYPRESS TO NUMERIC VALUE */
NumericVal = NumericVal - 48;
if(NumericVal >= 0 && NumericVal <= 7)
{ printf("%d",NumericVal); }
else
{ NumericVal = getch(); }
}
} while(NumericVal <> 7);
return NumericVal;
Eksit:
setfillstyle(SOLID_FILL,0); bar(1,295,312,325);
setfillstyle(SOLID_FILL,3); bar(1,295,312,325);
setcolor(11); settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(1,295,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿");
outtextxy(1,303,"³ ³");
outtextxy(1,311,"³ ³");
outtextxy(1,319,"ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ");
setcolor(14); settextstyle(SMALL_FONT,HORIZ_DIR,5);
outtextxy(10,303,"Are you sure you want to exit? [Y/N]:");
gotoxy(38,20); scanf("%c",&Ans);
if(toupper(Ans) != 'Y' && toupper(Ans) != 'N')
{ goto Eksit; }
else
{
if(toupper(Ans) == 'Y')
/* QUIT PROGRAM */
{ closegraph();
exit(1);
}
else
/* CLEAR THE CONFIRMATION FIELD AND RETURN GETTING INPUT */
{ setfillstyle(SOLID_FILL,0); bar(1,295,312,325);
GetInput();
}
}
}
int main()
{
char Tapos = 'N';
int FR01row,FR01col,TO01row,TO01col;
int FR02row,FR02col,TO02row,TO02col;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
while(Tapos == 'N')
{
Play:
DAMABOARD();
DRAWBOARD();
Play01Moves:
/* PLAYER 1 MOVES, GIVING [FROM AND TO] ROW-COLUMN VALUE */
setfillstyle(SOLID_FILL,15); bar(4,39,271,81);
setfillstyle(SOLID_FILL,2); bar(5,40,270,80);
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
setcolor(4); outtextxy(10,50,"");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,50,"Player's turn to move");
setfillstyle(SOLID_FILL,0); bar(5,100,270,200);
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
setcolor(4); outtextxy(10,105,"");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,105,"from row : ");
/* LET "FR01row" THE VALID KEYPRESS VALUE FOR [FROM-ROW] */
gotoxy(22,8); FR01row = GetInput();
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
setcolor(4); outtextxy(10,135,"");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,135,"from col : ");
/* LET "FR01col" THE VALID KEYPRESS VALUE FOR [FROM-COLUMN] */
gotoxy(22,10); FR01col = GetInput();
/* CHECK IF FROM [ROW-COLUMN] FIELD IS A PIECE OF PLAYER 1 */
if(Status[FR01row][FR01col] != 1 && Status[FR01row][FR01col] != 2)
{ goto Play01Moves; }
/* DISPLAY THE STATUS OF THE FIELD FROM ROW-COLUMN VALUE FOR PLAYER 1 */
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
if(Status[FR01row][FR01col] == 1)
{ setcolor(4); outtextxy(40,250,""); }
if(Status[FR01row][FR01col] == 2)
{ setcolor(6); outtextxy(40,250,""); }
/* DISPLAY THE VALID ROW-COLUMN VALUE FOR PLAYER 1 */
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(11); outtextxy(80,250,"From ( )");
gotoxy(20,17); printf("%d,%d",FR01row,FR01col);
setfillstyle(SOLID_FILL,0); bar(5,100,270,200);
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
if(Status[FR01row][FR01col] == 1)
{ setcolor(4); outtextxy(10,105,""); }
if(Status[FR01row][FR01col] == 2)
{ setcolor(6); outtextxy(10,105,""); }
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,105,"to row : ");
/* LET "TO01row" THE VALID KEYPRESS VALUE FOR [TO-ROW] */
gotoxy(22,8); TO01row = GetInput();
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
setcolor(4); outtextxy(10,135,"");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,135,"to col : ");
/* LET "TO01col" THE VALID KEYPRESS VALUE FOR [TO-COLUMN] */
gotoxy(22,10); TO01col = GetInput();
/* CHECK IF DESTINATION [ROW-COLUMN] FIELD IS NOT EMPTY */
if(Status[TO01row][TO01col] != 0)
{ goto Play01Moves; }
/* CHECK IF DESTINATION TO-ROW OR TO-COLUMN IS NOT
ON THE SAME FROM-ROW OR FROM-COLUMN POSITION */
if(TO01row == FR01row || TO01col == FR01col)
{ goto Play01Moves; }
/* CHECK IF DESTINATION TO-ROW OR TO-COLUMN IS AN EQUAL ROW-COLUMN VALUE */
if(abs(TO01col - FR01col) != abs(TO01row - FR01row))
{ goto Play01Moves; }
/* CHECK IF PLAYER 1 PIECE MOVES BACKWARD AND IS NOT A CROWNED PIECE */
if(SGN(TO01row - FR01row) == -1 && Status[FR01row][FR01col] != 2 && abs(TO01row - FR01row) == 1)
{ goto Play01Moves; }
/* ONLY DESTINATION ROW-COLUMN NOT MORE THAN 2 IS VALID */
if(abs(TO01col - FR01col) > 2)
{ goto Play01Moves; }
/* IF PLAYER 1 PIECE CONQUERS A PLAYER 2 PIECE
EMPTY THE FIELD OF PLAYER 2 PIECE */
if(abs(TO01col - FR01col) == 2)
{
if(SGN(TO01col - FR01col) == 1)
{
if(SGN(TO01row - FR01row) == -1)
{
if(Status[FR01row - 1][FR01col + 1] == 3 || Status[FR01row - 1][FR01col + 1] == 4)
{ Status[FR01row - 1][FR01col + 1] = 0; }
else
{ goto Play01Moves; }
}
if(SGN(TO01row - FR01row) == 1)
{
if(Status[FR01row + 1][FR01col + 1] == 3 || Status[FR01row + 1][FR01col + 1] == 4)
{ Status[FR01row + 1][FR01col + 1] = 0; }
else
{ goto Play01Moves; }
}
}
if(SGN(TO01col - FR01col) == -1)
{
if(SGN(TO01row - FR01row) == -1)
{
if(Status[FR01row - 1][FR01col - 1] == 3 || Status[FR01row - 1][FR01col - 1] == 4)
{ Status[FR01row - 1][FR01col - 1] = 0; }
else
{ goto Play01Moves; }
}
if(SGN(TO01row - FR01row) == 1)
{
if(Status[FR01row + 1][FR01col - 1] == 3 || Status[FR01row + 1][FR01col - 1] == 4)
{ Status[FR01row + 1][FR01col - 1] = 0; }
else
{ goto Play01Moves; }
}
}
}
/* IF PLAYER 1 GETS A CROWN, CHANGE ITS STATUS ON THE FIELD TO 2 */
if(TO01row == 7) { Status[FR01row][FR01col] = 2; }
/* TRANSFER THE PIECE TO ITS DESTINATION FIELD */
Status[TO01row][TO01col] = Status[FR01row][FR01col];
/* EMPTY THE FROM ROW-COLUMN FIELD */
Status[FR01row][FR01col] = 0;
DAMABOARD();
DRAWBOARD();
/* CHECK IF PLAYER 1 WINS. IF RETURNED VALUE IS ZERO, PLAYER 1 WINS! */
if(Check01win() == 0){ Tapos = 'Y'; goto Gana01; }
Play02Moves:
/* PLAYER 2 MOVES, GIVING [FROM AND TO] ROW-COLUMN VALUE */
setfillstyle(SOLID_FILL,15); bar(4,39,271,81);
setfillstyle(SOLID_FILL,2); bar(5,40,270,80);
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
setcolor(9); outtextxy(10,50,"");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,50,"Player's turn to move");
setfillstyle(SOLID_FILL,0); bar(5,100,270,200);
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
setcolor(9); outtextxy(10,105,"");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,105,"from row : ");
/* LET "FR02row" THE VALID KEYPRESS VALUE FOR [FROM-ROW] */
gotoxy(22,8); FR02row = GetInput();
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
setcolor(9); outtextxy(10,135,"");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,135,"from col : ");
/* LET "FR02col" THE VALID KEYPRESS VALUE FOR [FROM-COLUMN] */
gotoxy(22,10); FR02col = GetInput();
/* CHECK IF FROM [ROW-COLUMN] FIELD IS A PIECE OF PLAYER 2 */
if(Status[FR02row][FR02col] != 3 && Status[FR02row][FR02col] != 4)
{ goto Play02Moves; }
/* DISPLAY THE STATUS OF THE FIELD FROM ROW-COLUMN VALUE FOR PLAYER 2 */
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
if(Status[FR02row][FR02col] == 3)
{ setcolor(9); outtextxy(40,250,""); }
if(Status[FR02row][FR02col] == 4)
{ setcolor(11); outtextxy(40,250,""); }
/* DISPLAY THE VALID ROW-COLUMN VALUE FOR PLAYER 2 */
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(11); outtextxy(80,250,"From ( )");
gotoxy(20,17); printf("%d,%d",FR02row,FR02col);
setfillstyle(SOLID_FILL,0); bar(5,100,270,200);
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
if(Status[FR02row][FR02col] == 3)
{ setcolor(9); outtextxy(10,105,""); }
if(Status[FR02row][FR02col] == 4)
{ setcolor(11); outtextxy(10,105,""); }
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,105,"to row : ");
/* LET "TO02row" THE VALID KEYPRESS VALUE FOR [TO-ROW] */
gotoxy(22,8); TO02row = GetInput();
settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
setcolor(9); outtextxy(10,135,"");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
setcolor(15); outtextxy(40,135,"to col : ");
/* LET "TO02col" THE VALID KEYPRESS VALUE FOR [TO-COLUMN] */
gotoxy(22,10); TO02col = GetInput();
/* CHECK IF DESTINATION [ROW-COLUMN] FIELD IS NOT EMPTY */
if(Status[TO02row][TO02col] != 0)
{ goto Play02Moves; }
/* CHECK IF DESTINATION TO-ROW OR TO-COLUMN IS NOT
ON THE SAME FROM-ROW OR FROM-COLUMN POSITION */
if(TO02row == FR02row || TO02col == FR02col)
{ goto Play02Moves; }
/* CHECK IF DESTINATION TO-ROW OR TO-COLUMN IS AN EQUAL ROW-COLUMN VALUE */
if(abs(TO02col - FR02col) != abs(TO02row - FR02row))
{ goto Play02Moves; }
/* CHECK IF PLAYER 2 PIECE MOVES BACKWARD AND IS NOT A CROWNED PIECE */
if(SGN(TO02row - FR02row) == 1 && Status[FR01row][FR01col] != 4 && abs(TO02row - FR02row) == 1)
{ goto Play02Moves; }
/* ONLY DESTINATION ROW-COLUMN NOT MORE THAN 2 IS VALID */
if(abs(TO02col - FR02col) > 2)
{ goto Play02Moves; }
/* IF PLAYER 2 PIECE CONQUERS A PLAYER 1 PIECE
EMPTY THE FIELD OF PLAYER 1 PIECE */
if(abs(TO02col - FR02col) == 2)
{
if(SGN(TO02col - FR02col) == 1)
{
if(SGN(TO02row - FR02row) == -1)
{
if(Status[FR02row - 1][FR02col + 1] == 1 || Status[FR02row - 1][FR02col + 1] == 2)
{ Status[FR02row - 1][FR02col + 1] = 0; }
else
{ goto Play02Moves; }
}
if(SGN(TO02row - FR02row) == 1)
{
if(Status[FR02row + 1][FR02col + 1] == 1 || Status[FR02row + 1][FR02col + 1] == 2)
{ Status[FR02row + 1][FR02col + 1] = 0; }
else
{ goto Play02Moves; }
}
}
if(SGN(TO02col - FR02col) == -1)
{
if(SGN(TO02row - FR02row) == -1)
{
if(Status[FR02row - 1][FR02col - 1] == 1 || Status[FR02row - 1][FR02col - 1] == 2)
{ Status[FR02row - 1][FR02col - 1] = 0; }
else
{ goto Play02Moves; }
}
if(SGN(TO02row - FR02row) == 1)
{
if(Status[FR02row + 1][FR02col - 1] == 1 || Status[FR02row + 1][FR02col - 1] == 2)
{ Status[FR02row + 1][FR02col - 1] = 0; }
else
{ goto Play02Moves; }
}
}
}
/* IF PLAYER 2 GETS A CROWN, CHANGE ITS STATUS ON THE FIELD TO 4 */
if(TO02row == 0) { Status[FR02row][FR02col] = 4; }
/* TRANSFER THE PIECE TO ITS DESTINATION FIELD */
Status[TO02row][TO02col] = Status[FR02row][FR02col];
/* EMPTY THE FROM ROW-COLUMN FIELD */
Status[FR02row][FR02col] = 0;
DRAWBOARD();
/* CHECK IF PLAYER 2 WINS. IF RETURNED VALUE IS ZERO, PLAYER 2 WINS! */
if(Check02win() == 0) { Tapos = 'Y'; goto Gana02; }
/* IF NO ONE WINS, CONTINUE PLAYING... */
if(Tapos == 'N') { goto Play; }
Gana01:
/* DISPLAYS A WINNING MESSAGE FOR PLAYER 1
AND EXITS THE SYSTEM */
DRAWWINS();
setcolor(4); settextstyle(DEFAULT_FONT,HORIZ_DIR,4);
outtextxy(155,305,"");
getch();
closegraph();
exit(0);
Gana02:
/* DISPLAYS A WINNING MESSAGE FOR PLAYER 2
AND EXITS THE SYSTEM */
DRAWWINS();
setcolor(9); settextstyle(DEFAULT_FONT,HORIZ_DIR,4);
outtextxy(155,305,"");
getch();
closegraph();
exit(0);
}
}

No comments:
Post a Comment