/* Author : Narendrakumar Padmani Email : n.padmani@yahoo.co.uk */ #include #include #include int ws[4][4]={{0,0,0,0},{0,3,2,3},{0,2,4,2},{0,3,2,3}}; int ws2[4][4]={{0,0,0,0},{0,3,2,3},{0,2,4,2},{0,3,2,3}}; void copyarray(void) { int i,j; for(i=1;i<=4;i++) for(j=1;j<=4;j++) ws[i][j]=ws2[i][j]; } int getrow(int x) { return (x-1)/3+1; } int getcol(int y) { return (y-1)%3+1; } void putcircle(int block) { circle((getcol(block)-1)*100+50,(getrow(block)-1)*100+50,30); } void putchokdi(int block) { int r=getcol(block),c=getrow(block); r=100*(r-1)+50; c=100*(c-1)+50; line(r-30,c-30,r+30,c+30); line(r+30,c-30,r-30,c+30); } void grid(void) { line(100,0,100,300); line(200,0,200,300); line(0,100,300,100); line(0,200,300,200); } void print_array(void) { int i,j; clrscr(); for(i=1;i<=3;i++) { for(j=1;j<=3;j++) if(ws[i][j]==-1) printf(" x|"); else if(ws[i][j]==-2) printf(" 0|"); else printf(" |",ws[i][j]); printf("\n"); } return; } int get_highest(void) { int i,max=ws[1][1],key=1; for(i=2;i<=9;i++) if(ws[getrow(i)][getcol(i)]>max) { max=ws[getrow(i)][getcol(i)]; key=i; } return key; } void desc(int pos) { if(ws[getrow(pos)][getcol(pos)]>0) ws[getrow(pos)][getcol(pos)]--; return ; } void calculate(int pos) { int r,c,t; r=getrow(pos); c=getcol(pos); r=3*(r-1)+1; for(t=1;t<=3;t++) { desc(r); desc(c); r++; c+=3; } if(pos==1 || pos==5 || pos==9) { desc(1); desc(5); desc(9); } if(pos==3 || pos==5 || pos==7) { desc(3); desc(5); desc(7); } } int check2(int sym) { int i,j,t_sym,index,blank,k; for(i=1;i<=3;i++) { t_sym=0; blank=0; index=0; for(j=1;j<=3;j++) if(ws[i][j]==sym) t_sym++; else if(ws[i][j]>=0) { blank++; index=3*(i-1)+j; } if(t_sym==2 && blank==1) return index; } for(i=1;i<=3;i++) { t_sym=0; blank=0; index=0; for(j=1;j<=3;j++) if(ws[j][i]==sym) t_sym++; else if(ws[j][i]>=0) { blank++; index=3*(j-1)+i; } if(t_sym==2 && blank==1) return index; } t_sym=0; blank=0; for(k=3;k<=7;k+=2) { i=getrow(k); j=getcol(k); if(ws[i][j]==sym) t_sym++; else if(ws[i][j]>=0) { blank++; index=3*(i-1)+j; } if(t_sym==2 && blank==1) return index; } t_sym=0; blank=0; for(k=1;k<=9;k+=4) { i=getrow(k); j=getcol(k); if(ws[i][j]==sym) t_sym++; else if(ws[i][j]>=0) { blank++; index=3*(i-1)+j; } if(t_sym==2 && blank==1) return index; } return -1; } int count(void) { int i,j,k=0; for(i=1;i<=3;i++) for(j=1;j<=3;j++) if(ws[i][j]<0) k++; return k; } int dilemma(void) { if(count()==3 && ( (ws[1][1]==-1 && ws[3][3]==-1 && ws[2][2]==-2) || (ws[1][3]==-1 && ws[3][1]==-1 && ws[2][2]==-2))) return 1; else return -1; } int tictactoe_engine(void) { int i,r,c,index; while(1) { //print_array(); i=(getch()-48); if(i<0 || i>9) continue; if(i==0) return -1; r=getrow(i); c=getcol(i); if(ws[r][c]==-1 || ws[r][c]==-2) continue; ws[r][c]=-1; putchokdi(i); if((index=check2(-2))!=-1) { ws[getrow(index)][getcol(index)]=-2; putcircle(index); return 1; } else if((index=check2(-1))!=-1) { calculate(index); ws[getrow(index)][getcol(index)]=-2; putcircle(index); } else if(dilemma()==1) { index=8; calculate(index); ws[getrow(index)][getcol(index)]=-2; putcircle(index); } else { index=get_highest(); if(ws[getrow(index)][getcol(index)]>=0) { calculate(index); ws[getrow(index)][getcol(index)]=-2; putcircle(index); } } if(count()==9) return 0; } } int main(void) { int i; int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, ""); //setlinestyle(1,0,1); grid(); while(1) { i=tictactoe_engine(); if(i==1) outtextxy(400,400,"Computer Wins !"); else if(i==0) outtextxy(400,400,"Match Draw !"); else break; outtextxy(400,430,"To continue..press y"); if(getch()=='y') { cleardevice(); grid(); copyarray(); } else break; } closegraph(); return 0; }