/*
Syed Mehroz Alam
CIS-61, First Year, Sec-A, Batch 2002-03
Computer & Information Systems Dept,
NED University, Karachi, Pakistan.
Email: smehrozalam@yahoo.com

13-June-2003
*/

#include
#include
#include
#include
#include
#include

#define ENTER_KEY '\r'
#define ESCAPE_KEY 27
#define SPECIAL_KEY 0
#define UP_ARROW 72
#define DOWN_ARROW 80
#define LEFT_ARROW 75
#define RIGHT_ARROW 77
#define pos_cursor(x,y) gotoxy(x*4+2,y*2+2)

// The following two parameters can be changed as per needed
const ORDER=3;		// determines the order of the board
const level=3;		// determines the computer level (1=easiest)


char board[ORDER][ORDER];
int computer=1;
int pos;

//The functions' purposes are evident from their names
void display(void);
void empty_board(void);
void input(int player);
int chkboard(void);	//checks if any player has won
void counter_move(int player, int *best_i, int *best_j, int *best_pos);
void best_move(int player);

void main(void)
{
	clrscr();
	empty_board();

	textcolor(15);
	cprintf("Tic Tac Toe\n\r\n\r");
	cprintf("Made by Syed Mehroz Alam\n\r");
	cprintf("CIS-61, First Year, Batch 2002-03, \n\r");
	cprintf("Computer & Information Systems Dept, \n\rNED University.\n\r" );
	cprintf("Email: smehrozalam@yahoo.com" );
	textcolor(7);


	printf("\n\n\nDo you want to play versus COMPUTER ('n' for no) :");
	char opt=getch();
	if ( opt=='n' || opt=='N') computer=0;

	int player=1, win=0,turn=1;
	display();
	do
	{
		printf("\nPlayer %d move \n", player);
		printf("\nPress arrow keys to move, then press  to place your mark");
		input(player);
		display();
		win=chkboard();
		player=(player==1)?2:1;
		turn++;
	}
	  while ( win==0 && turn<=ORDER*ORDER );
	if (win) printf("\nPlayer %d won",win);
	else printf("\nDraw");
	printf("\n\nPlay again (y for yes) ");
	opt=getch();
	if ( opt=='y' || opt=='Y')
		main();
	else
		exit(0);
	getch();

}

void empty_board(void)
{
	for (int i=0;iORDER-1) x=ORDER-1;
				else if (y<0) y=0;
				else if (y>ORDER-1) y=ORDER-1;
				pos_cursor(x,y);
			}
		}
	}
	  while(board[y][x]!=NULL);

	char mark=(player==1)?'X':'O';
	board[y][x]=mark;

}

int chkboard(void)
{
	int player2_position=0;
	int player1,player2;

	//rows and cols check
	for (int k=0;k<2;k++)
		for (int i=0;i=0 && tmp_i[cnt]!=-1)
				{
					board[tmp_i[cnt]][tmp_j[cnt]]=NULL;
					cnt--;
				}

				if (player==2)
				{
					if ( tot_postemp_pos )
					{
						best_i=i;
						best_j=j;
						tot_pos=temp_pos;
					}

				board[i][j]=NULL;
			}  	// end if (board==NULL)

	board[best_i][best_j]=mark[player];
//	printf("i=%d,j=%d,pos=%d", best_i,best_j,best_pos);

}


void counter_move(int player, int *best_i, int *best_j, int *best_pos)
{
	*best_i=*best_j=-1;
	char mark=(player==1)?'X':'O';
	*best_pos=(player==1)?3276:-3276;

	for (int i=0;ipos )
					{
						*best_i=i;
						*best_j=j;
						*best_pos=pos;
					}

				board[i][j]=NULL;
			}  	// end if (board==NULL)
	if (*best_i==-1)
		*best_pos=0;//(player==2)?3276:-3276;

	return;
}

    Source: geocities.com/smehrozalam/source

               ( geocities.com/smehrozalam)