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;
}
Bu yorum yazar tarafından silindi.
YanıtlaSilsrand(time(NULL)); burası hata veriyor
YanıtlaSil