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…
Hele bir visual’a geçelim bunun bilgisayara karşı olanını da yaparız
…
inşallah
C++ ta yazmissiniz ama C++`in hic bir aracini kullanmamissiniz. Prosedurel bir program olmus C tadinda. Ama guzel tebrikler.
Evet öyle oldu. Maksat biraz antrenman zaten…
Teşekkürler…