//Tic Tac Toe Game //MADE BY GAURANG //Email : gaurang85@rediffmail.com //This code is redistributed under the GPL please visit www.gnu.org to get more info. #include #include #include #include #define RIGHT 19712 #define LEFT 19200 #define UP 18432 #define DOWN 20480 #define pen(cube,clr) {setlinestyle(0,0,1);setcolor(clr);moveto(place[cube].col+20,place[cube].row);linerel(2,-4);linerel(17,-17);linerel(1,3);linerel(-17,17);linerel(-4,2);} int check_win(int a); int arr[3][3] = {0,0,0,0,0,0,0,0,0}; void draw_g(void); int check_cube(int cube,int ai); int check[] = {0,0,0,0,0,0,0,0,0}; int comp_ai(void); int win1=0,win2=0,total=0,play=1,code,pos; void move(); struct rc { int col; int row; }place[10]; int main(void) { while(play==1) { int p=1,i=1,q,w=0,c=0,ai; system("clear"); printf("\n\n Please Choose : \n 1. Player 1 vs Player 2 \n 2. Player 1 vs Copmuter \n ::"); scanf("%d",&ai); while(i<=9) { draw_g(); if(ai==2&&p==2) { q=comp_ai(); } else { //printf("\n Player %d enter cube number : ",p); //scanf("%d",&q); move(); q=pos; } /* Check If Cube Already Occpied */ c = check_cube(q,2); while(c==1) { printf("\n Cube Already Occupied ... \n Player %d enter cube number : ",p); scanf("%d",&q); /*Re-Check*/ c=check_cube(q,2); } //put in the array if(q<=3) { arr[0][q-1]=p; } else if(q>3&&q<=6) { arr[1][q-4]=p; } else if(q>6&&q<=9) { arr[2][q-7]=p; } w = check_win(p); if(w!=1) { if(p==1) { p=2; } else { p=1; } } else { i=10; } i=i+1; } draw_g(); if(w==1) { printf("\n\n Player %d WINS ",p); total=total+1; if(p==1) { win1=win1+1; } else if(p==2) { win2=win2+1; } } else { printf("\n\n No Winner ....... \n\n REMEMBER ..... THERE IS NO GAME OVER !!! \n\n"); total=total+1; } printf("\n\n\n\n\n DO YOU WANT TO PLAY AGAIN (Yes=1,No=2) > "); scanf("%d",&play); if(play==1) { for(i=0;i<3;i++) { for(c=0;c<3;c++) { arr[i][c] = 0; } } for(i=0;i<9;i++) { check[i] = 0; } } } return 0; } //CHECK TO SEE WINNER int check_win(int a) { if(arr[0][0]==a&&((arr[0][1]==a&&arr[0][2]==a)||(arr[1][0]==a&&arr[2][0]==a)||(arr[1][1]==a&&arr[2][2]==a))) { return 1; } else if((arr[0][1]==a&&arr[1][1]==a&&arr[2][1]==a)||(arr[1][0]==a&&arr[1][1]==a&&arr[1][2]==a)||(arr[2][0]==a&&arr[2][1]==a&&arr[2][2]==a)) { return 1; } else if(arr[0][2]==a&&((arr[1][2]==a&&arr[2][2]==a)||(arr[1][1]==a&&arr[2][0]==a))) { return 1; } else { return 0; } } //DRAW CROSS & NUTS ON SCREEN void draw_g(void) { int gd=DETECT,gm; int i,j,x,y,p; initgraph(&gd,&gm,"C:\\TC\\bgi"); x=getmaxx()+1; y=getmaxy()+1; settextjustify(1,1); setbkcolor(BLACK); setcolor(WHITE); line(x/3,0,x/3,y); line(2*x/3,0,2*x/3,y); line(0,y/3,x,y/3); line(0,2*y/3,x,2*y/3); place[1].col=x/6;place[1].row=y/6; place[2].col=x/2;place[2].row=y/6; place[3].col=5*x/6;place[3].row=y/6; place[4].col=x/6;place[4].row=y/2; place[5].col=x/2;place[5].row=y/2; place[6].col=5*x/6;place[6].row=y/2; place[7].col=x/6;place[7].row=5*y/6; place[8].col=x/2;place[8].row=5*y/6; place[9].col=5*x/6;place[9].row=5*y/6; // printf("\n Player 1 (Wins) = %d \t Player 2 (Wins) = %d \t Draws = %d \t Total = %d \n\n",win1,win2,total-(win1+win2) ,total); /* To Convert 2D Array Into single digit */ for(i=0;i<3;i++) { for(j=0;j<3;j++) { if(i==0){p=j+1;}else if(i==1){p=j+4;}else if(i==2){p=j+7;} if(arr[i][j]==1) { setcolor(RED); setlinestyle(0,0,3); line(place[p].col-50,place[p].row-50,place[p].col+50,place[p].row+50); line(place[p].col-50,place[p].row+50,place[p].col+50,place[p].row-50); //printf("\tX"); } else if(arr[i][j]==2) { setcolor(WHITE); setlinestyle(0,0,3); circle(place[p].col,place[p].row,50); //printf("\tO"); } /* else { printf("\t-"); }*/ } } } //CHECK IF CUBE ALREADY OCCUPIED int check_cube(int cube,int ai) { if(check[cube-1]==1) { return 1; } else { if(ai!=1) { check[cube-1]=1; } } } void move() { int side; pos=1; side=keycode(); while(side!=7181) { while((side!=LEFT)&&(side!=RIGHT)&&(side!=UP)&&(side!=DOWN)) { printf("\a"); side=keycode(); } if(side==LEFT) { if((pos==1)||(pos==4)||(pos==7)) printf("\a"); else { pen(pos,BLACK) pos--; pen(pos,YELLOW) } side=keycode(); continue; } if(side==RIGHT) { if((pos==3)||(pos==6)||(pos==9)) printf("\a"); else { pen(pos,BLACK) pos++; pen(pos,YELLOW) } side=keycode(); continue; } if(side==UP) { if((pos==1)||(pos==2)||(pos==3)) printf("\a"); else { pen(pos,BLACK) pos-=3; pen(pos,YELLOW) } side=keycode(); continue; } if(side==DOWN) { if((pos==7)||(pos==8)||(pos==9)) printf("\a"); else { pen(pos,BLACK) pos+=3; pen(pos,YELLOW) } side=keycode(); continue; } } } int keycode() { int key; while (bioskey(1) == 0); key = bioskey(0); return (key); } //Artificial Intelligence int comp_ai(void) { int ton[9]; int c1=0,random=0,v=0; //find free cubes for(c1=0;c1<9;c1++) { ton[c1] = check_cube(c1+1,1); } // find all possible players winning combo & try to block //First See If It Is Possible To Win else Block for(v=2;v>=1;v--) { if(arr[1][0]==v&&arr[2][0]==v) { if(ton[0]!=1) { return 1; } else if((ton[4]!=1)&&(ton[2]!=1||ton[5]!=1)) { return 5; } } else if(arr[1][1]==v&&arr[2][2]==v) { if(ton[0]!=1) { return 1; } else if((ton[6]!=1)&&(ton[7]!=1&&ton[2]!=1)) { return 7; } else if((ton[2]!=1)&&(ton[6]!=1&&ton[5]!=1)) { return 3; } } else if(arr[0][1]==v&&arr[0][2]==v) { if(ton[0]!=1) { return 1; } else if((ton[4]!=1)&&(ton[6]!=1&&ton[7]!=1)) { return 5; } } else if(arr[0][0]==v&&arr[0][2]==v) { if(ton[1]!=1) { return 2; } else if((ton[4]!=1)&&(ton[6]!=1&&ton[8]!=1)) { return 5; } else if((ton[6]!=1)&&(ton[3]!=1&&ton[4]!=1)) { return 7; } else if((ton[8]!=1)&&(ton[5]!=1&&ton[4]!=1)) { return 9; } } else if(arr[1][1]==v&&arr[2][1]==v) { if(ton[1]!=1) { return 2; } else if((ton[6]!=1)&&(ton[8]!=1&&ton[2]!=1)) { return 7; } else if((ton[8]!=1)&&(ton[6]!=1&&ton[0]!=1)) { return 9; } } else if(arr[0][0]==v&&arr[0][1]==v) { if(ton[2]!=1) { return 3; } else if((ton[4]!=1)&&(ton[8]!=1&&ton[7]!=1)) { return 5; } } else if(arr[2][0]==v&&arr[1][1]==v) { if(ton[2]!=1) { return 3; } else if((ton[0]!=1)&&(ton[3]!=1&&ton[8]!=1)) { return 1; } else if((ton[8]!=1)&&(ton[0]!=1&&ton[7]!=1)) { return 9; } } else if(arr[1][2]==v&&arr[2][2]==v) { if(ton[2]!=1) { return 3; } else if((ton[4]!=1)&&(ton[0]!=1&&ton[3]!=1)) { return 5; } } else if(arr[0][0]==v&&arr[2][0]==v) { if(ton[3]!=1) { return 4; } else if((ton[4]!=1)&&(ton[2]!=1&&ton[8]!=1)) { return 5; } else if((ton[8]!=1)&&(ton[4]!=1&&ton[7]!=1)) { return 9; } else if((ton[2]!=1)&&(ton[1]!=1&&ton[4]!=1)) { return 3; } } else if(arr[1][1]==v&&arr[1][2]==v) { if(ton[3]!=1) { return 4; } else if((ton[2]!=1)&&(ton[6]!=1&&ton[8]!=1)) { return 3; } else if((ton[8]!=1)&&(ton[0]!=1&&ton[2]!=1)) { return 9; } } else if(arr[0][0]==v&&arr[2][2]==v) { if(ton[4]!=1) { return 5; } else if((ton[6]!=1)&&(ton[3]!=1&&ton[7]!=1)) { return 7; } else if((ton[2]!=1)&&(ton[1]!=1&&ton[5]!=1)) { return 3; } } else if(arr[0][1]==v&&arr[2][1]==v) { if(ton[4]!=1) { return 5; } } else if(arr[0][2]==v&&arr[2][0]==v) { if(ton[4]!=1) { return 5; } else if((ton[8]!=1)&&(ton[5]!=1&&ton[7]!=1)) { return 9; } else if((ton[0]!=1)&&(ton[1]!=1&&ton[3]!=1)) { return 1; } } else if(arr[1][0]==v&&arr[1][2]==v) { if(ton[4]!=1) { return 5; } } else if(arr[0][2]==v&&arr[2][2]==v) { if(ton[5]!=1) { return 6; } else if((ton[0]!=1)&&(ton[1]!=1&&ton[4]!=1)) { return 1; } else if((ton[6]!=1)&&(ton[7]!=1&&ton[4]!=1)) { return 7; } else if((ton[4]!=1)&&(ton[0]!=1&&ton[6]!=1)) { return 5; } } else if(arr[1][0]==v&&arr[1][1]==v) { if(ton[5]!=1) { return 6; } else if((ton[0]!=1)&&(ton[8]!=1&&ton[6]!=1)) { return 1; } else if((ton[6]!=1)&&(ton[2]!=1&&ton[0]!=1)) { return 7; } } else if(arr[0][0]==v&&arr[1][0]==v) { if(ton[6]!=1) { return 7; } else if((ton[4]!=1)&&(ton[8]!=1&&ton[5]!=1)) { return 5; } } else if(arr[0][2]==v&&arr[1][1]==v) { if(ton[6]!=1) { return 7; } else if((ton[0]!=1)&&(ton[8]!=1&&ton[1]!=1)) { return 1; } else if((ton[8]!=1)&&(ton[0]!=1&&ton[5]!=1)) { return 9; } } else if(arr[2][1]==v&&arr[2][2]==v) { if(ton[6]!=1) { return 7; } else if((ton[4]!=1)&&(ton[0]!=1&&ton[1]!=1)) { return 5; } } else if(arr[0][1]==v&&arr[1][1]==v) { if(ton[7]!=1) { return 8; } else if((ton[0]!=1)&&(ton[2]!=1&&ton[8]!=1)) { return 1; } else if((ton[2]!=1)&&(ton[0]!=1&&ton[6]!=1)) { return 3; } } else if(arr[2][0]==v&&arr[2][2]==v) { if(ton[7]!=1) { return 8; } else if((ton[0]!=1)&&(ton[3]!=1&&ton[4]!=1)) { return 1; } else if((ton[2]!=1)&&(ton[5]!=1&&ton[4]!=1)) { return 3; } else if((ton[4]!=1)&&(ton[0]!=1&&ton[2]!=1)) { return 5; } } else if(arr[0][0]==v&&arr[1][1]==v) { if(ton[8]!=1) { return 9; } else if((ton[6]!=1)&&(ton[2]!=1&&ton[3]!=1)) { return 7; } else if((ton[2]!=1)&&(ton[6]!=1&&ton[1]!=1)) { return 3; } } else if(arr[0][2]==v&&arr[1][2]==v) { if(ton[8]!=1) { return 9; } else if((ton[4]!=1)&&(ton[6]!=1&&ton[3]!=1)) { return 5; } } else if(arr[2][0]==v&&arr[2][1]==v) { if(ton[8]!=1) { return 9; } else if((ton[4]!=1)&&(ton[1]!=1&&ton[2]!=1)) { return 5; } } else { random=1; } } if(random==1) { //if all fails just send any cube number which is free !!! for(c1=1;c1<=9;c1++) { if(ton[c1-1]!=1) { return c1; } } } }