8 Ekim 2013 Salı

C Diliyle Tic Tac Toe Oyunu Yazımı

Tic tac toe oyununun mantığı 3x3 lük karelerde yan yana, alt alta ve ya çapraz biçimde 3’lü seri yapmaya çalışmaktır. Bu örneğimizde de bu oyunun konsol kodunu yazacağız.

Oyunumuzun genel mantığını şöyle özetleyebiliriz:

Kullanıcı oyunu bir yer seçerek başlatacaktır. Daha sonra ise bilgisayar random olarak boş bir yer bulup hamlesini yapacaktır. Bu şekilde sırayla, kullanıcı veya bilgisayar oyunu kazanıp –oyun berabere bitene kadar hamlelerini gerçekleştirecektir.
Kod kısmını ayrıntılı olarak ele almaya başlarsak:

Öncelikle programda kullandığımız değişkenleri ve dizimizi tanımlıyoruz. Daha sonra ekran çıktısı için sade ve anlaşılır bir tablo hazırlamamız gerekiyor. 


Tablomuzu da oluşturduktan sonra sıra geliyor kullanıcıdan girdileri almaya. Burada bir for döngüsü kullanıyoruz. Bu for döngüsü içinde indeks olarak kullandığımız k değişkenini 0’dan 9’a kadar artırıyoruz. Bunu yapmamızdaki neden oyunda maksimum 9 adım olabilmesidir. For döngüsünün ardından k olarak belirlediğimiz indeksin 2’ye göre modunu alıyoruz. Buradaki mantık da k değişkenin ikiye göre modu 0(sıfır) ise sıranın kullanıcıda, 1 ise sıranın bilgisayarda olduğunu belirtmemizdir.

Oyuna hamle sırası kullanıcıda olduğu zaman kullanıcı_girisi adlı fonksiyonumuzu çalıştırıyoruz. Bu fonksiyonumuz ise önce kullanıcıdan satır ve sütun değerlerini istiyor ve hemen ardından while döngüsüne giriyor. Eğer bu girdiğimiz değer 0-2 aralığı dışında veya herhangi dolu bir yere denk geliyorsa ekrana bir bildirim yazdırıp yeni değerler girmesini istiyoruz. Bu işlem kullanıcının geçerli değerleri girene kadar devam ediyor ve en sonunda aldığımız geçerli değişkenlere denk gelen yeri ‘x’ yapıyoruz. Fonksiyon geriye,  düzelttiğimiz ‘matris’ matrisini döndürüyor ardından for döngüsü de k değişkeni bir arttırıp sırayı bilgisayara veriyor.


Bilgisayara sıra geldiğinde ise bilgisayar_girisi adlı fonksiyonumuzu devreye sokuyoruz. Bu fonksiyon da öncelikle rastgele satır ve sütun değerleri seçiyor ardından da yine bir while döngüsüne girdiriyoruz. Burada da boş yer bulana kadar sürekli random fonksiyonuyla satır ve sütun değerleri yakalıyoruz. En son yakaladığımız geçerli yeri bilgisayarı temsilen ‘o’ yapıyoruz. Bu işlemler oyun sonlana kadar devam ediyor.



 Oyunun sonlandığını kontrol etmek için bazı if deyimlerine ihtiyacımız var. Bu if’lerin başlaması için en az 4 el oynanmış olmalıdır, bu yüzden kontrolleri en baştan itibaren değil de k değişkenimizin 4’lenmesinden itibaren başlatıyoruz. Oyunun kazanının olup olmadığını kontrol eden if’ler sekiz adet olmalı çünkü oyunun bir kazananı olup da bitebilmesi için sekiz farklı kombinasyon vardır(3 yatay,3 dikey veya 2 çapraz olarak). Oyunun bittiğini gösteren if deyimlerinin içine birer if deyimi daha eklemeliyiz. Bu son ekleyeceğimiz if’ler ise kazananın bilgisayar mı yoksa kullanıcı mı olduğunu anlamamıza yarayacak. Eğer 3’lü oluşturan karakterler ‘x’ ise kullanıcı,  ’o’ ise bilgisayar kazanmış demektir. Bunların dışında bir de berabere bitme olasılığını da göz önünde bulundurmamız gerekiyor. Oyunların bitme kontrollerini teker teker sekiz adet kontrolle yapacağız. Oyunun berabere bittiğini ise bu kontrollerin sonuna, hamleler için oluşturduğumuz for döngüsünün sonuna gelip gelmediğimizin kontrolünü yaparak anlayabiliriz. Bu kullandığımız if’lerin sonlarına da birer break eklemeliyiz çünkü oyun bittiği zaman programımız sonlanmalıdır.


C Kodunun Tamamı:





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

char kullanici_giris(char matris[][3]){
int sat,sut;
printf("Oynamak istediginiz satir/sutun giriniz :\n");
scanf("%d%d",&sat,&sut);

while(sat>2||sat<0||sut<0||sut>2||matris[sat][sut]!='-'){
 printf("Girdiginiz aralik gecersiz tekrar girin : \n");
 scanf("%d%d\n",&sat,&sut);
 scanf("%d%d\n",&sat,&sut);
}

matris[sat][sut]='x';//doğru değer girilmiştir, atamayı yapıyoruz
return matris[3][3];//matrisimizi döndürüyoruz 
}

