Anda di halaman 1dari 4

SOURCE CODE

#include <stdio.h>
#define cek(p,a,b,c) p[a]!=0&&p[a]==p[b]&&p[b]==p[c]
#define bolong1(p,a,b,c,X) !p[a]&&p[b]==X&&p[c]==X
#define bolong2(p,a,b,X) ((!p[a]&&p[b]==X)||(p[a]==X&&!
p[b]))&&a!=-1&&b!=-1
 
int gambardancek(int* petak, int giliran){
for(int i=0;i<9;i++){ // menggambar petak
if (!petak[i]){printf(".");}
else {printf("%c",petak[i]);}
if (i%3==2){printf("\n");}
else {printf(" ");}
}
 
int cekval=0; //memeriksa petak
for (int i=0;i<3&&!cekval;i++){
// baris ke-1
if (cek(petak,i*3,i*3+1,i*3+2)){cekval= 1;}
// kolom ke-i
if (cek(petak,i,i+3,i+6)){cekval= 1;}
}
if (cek(petak,0,4,8)){cekval= 1;}
if (cek(petak,2,4,6)){cekval= 1;}
 
if (cekval){
if(giliran%2==0)printf("Player 1 menang");
else {printf("Bot menang");}
} else if (giliran==8){ printf("Seri");}
 
return cekval;
}
 
void input(int *petak){
int i,j;
printf("Player 1 masukkan posisi: ");
while(1) {scanf(" %d %d",&i, &j);
if (i<3&&i>=0&&j<3&&j>=0&&petak[i*3+j]==0){
petak[i*3+j]='X';break;
}
printf("Posisi salah, masukkan lagi: ");
}
}
 
void bolongsatu(int* petak, int *n, int c){
*n=-1;
for(int j=0;j<3&&*n==-1;j++){//iterasi posisi
if(bolong1(petak,j%3*4,
(j+1)%3*4,
(j+2)%3*4,c)){
*n=j%3*4;} //diagonal 1
if(bolong1(petak,(j%3+1)*2,
((j+1)%3+1)*2,
((j+2)%3+1)*2,c)){
*n=(j%3+1)*2;} //diagonal 2
for(int k=0;k<3&&*n==-1;k++){//iterasi baris kolom k
if(bolong1(petak,j*3+k%3,
j*3+(k+1)%3,
j*3+(k+2)%3,c)){
*n=j*3+k%3;} //baris ke-k
if(bolong1(petak,j+k%3*3,
j+(k+1)%3*3,
j+(k+2)%3*3,c)){
*n=j+k%3*3;} //kolom ke-k
}
}
}
 
void hitungbolong(int* petak, int* wn, int* w, char c){
for(int j=0;j<9;j++){ //pivot
if (petak[j]==0){
int tb[8] = {-1,-1,-1,-1,-1,-1,-1,-1};

// mencari posisi2 bergaris deret dg posisi j


tb[0]= ((j-3*(j/3))+1)%3+3*(j/3); // sebaris
tb[1]= ((j-3*(j/3))+2)%3+3*(j/3); // sebaris
tb[2]= (j+3)%9; tb[3]= (j+6)%9; // sekolom
if(j==0||j==4||j==8){ // diagonal 1
tb[4]=(j+4)%12; tb[5]=(j+8)%12;
}
if(j==2||j==4||j==6){ // diagonal 2
tb[6]=(j%6)+2; tb[7]=((j+2)%6)+2;
}
for (int k=0;k<3;k++){ // kombinasi 1
for (int l=k+1;l<4;l++){ // kombinasi 2
if(bolong2(petak,tb[k*2],tb[k*2+1],c)
&&bolong2(petak,tb[l*2],tb[l*2+1],c)){
w[*wn]=j;*wn=*wn+1;
}
}
}
}
}
}
 
void bolongdua(int* petak, int *n,char c){
*n=-1; int w[9],wn=0,j;
hitungbolong(petak,&wn,w,c);
if(wn==1){*n=w[0];}
if(wn==2&&c=='X'){
int kopet[9]; //kopasan petak
for (j=0;j<9;j++){kopet[j]=petak[j];} // salin
for (j=0;j<9;j++){
if (kopet[j]==0){ //pancing lawan
kopet[j]='O'; int h;
bolongsatu(kopet,&h,'O');
if(h!=-1){
kopet[h]=c; int ww[2],wwn=0;
//hitung lagi
hitungbolong(kopet,&wwn,ww,c);
if (wwn==0){*n=j;break;}
}
}
}
} else if (wn>1&&*n==-1){*n=w[0];}
}
 
void bot(int* petak, int giliran){
printf("Bot:\n");
int pojok[4] = {0,2,6,8};
int n=-1,h=-1,b=-1,s=-1,t=-1; //variabel sementara
if (giliran==1){
if(petak[4]=='X'){n=pojok[rand()%4];}
else {n=4;}
} //Memulai
bolongdua(petak,&t,'X'); if(t!=-1){n=t;} //Mencela
bolongdua(petak,&b,'O'); if(b!=-1){n=b;} //Membujuk
bolongsatu(petak,&h,'X'); if(h!=-1){n=h;} //Menghalangi
bolongsatu(petak,&s,'O'); if(s!=-1){n=s;} //Menghabisi
if(n==-1){ do{ n=rand()%9;} while(petak[n]!=0);} //Acak
petak[n]='O';
}
 
int main(){
int petak[9] = {}; //9 posisi petak
for (int i=0;i<9;i++){
if (i%2==0){input(petak);}
else {bot(petak,i);}
if (gambardancek(petak,i)){break;}
}
 
return 0;
}

Anda mungkin juga menyukai