Tic Tac Toe Oyunu

Başlatan egcodes, 06 Ocak 2011 - 18:47:50

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

egcodes

Tic Tac Toe ya da bizim liseden bildiğimiz SOS oyunu.

Bilgisayara karşı oynuyorsunuz ufak bir yapay zekası var kolayca yenilmiyor :)


İyi oyunlar.


/*************************************/
// Program Name : Tic Tac Toe
// Version               : 1.0.5
// Start                     : 17.06.2010
// Update                : 20.01.2011
// Author                 : egcodes (www.egcodes.blogspot.com)
/*************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void print_game(char *a, int size);
void print_result(int result);
int check_status(char *a, int size);
void AI_Machine(char *a, int size);

int main()
{
    char *a;
    int k, ch;
    int size = 3;

    srand((unsigned int)time(0));


    if ((a = (char *)malloc(size * size * sizeof(char))) == NULL) {
        printf("Cannot allocate memory...\n");
        exit(EXIT_FAILURE);
    }

    for (k = 0; k < size * size; k++)
      a[k] = '.';

    while (1) {
        //Oyuncu oynuyor
        print_game(a, size);
        while (1) {
            printf("Secim : ");
            scanf("%d", &ch);
            getchar();

            if (a[ch - 1] == 'X' || a[ch - 1] == 'O')
                 printf("Girdiğiniz alan dolu...\n");
            else {
                 a[ch - 1] = 'X';
                 break;
            }
        }
        print_game(a, size);
        print_result(check_status(a, size));

        //Bilgisayar oynuyor
        AI_Machine(a, 3);
        print_game(a, size);
        print_result(check_status(a, size));
    }

    return 0;
}

void print_game(char *a, int size)
{
    int k;

    system("clear");
    printf("Tic Tac Toe\n");
    printf("===========\n\n");
    printf("-------------------------------------\n");

    for (k = 0; k < size * size; k++) {
        if (k % size == 0)
            printf("\n\n");

        printf("%-10c ", a[k]);
    }

    printf("\n\n-------------------------------------\n");

}

void print_result(int result)
{
    if (result == 1) {
        printf("Tebrikler kazandınız...\n");
        getchar();
        exit(EXIT_SUCCESS);
    }
    else if (result == 2) {
        printf("Uzgunum kaybettiniz...\n");
        getchar();
        exit(EXIT_SUCCESS);
    }
    else if (result == 3) {
        printf("Oyun berabere bitti...\n");
        getchar();
        exit(EXIT_SUCCESS);
    }
    else
        ;
}

int check_status(char *a, int size)
{

    int line, col;
    int counterX, counterO;
    int n_time;
    int n2_time;
    int k;


    //Yatay kontrol
    n_time = size;
    for (line = 1 ; n_time-- ; line += size) {
        counterX = 0, counterO = 0;
        n2_time = size;
        for (col = line; n2_time-- ; col++) {
            switch (a[col - 1]) {
                    case 'X' : counterX++;
                                if (counterX == size)
                                    return 1;
                                break;
                    case 'O' : counterO++;
                                if (counterO == size)
                                    return 2;
                                break;
            }
        }
    }


    //Dikey kontrol
    n_time = size;
    for (col = 1 ; n_time-- ; col++) {
        counterX = 0, counterO = 0;
        n2_time = size;
        for (line = col; n2_time-- ; line += size) {
            switch (a[line - 1]) {
                    case 'X' : counterX++;
                                if (counterX == size)
                                    return 1;
                                break;
                    case 'O' : counterO++;
                                if (counterO == size)
                                    return 2;
                                break;
            }
        }
    }


    //Capraz kontrol (Soldan saga)
    n_time = size;
    counterX = 0, counterO = 0;
    for (line = 1; n_time-- ; line += size + 1) {
        switch (a[line - 1]) {
                case 'X' : counterX++;
                           if (counterX == size)
                              return 1;
                           break;
                case 'O' : counterO++;
                           if (counterO == size)
                              return 2;
                           break;
        }
    }


    //Capraz kontrol (Sagdan sola)
    n_time = size;
    counterX = 0, counterO = 0;
    for (line = size; n_time-- ; line += size - 1) {
        switch (a[line - 1]) {
                case 'X' : counterX++;
                            if (counterX == size)
                                return 1;
                            break;
                case 'O' : counterO++;
                            if (counterO == size)
                                return 2;
                            break;
        }
    }

    //Oyun bitti mi
    for (k = 0; k < size * size; k++)
        if (a[k] == '.')
            return 0;

    //Beraberlik kontrol
    return 3;


}

void AI_Machine(char *a, int size)
{
int line, col;
int n_time, n2_time;
int counter;
int random;

//Ozel Stratejiler
if (size == 3 && a[size + 1] == '.') {
     a[size + 1] = 'O';
     return ;
}

//Atak Stratejileri
//Yatay kontrol
n_time = size;
for (line = 1 ; n_time--; line += size) {
     counter = 0, n2_time = size;


     for (col = line; n2_time--; col++) {
         if (a[col - 1] == 'O') {
             counter++;
             continue;
         }
         if (a[col - 1] == 'X')
             counter--;
     }

     if (counter == size - 1) {
         col = line - 1;
         while (a[col] != '.')
             col++;
         a[col] = 'O';
         return ;
     }
}

//Dikey kontrol
n_time = size;
for (col = 1 ; n_time-- ; col++) {
     counter = 0, n2_time = size;

     for (line = col; n2_time-- ; line += size) {
         if (a[line - 1] == 'O') {
             counter++;
             continue;
         }
         if (a[line - 1] == 'X')
             counter--;
     }

     if (counter == size - 1) {
         line = col - 1;
         while (a[line] != '.')
             line += size;
         a[line] = 'O';
         return ;
     }
}


//Capraz kontrol - Soldan saga
counter = 0, n2_time = size;
for (col = 1; n2_time--; col += size + 1) {
     if (a[col - 1] == 'O') {
         counter++;
         continue;
     }
     if (a[col - 1] == 'X')
         counter--;
}

if (counter == size - 1) {
     col = 1;
     while (a[col - 1] != '.')
         col += size + 1;
     a[col - 1] = 'O';
     return ;
}

//Capraz kontrol - Sagdan sola
counter = 0, n2_time = size;
for (col = size; n2_time--; col += size - 1) {
     if (a[col - 1] == 'O') {
         counter++;
         continue;
     }
     if (a[col - 1] == 'X')
         counter--;
}
if (counter == size - 1) {
     col = size ;
     while (a[col - 1] != '.')
         col += size - 1;
     a[col - 1] = 'O';
     return ;
}


//Savunma Stratejileri
//Yatay kontrol
n_time = size;
for (line = 1 ; n_time--; line += size) {
     counter = 0, n2_time = size;

     for (col = line; n2_time--; col++) {
         if (a[col - 1] == 'X') {
             counter++;
             continue;
         }
         if (a[col - 1] == 'O')
             counter--;
     }

     if (counter == size - 1) {
         col = line - 1;
         while (a[col] != '.')
             col++;
         a[col] = 'O';
         return ;
     }
}

//Dikey kontrol
n_time = size;
for (col = 1 ; n_time-- ; col++) {

     counter = 0, n2_time = size;

     for (line = col; n2_time-- ; line += size) {
         if (a[line - 1] == 'X') {
             counter++;
             continue;
         }
         if (a[line - 1] == 'O')
             counter--;
     }

     if (counter == size - 1) {
         line = col - 1;
         while (a[line] != '.')
             line += size;
         a[line] = 'O';
         return ;
     }
}


//Capraz kontrol - Soldan saga
counter = 0, n2_time = size;
for (col = 1; n2_time--; col += size + 1) {
     if (a[col - 1] == 'X') {
         counter++;
         continue;
     }
     if (a[col - 1] == 'O')
         counter--;
}

if (counter == size - 1) {
     col = 1;
     while (a[col - 1] != '.')
         col += size + 1;
     a[col - 1] = 'O';
     return ;
}

//Capraz kontrol - Sagdan sola
counter = 0, n2_time = size;
for (col = size; n2_time--; col += size - 1) {
     if (a[col - 1] == 'X') {
         counter++;
         continue;
     }
     if (a[col - 1] == 'O')
         counter--;
}

if (counter == size - 1) {
     col = size ;
     while (a[col - 1] != '.')
         col += size - 1;
     a[col - 1] = 'O';
     return ;
}



//Atak ve savunma disinda rastgele secim
while (a[random = rand() % (size * size)] != '.')
     ;
a[random] = 'O';
}

1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

sem

Teşekkürler paylaşım ve kod örneği için... İki kişilik olarak yapmıştım oyunu, bakayım yapay zeka ile nasıl oluyormuş =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

noktakom

Programda hata olabilir 7*7 boyutunda oynarken oyun bir süre sonra cpu stress programı halini alıyor

Paylaşım için teşekkürler

egcodes

Terminalde 7*7 oynamak işkence olsa gerek :D

Aslında 3 - 5 arası sınır getiseymişim daha iyi olurmuş.

Teşekkürler geri dönüş için.
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

noktakom

Peki, öyle yapalım o zaman. zaten dediğiniz gibi 7*7 zor oluyor terminalde. ha bire parmakla sayıyorsun, bu kaçıncı kare diye...:)


egcodes

Bahsettiğimiz değişikliği yaptım o sırada da AI_Machine fonksiyonun bildirimini eklemeyi unuttuğumu fark ettim :) Onu da düzelttim.
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

noktakom

Hocam bir bildirimde daha bulunmak istiyorum. Oyunun yapay zekası çok zayıf. aşağıdaki örnekteki gibi x leri göstere göstere yerleştirmeme rağmen hiçbir tedbir alamıyor....
Tic Tac Toe Oyunu
=================

-------------------------------------


X          .          O          .          O         

X          O          .          O          .         

X          .          .          .          .         

X          .          .          .          .         

X          .          .          .          .         

-------------------------------------
Tebrikler kazandınız...


egcodes

Alması lazımdı bi inceleyeyim kodları tekrar güncellerim.  3x3 ' e baktım onda sorun yok gibi.
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

sem

Vallahi ben klasik 3 x 3'te oynadım... Çok fena oynuyor...  =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

egcodes

4 ve 5 boyutta hatanın ne olduğunu bulamadım default olarak 3 yaptım. Zaten klasiği de budur :)
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

sayz

oyun 3x3 te "karşı hamle" olarak güzel oynuyor fakat kendi kazanmasını pek beceremiyor şöyle ki:
-------------------------------------
X          O          X         

X          O          .         

O          .          .         
-------------------------------------

oyun bu aşamadayken ben bilerek 6 ya koyuyorum "X"'i ama oyun kendi 8'e "O" koyup kazanmak varken sadece benim önümü kapatmaya çalışıyor ve 9'a "O" koyuyor.
-------------------------------------
X          O          X         

X          O          X         

O          .          O         
-------------------------------------


sonra da oyun berabere bitiyor tabii ki  :-)


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 20 Ocak 2011 - 02:18:55

ayrıca ufak bir ayrıntı daha: print_game fonksiyonunda fazladan bir i değişkeni tanımlamışsınız sanki...

sem

Strateji savunmaya yönelik demek ki... Önemli olan kazanmak değil de kazandırmayıp sinirlendirmek olabilir =)=)

Bahsi geçen i ve bunun gibi gibi değişkenler ve bu tarz uyarılar  için -Wall parametresi iş görecektir...

sem0900@debian:~/Desktop$ gcc deneme.c -o deneme -Wall
deneme.c: In function 'print_game':
deneme.c:64: warning: unused variable 'i'


NOT: Buradaki deneme başlığın programı oluyor =)

EK: sayz siz neden yenmiyorsunuz =) Siz de oyundaki strateji gibi oynamışsınız =)=)=)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

sayz

@sem ben sadece oyunun atağa yönelik stratejisini sınamak adına öyle oynadım :-)

sem

Hiç aklıma gelmezdi harbiden =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

egcodes

Yeni bir güncelleme yaptım öyle bir durum olmaz artık :)
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d

sayz

evet artık yapmıyor :-) ama olsun  açtım 5 kere oynadım 2'sini kazandım :-)