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…

4 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…

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