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 <stdio.h>

using namespace std;

// GLOBALLER
int sayac=0;
char dizi[]={'1','2','3','4','5','6','7','8','9'};
bool kazanan=false;

// 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;
    }
    return false;
}

// 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...
}

void oyun_sifirla(){

    sayac = 0;
    kazanan = false;
    char i;
    int j;
    for(i='1',j=0; i<='9', j<9; i++, j++) {
        dizi[j] = i;
    }

}
// ana fonksiyon

int main()
{

    int b_sayi, i_sayi;
    do // ana döngü...
    {

        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...

                goster(dizi);

                if (kontrol(dizi)) // her hamleden sonra kazanan var mı diye kontrol et
                {

                    cout<<"\n\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++;

                goster(dizi);
                if (kontrol(dizi)) // bool kontrol
                {
                    cout<<"\n\nIkinci oyuncu (O) kazandi\n";
                    kazanan=true;
                }
                break;
            }
            if (beraberlik_mi(sayac))
                break;

            if (kazanan) break;
        }
        oyun_sifirla();
        cout<<"\nOyun Tekrar Basliyor..."<<"\n__________________________________________";
        cout<<endl<<endl<<endl;

        continue;
    } while(true);
    return 0;
}

İyi Çalışmalar…

19 Yorum

  1. Hüseyin Says:

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

  2. emre Says:

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

  3. Batuhan Says:

    Evet öyle oldu. Maksat biraz antrenman zaten…

    Teşekkürler…

  4. aslı Says:

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

  5. Batuhan Says:

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

  6. aslı Says:

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

  7. Batuhan Says:

    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…

  8. aslı Says:

    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.

  9. [...] ö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ı [...]

  10. halidey Says:

    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 ?

  11. xetra Says:

    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 :)

  12. hacker Says:

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

  13. Batuhan Says:

    DEV C++’da denemiştim bu kodu, çalışmıştı. Eksik kopyalamış olabilirsiniz…

  14. ismail Says:

    x için rakam girdiğimde kabul ediyor ama ikinci rakamı giremiyorum? bi daha başa dönüyor

  15. Batuhan Says:

    Düzeltme yaptım. Linux’da test ettim. Windows’da problem var mı bilmiyorum şu an. Teşekkürler…

  16. Hakan Says:

    merhaba batuhan kardeş acaba c++ da brickbreaker oyunu bulabileceğimiz veya bildiğin birşey var mı?
    şimdi den teşekkür ederim.

  17. Batuhan Says:

    O tarz oyunlar genelde OpenGL, DirectX gibi grafik kütüphaneleri kullanılarak yapıldıkları için biraz daha karmaşık koda ve yapıya sahip oluyorlar. Python’da pygame üzerinde gerçekleştirilmiş o tarz oyunları araştırırsanız daha kolay çalışmalar bulabilirsiniz.

  18. Okan Says:

    Çok güzel ve kullanışlı olmuş. Güzel mantık kurulmuş. Teşekkürler. :)

Yorum Yazın...

Yukarı

Yukarı