C++ ile Üç Taş (Tic-Tac-Toe) Oyunu

İnternet üzerinde çeşitli dillerle yazılmış birçok üç taş (tic tac toe) oyunu kodu var. Ben de C++ ile bir şeyler karaladım. Aslında diğer kodlara göre biraz daha karışık ve uzun gelebilir ama burada amacım “en iyisini” yazmaktan ziyade antrenman yapmak. Kodu, Windows üzerinde denedim.

/// Batuhan Bayrakçı ///
/// 3 Taş Oyunu - Tic Tac Toe ///

#include <iostream>
#include <conio.h>
using namespace std;

int sayac=0;

/// bölmeleri (sayıları) ekrana yazdıran fonksiyon:

void goster(char dizi_parametre[])
{
    for (int i=0;i<9;i++)
    {
        if (i%3==0)
        {
            cout<<endl;
            cout<<endl;
        }
      cout<<ends<<ends<<ends<<dizi_parametre[i]<<ends<<ends<<ends<<"|"<<ends;
    }
}

// tüm bölmelerin dolup dolmadığını ve beraberliğin varlığını kontrol eden fonksiyon. 'sayac' değişkeniyle ile kontrol edilir.

bool beraberlik_mi(int s)
{
    if (s==9){
        cout<<"\n\nBeraberlik"<<endl;
        return true;
    }
}

// kazananın varlığını kontrol eden fonksiyon

bool kontrol(char k_dizi[])
{
    /// X'in durumları:
    if (

        (k_dizi[0]=='X' && k_dizi[1]=='X' && k_dizi[2]=='X') ||
        (k_dizi[0]=='X' && k_dizi[3]=='X' && k_dizi[6]=='X') ||
        (k_dizi[3]=='X' && k_dizi[4]=='X' && k_dizi[5]=='X') ||
        (k_dizi[1]=='X' && k_dizi[4]=='X' && k_dizi[7]=='X') ||
        (k_dizi[8]=='X' && k_dizi[7]=='X' && k_dizi[6]=='X') ||
        (k_dizi[8]=='X' && k_dizi[5]=='X' && k_dizi[2]=='X') ||
        (k_dizi[0]=='X' && k_dizi[4]=='X' && k_dizi[8]=='X') ||
        (k_dizi[2]=='X' && k_dizi[4]=='X' && k_dizi[6]=='X')

    ) return true;

    /// O'nun durumları:

    else if (

        (k_dizi[0]=='O' && k_dizi[1]=='O' && k_dizi[2]=='O') ||
        (k_dizi[0]=='O' && k_dizi[3]=='O' && k_dizi[6]=='O') ||
        (k_dizi[3]=='O' && k_dizi[4]=='O' && k_dizi[5]=='O') ||
        (k_dizi[1]=='O' && k_dizi[4]=='O' && k_dizi[7]=='O') ||
        (k_dizi[8]=='O' && k_dizi[7]=='O' && k_dizi[6]=='O') ||
        (k_dizi[8]=='O' && k_dizi[5]=='O' && k_dizi[2]=='O') ||
        (k_dizi[0]=='O' && k_dizi[4]=='O' && k_dizi[8]=='O') ||
        (k_dizi[2]=='O' && k_dizi[4]=='O' && k_dizi[6]=='O')

    ) return true;

    else return false; // kazanan yok ise 'false' döndür...
}

// ana fonksiyon

int main()
{
    do // ana döngü...
    {
        char dizi[]={'1','2','3','4','5','6','7','8','9'};
        int b_sayi, i_sayi;
        bool kazanan=false;

        goster(dizi);

        while (!kazanan) // kazanan yoksa oyuna devam...
        {
            while (true)
            {
                cout<<endl<<"\n\nSira BIRINCI (X) oyuncuda:"<<ends;
                cin>>b_sayi; // birinci oyuncudan sayiyi al
                if (dizi[b_sayi-1]=='X' or dizi[b_sayi-1]=='O' or b_sayi>9 or b_sayi<1)
                // oynanan hamleyi kontrol et
                {
                    cout<<"\nOynandi veya gecersiz hamle. Baska bir sayi deneyin\n";
                    continue;
                }
                dizi[b_sayi-1]='X';
                sayac++; // her hamlede sayacı artır. Ta ki 9 olana kadar...
                system("CLS"); // ekranı temizle
                goster(dizi);
                if (kontrol(dizi)) // her hamleden sonra kazanan var mı diye kontrol et
                {
                    cout<<"\nBirinci oyuncu (X) kazandi\n";
                    kazanan=true;
                }
                break;
            }
            /// Oyuncular arası geçişte bazı kontroller yapmaya başla...
            if (beraberlik_mi(sayac))
                break;

            if (kazanan) break ;
            /// Oyuncular arası geçişte bazı kontroller yapıldı.

            while (true) // ikinci oyuncu oyna... Birinci oyuncuyla aynı durumlar ikinci oyuncu için de geçerli
            {
                cout<<endl<<"\n\nSira IKINCI (O) oyuncuda:"<<ends;
                cin>>i_sayi;
                if (dizi[i_sayi-1]=='X' or dizi[i_sayi-1]=='O' or i_sayi>9 or i_sayi<1)
                {
                    cout<<endl<<"\nOynandi veya gecersiz hamle. Baska bir sayi deneyin\n";
                    continue;
                }
                dizi[i_sayi-1]='O';
                sayac++;
                system("CLS");
                goster(dizi);
                if (kontrol(dizi)) // bool kontrol
                {
                    cout<<"\nIkinci oyuncu (O) kazandi\n";
                    kazanan=true;
                }
                break;
            }
            if (beraberlik_mi(sayac))
                break;

            if (kazanan) break;
        }
        sayac=0;
        cout<<"\nTekrar oynamak icin bir tusa basin..."<<endl;
        getch();
        system("CLS");
        continue;
    }
    while (true); // 'do-while' ana döngü sonu
    return 0;
}

İyi Çalışmalar…

14 yorum

  1. Hüseyin diyor ki:

    Hele bir visual’a geçelim bunun bilgisayara karşı olanını da yaparız :D

  2. Batuhan diyor ki:

    inşallah :)

  3. emre diyor ki:

    C++ ta yazmissiniz ama C++`in hic bir aracini kullanmamissiniz. Prosedurel bir program olmus C tadinda. Ama guzel tebrikler.

  4. Batuhan diyor ki:

    Evet öyle oldu. Maksat biraz antrenman zaten…

    Teşekkürler…

  5. aslı diyor ki:

    devc++ da çalışmıyormu oyun

  6. Batuhan diyor ki:

    Şu an Dev c++ de denedim. Herhangi bir sorun görünmüyor.

  7. aslı diyor ki:

    Oyun şekilli oynanabilirmi bide programa sayi yerine harf girince sonsuz döngü oluyor nasıl düzeltilebilir.

  8. Batuhan diyor ki:

    Programda hata denetimi çok gelişmiş değil. Kodlarla oynama yapılarak harf girdiğinde programın çalışmasına devam ettirilebilir. Grafik arayüzü yapılabilir tabi. Bunu ben c++’ta antrenman olsun diye yazmıştım. Kısmet olursa C#’ta grafik arayüzlü bir tane yazmak isterim…

  9. aslı diyor ki:

    güzel bi program olmuş elinize sağlık kusura bakmayın çok soru soruyorm ama buna grafikde ekleyebilirmsnz.Bide rica etsem size ulaşmam için bir adres verseniz bilgisayar prgrmclkda okyrm size bikaç sorum daha olacaktıda.

  10. [...] önce C++ ile basit bir tic tac toe (üç taş) oyunu yazmıştım. Bir süredir Java ile ilgileniyorum. Java’da da Swing ile dirsek teması [...]

  11. halidey diyor ki:

    arkadaşlar merhba anladıgım kadarıyla programlamayla aranız baya iyi :) hacettepe üniversitesi elektrik-elektornik mühendisliğinde okuyorum “C” dersi alıyoruz bizde ama programlamayla aramın çok da iyi olduğu söylenemez :/ bilgisayara karşı tic tac toe konulu bi proje ödevim var ;bana yardımcı olabilme şansınız var mı acaba ?

  12. xetra diyor ki:

    biraz eski bi konu ama ilgisini ceken arkadaslar olabilir :) eger bilgisayara karsi oynatmak icin yapiyorsaniz yapmaniz gereken 1-9 arasi random yasi uretmeniz :) i_sayi= rand()%9; ben yaptim su an oynuyorum sahurdan sonra iyi sardi :) biraz daha ugrasip bilgisayarin mantikli davranmasini saglayabilirsiniz ama surekli mantikli davranirsa ya yener ya berabere biter onuda random yapmalisiniz, onun icinde bool anahtar kullanin bunun (true-false)yaninda :)

  13. hacker diyor ki:

    dev c++ da hata veriyo yani dev c++ da calısmıyo emeğine sağlık

  14. Batuhan diyor ki:

    DEV C++’da denemiştim bu kodu, çalışmıştı. Eksik kopyalamış olabilirsiniz… Ne tür bir hata veriyor?

Söylemek istediğiniz bir şey mi var? Yorum yazın...