/*
Mind Fighter
by Syed Mehroz Alam,
CIS-61, First Year, Sec-A, Batch 2002-03
Computer & Information Systems Dept,
NED University, Karachi, Pakistan.
Email: smehrozalam@yahoo.com
Date: 13-Dec-03
*/
#include
#include
#include
#include
#include
#include
#define MAX_ORDER 10
#define SIZE 50
#define board_posx 10
#define board_posy 10
#define player1 1
#define player2 2
#define empty 0
#define BallValue 1
#define STATE 5
#define F1_KEY 59
#define ColorP1 7
#define ColorP2 1
int order=7;
int balls1=0,balls2=0;
int board[MAX_ORDER][MAX_ORDER];
int ball[2]={player1, player2};
int computer=1;
int computer_level=1;
union REGS in,out;
int move;
//initializers for graphics mode and mouse
void graph_init(void);
int initmouse(void);
void showmouseptr(void);
void restrictmouseptr(int x1, int y1, int x2, int y2);
void getmousepos(int *button, int *x, int *y);
//displays the current position of board at (x,y)
void displayboard(int x, int y);
/*
the function returns the index of an element in a 2D array if its
starting address, size, no. of cols, and the given element's address is given
its a generic function that can be used for any type of array(int, char, etc)
*/
int find_element(void *starting_add, int cols, int size, void *element_add, int *x, int *y);
//checks if any player had won
int chkboard(void);
void ShowHelp(void);
/*
moves from (x1,y1) to (x2,y2),
move is the current move(helps to determine the current player)
*/
void do_move(int x1,int y1, int x2,int y2, int move);
/*
returns the position (how much good or bad) for a player
according to current situation of board
helps to determine the computer move
*/
int chk_playerpos(int player);
// determines the move for computer
void computer_move(int level, int move, int player);
/*
replicates a board,
used for determing computer move as the computer_move() uses simulation
*/
void copy_board(int srcboard[][MAX_ORDER], int newboard[][MAX_ORDER]);
void main(void)
{
clrscr();
textcolor(15);
gotoxy(35,4); cprintf("Mind Fighter");
gotoxy(35,5); cprintf("様様様様様様");
gotoxy(31,7); cprintf("by Syed Mehroz Alam");
gotoxy(20,9); cprintf("CIS-61, First Year, Sec-A, Batch 2002-03");
gotoxy(20,10); cprintf(" Computer & Information Systems Dept,");
gotoxy(20,11); cprintf(" NED University, Karachi, Pakistan.");
gotoxy(20,13); cprintf(" Email: smehrozalam@yahoo.com");
gotoxy(20,16); cprintf(" Press any key to begin......");
getch();
textcolor(7);
printf("\n\n\t\tPlay versus Computer (y/n) ");
char ch;
if ( (ch=getch())=='n' || ch=='N' )
computer=3;
else
{
printf("\n\t\tComputer is player 1(white) or 2(blue) ");
if ( (ch=getch())=='1' )
computer=0;
else
computer=1;
}
graph_init();
// setbkcolor(3);
int maxx=getmaxx(), maxy=getmaxy(), x, y, button;
if (initmouse()==0)
{
outtextxy(400,425, "Can't Initialize Mouse..");
outtextxy(400,450, "Press any key to exit...");
getch();
closegraph();
exit(0);
}
int click_x, click_y,i,j,temp_x, temp_y,move=0,x1,y1;
int *selected=NULL;
board[0][0]=board[order-1][order-1]=ball[0];
board[0][order-1]=board[order-1][0]=ball[1];
restrictmouseptr(0,0,maxx-9,maxy-9);
showmouseptr();
displayboard(board_posx, board_posy);
int balls1,balls2;
while ( 1 )
{
chkboard();
if (::balls1!=balls1 || ::balls2!=balls2)
{
balls1=::balls1;
balls2=::balls2;
char temp[30];
setcolor(0);
setfillstyle(1,0);
fillellipse(450,20,100,10);
setcolor(7);
sprintf( temp, "White balls: %d", balls1 );
outtextxy(400, 10, temp);
sprintf( temp, "Blue balls: %d", balls2 );
outtextxy(400, 20, temp);
}
if ( kbhit() )
{
if ( (ch=getch())==27 ) // if escape key
break;
if (ch=='\r') // if enter then move given to other player
{
move++;
selected=NULL;
}
if (ch==0) // if special key
if ( (ch=getch())==F1_KEY )
{
ShowHelp();
displayboard(board_posx, board_posy);
char temp[30];
setcolor(0);
setfillstyle(1,0);
fillellipse(450,20,100,10);
setcolor(7);
sprintf( temp, "White balls: %d", balls1 );
outtextxy(400, 10, temp);
sprintf( temp, "Blue balls: %d", balls2 );
outtextxy(400, 20, temp);
}
}
if (computer==move%2) // if computer's move
{
computer_move(computer_level, move, move%2);
move++;
cleardevice();
displayboard(board_posx, board_posy);
}
getmousepos(&button, &x, &y);
// if (selected==NULL)
// displayboard(board_posx, board_posy);
if (button==1 && temp_x!=x && temp_y!=y)
{
click_x=(x-board_posx)/SIZE;
click_y=(y-board_posy)/SIZE;
temp_x=x;
temp_y=y;
if ( click_x>=0 && click_y>=0 && click_x<=order-1 && click_y<=order-1 ) // if clicked inside board
{
if ( board[click_y][click_x]==ball[move%2] ) // if clicked on current player's ball
{
cleardevice();
displayboard(board_posx, board_posy);
// printf("sel=(%d,%d)",click_y, click_x);
selected=&board[click_y][click_x];
setcolor(2);
ellipse(board_posx+click_x*SIZE+SIZE/2, board_posy+click_y*SIZE+SIZE/2, 0, 360, SIZE/2-5, SIZE/2-5);
for (i=click_y-2 ; i<=click_y+2 ; i++)
for (j=click_x-2 ; j<=click_x+2 ; j++)
{
if (i<0 || j<0 || i>order-1 || j>order-1 || board[i][j]!=empty)
continue;
rectangle(board_posx+j*SIZE, board_posy+i*SIZE, board_posx+j*SIZE+SIZE, board_posy+i*SIZE+SIZE);
}
setcolor(15);
} // end if clicked on current player's ball
else if ( board[click_y][click_x]==empty && selected!=NULL ) // if made a move
{
find_element(board, MAX_ORDER, sizeof(board[0][0]), selected, &x1, &y1);
if ( click_yy1+2 || click_xx1+2 ) // if incorrect move
continue; // dont move
// else if correct move
setfillstyle(1,3);
fillellipse(board_posx+click_x*SIZE+SIZE/2, board_posy+click_y*SIZE+SIZE/2, SIZE/2-5, SIZE/2-5);
delay(500);
do_move(x1, y1, click_x,click_y, move);
selected=NULL;
move++;
cleardevice();
displayboard(board_posx, board_posy);
}
} // end if clicked inside board;
} // end if (button==1)
}
closegraph();
}
void graph_init(void)
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "..\\bgi");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* terminate with an error code */
}
}
int initmouse(void)
{
in.x.ax=0;
int86(0x33,&in, &out);
return(out.x.ax);
}
void showmouseptr(void)
{
in.x.ax=1;
int86(0x33, &in, &out);
}
void restrictmouseptr(int x1, int y1, int x2, int y2)
{
in.x.ax=7;
in.x.cx=x1;
in.x.dx=x2;
int86(0x33,&in, &out);
in.x.ax=8;
in.x.cx=y1;
in.x.dx=y2;
int86(0x33, &in, &out);
}
void getmousepos(int *button, int *x, int *y)
{
in.x.ax=3;
int86(0x33, &in, &out);
*button=out.x.bx;
*x=out.x.cx;
*y=out.x.dx;
}
void displayboard(int x, int y)
{
setcolor(15);
outtextxy(100,440,"Press F1 for help");
for (int i=0;ip2_balls)
outtextxy(400,40,"Player 1(White) won");
else if (p1_ballsorder-1 || l>order-1 || board[k][l]!=empty)
continue;
do_move(j,i,l,k,move);
::move=move;
temp_pos=chk_playerpos(player);
/* cleardevice();
displayboard(board_posx, board_posy);
char temp[10];
sprintf(temp, "pos2=%d",temp_pos);
outtextxy(500,300,temp);
setcolor(0);
setfillstyle(1,0);
fillellipse(550,320,70,10);
setcolor(7);
// getch();
*/
if (temp_pos>pos)
// if ( (player==1 && temp_pos>pos) || (player==0 && temp_posy1+1 || x2x1+1 ) // if not adjacent
board[y1][x1]=empty; // then jump i.e. erase previous ball
// capture all adjacent opposite players' balls
for (int i=y2-1 ; i<=y2+1; i++)
for (int j=x2-1 ; j<=x2+1; j++)
{
if (i<0 || j<0 || i>order-1 || j>order-1 || board[i][j]==empty )
continue;
else
board[i][j]=ball[move%2];
}
}
void ShowHelp(void)
{
cleardevice();
setcolor(7);
outtextxy(10,20, "The aim of this game is to have your balls greater in number than your");
outtextxy(10,35, "opponents', until the board fills up or until your opponent has lost all");
outtextxy(10,50, "his balls. When you move your ball to an adjacent square(out of 8), it");
outtextxy(10,65, "replicates itself. When you move one level higher(the next 16 boxes), the");
outtextxy(10,80, "ball jumps from its original position and loses its previous place.");
outtextxy(10,95, "Whenever you move, you capture all your opponents balls adjacent to your ball.");
outtextxy(10,130, "How To Play:");
outtextxy(10,145, "Whenever a ball is clicked, its possible moves are highlighted. Click on the");
outtextxy(10,160, "target box to place your ball on it.");
outtextxy(10,175, "Pressing during the game play cancels the current player's move");
outtextxy(10,190, " (useful if you have no legal move left).");
setcolor(15);
outtextxy(200,300, "Press any key to return to game");
getch();
setcolor(7);
cleardevice();
}
               (
geocities.com/smehrozalam)