char bilgisayar_giris(char matris[][3]){
int sat,sut;
sat=rand()%3;//satır için ilk random atamyı yapıyoruz
sut=rand()%3;// sutun için ilk randım atamayı yapıyoruz
while(matris[sat][sut]!='-'){//adres doluysa yeniden random atama yapmalıyız
sat=rand()%3;
sut=rand()%3;
}
printf("\nBilgisayarin hamle yaptigi yer\n");
printf("Satir: %d \n",sat);
printf("Sutun: %d \n\n",sut);
matris[sat][sut]='o';//boş yer bulunmuştur, atamayı yapıyoruz
return matris[3][3];//matrisimizi döndürüyoruz
}

int main() {
 int i,j,k,sat,sut;//değişkenlerimiz
 srand(time(NULL));//random fonksiyonun her seferinde 
                               //farklı değer vermesi için gerekli kod
 char matris[3][3]={{'-','-','-'},
      {'-','-','-'},
             {'-','-','-'}};//ilklendirme
printf("  0  1  2\n"); 
for(i=0;i<3;i++){
 printf("%d",i);
 for(j=0;j<3;j++){
  printf(" %c ",matris[i][j]);
 }
 printf("\n");
}//ekran göstergesi

 for(k=0;k<9;k++){//maksimum hamle sayısı 9 olduğundan 9'a kadar döndürürüz
  
  if(k%2==0){//kullanıcının başlaması için mod kullanıyoruz
        kullanici_giris(matris);//kullanıcıdan değer isteme fonksiyonu
      
  }
  else{
  //system("CLS");//ekran temizleyicisi
  bilgisayar_giris(matris);//blgsyrın boş yer bulması ve
      //atama yapması için kullanılan foksiyon 
      printf("  0  1  2\n"); 
       for(i=0;i<3;i++){
          printf("%d",i);
           for(j=0;j<3;j++){
                               printf(" %c ",matris[i][j]);
            }
       printf("\n");
       }//ekran göstergesi
    }
 if(k>3){//oyunun kimin kazandığını ya da oyunun berabere bitip bitmediğini
                                      //kontrol ettiğimiz if dizimleri
  
  if(matris[0][0]==matris[0][1]&&matris[0][1]==matris[0][2]){
   printf("OYUN BITTI!!");
   if(matris[0][0]=='x'){
    printf("TEBRIKLER KAZANDINIZ!!");
    break;
   }
   else{
    printf("MALESEF KAYBETTINIZ");
    break;
   }   
  }
  if(matris[1][0]==matris[1][1]&&matris[1][1]==matris[1][2]){
   printf("OYUN BITTI!!");
   if(matris[1][0]=='x'){
    printf("TEBRIKLER KAZANDINIZ!!");
    break;
   }
   else{
    printf("MALESEF KAYBETTINIZ");
    break;
   }
  }
  if(matris[2][0]==matris[2][1]&&matris[2][1]==matris[2][2]){
   printf("OYUN BITTI!!");
   if(matris[2][0]=='x'){
    printf("TEBRIKLER KAZANDINIZ!!");
    break;
   }
   else{
    printf("MALESEF KAYBETTINIZ");
    break;
   }
  }
  if(matris[0][0]==matris[1][0]&&matris[1][0]==matris[2][0]){
   printf("OYUN BITTI!!");
   if(matris[0][0]=='x'){
    printf("TEBRIKLER KAZANDINIZ!!");
    break;
   }
   else{
    printf("MALESEF KAYBETTINIZ");
    break;
   }
  }
  if(matris[0][1]==matris[1][1]&&matris[1][1]==matris[2][1]){
   printf("OYUN BITTI!!");
   if(matris[0][1]=='x'){
    printf("TEBRIKLER KAZANDINIZ!!");
    break;
   }
   else{
    printf("MALESEF KAYBETTINIZ");
    break;
   }
  }
  if(matris[0][2]==matris[1][2]&&matris[1][2]==matris[2][2]){
   printf("OYUN BITTI!!");
   if(matris[0][2]=='x'){
    printf("TEBRIKLER KAZANDINIZ!!");
    break;
   }
   else{
    printf("MALESEF KAYBETTINIZ");
    break;
   }
  }
  if(matris[0][0]==matris[1][1]&&matris[1][1]==matris[2][2]){
   printf("OYUN BITTI!!");
   if(matris[0][0]=='x'){
    printf("TEBRIKLER KAZANDINIZ!!");
    break;
   }
   else{
    printf("MALESEF KAYBETTINIZ");
    break;
   }
  }
  if(matris[2][0]==matris[1][1]&&matris[1][1]==matris[0][2]){
   printf("OYUN BITTI!!");
   if(matris[2][0]=='x'){
    printf("TEBRIKLER KAZANDINIZ!!");
    break;
   }
   else{
    printf("MALESEF KAYBETTINIZ");
    break;
   }
  }
  if(k==8){
   printf("OYUN BERABERE BITTI!!");
   break;
  }
  
 }
} 
 return 0;
}

Ekran Çıktıları:





2 yorum: