Thread overview
Çok basit bir tic tac toe (xox) oyunu
Feb 25, 2013
yunusaydin
Feb 25, 2013
Salih Dinçer
Feb 26, 2013
yunusaydin
February 25, 2013

Arkadaşlar d de bayağı yeniyim. Ben de kendimi geliştirmek için basit bir xox oyunu yazdım. Ama normal olarak oyun konsol üzerinde çalışıyor ve mesela giriş yapabilmek için koordinat girmek gerekiyor, mause değil ve ayrıca ekran otomatik yenilenmiyor. Fakat ben bu uygulmamanın nasıl görsel arayüzde çalışabileceğini ( gerçek bir oyun gibi ) merak ediyorum. Beni bu konuda aydınlatabilir misiniz ?
Şimdiden teşekkürler :) ayrıca kodlarımı paylaşıyorum düzeltmem gereken bir yer varsa (optimizasyon açışından) lütfen söyleyin.

import std.stdio;

int[3][3] oyunTahtasi;
int r, c;
int hamle = 0, oyuncu = 1;

void main()
{
   oyunTahtasiYazdir();

   while(true) {
       writeln(oyuncu, ". oyuncunun sirasi");
       write("Konumu girin (once satir sonra sutun)(0-1-2) : ");
       readf(" %s %s", &r, &c);
       if (oyunTahtasi[r][c] == 0) {
           oyunTahtasi[r][c] = oyuncu;
           oyunTahtasiYazdir;
           oyuncu = ++hamle % 2 + 1;
       }
       else {
           continue;
       }

       if(oyunBiter()){
           break;
       }
   }
}

void oyunTahtasiYazdir()
{
   int i, k;

   writeln();
   for (i = 0; i < oyunTahtasi.length; ++i) {
       for (k = 0; k < oyunTahtasi.length; ++k) {
           write(oyunTahtasi[i][k]);
       }
       writeln();
   }
   writeln();
}

bool oyunBiter()
{
   if (hamle == 9) {
       writeln("Berabere kaldiniz.");
       return true;
   }

   if (oyuncu == 1) {
       oyuncu = 2;
   }
   else {
       oyuncu = 1;
   }

   if ((((oyunTahtasi[0][c] == oyunTahtasi[1][c]) & (oyunTahtasi[1][c] == oyunTahtasi[2][c]))) ||
       (((oyunTahtasi[r][0] == oyunTahtasi[r][1]) & (oyunTahtasi[r][1] == oyunTahtasi[r][2]))) ||
       (((oyunTahtasi[0][0] == oyunTahtasi[1][1]) & (oyunTahtasi[1][1] == oyunTahtasi[2][2]))
       & (oyunTahtasi [0][2] != 0)) ||
       (((oyunTahtasi[0][2] == oyunTahtasi[1][1]) & (oyunTahtasi[1][1] == oyunTahtasi[2][0]))
       & (oyunTahtasi [0][2] != 0)))  {
           writeln(oyuncu, ". oyuncu kazandi !");
           writeln("Tebrikler, ", hamle / 2 + 1, " hamlede kazandiniz.");
           return true;
       }
   else {
       if (oyuncu == 1) {
           oyuncu = 2;
       }
       else {
           oyuncu = 1;
       }
       return false;
   }

}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 25, 2013

Merhaba,

Öncelikle aramıza hoş geldin Yunus...:)

Bu tür oyunları ve nicesini SDL kütüphanesini veya bir başkasını kullanarak yapabilirsin. Çünkü D, herhangi bir dilde yazılmış kütüphaneleri (çoklu kalıtımlı olanlar dışındakileri) destekler. Bunun için kendi ilintilerini yazabileceğin gibi halen geliştirdiğim SDL Mini (https://github.com/salihdb/SDLbindings/) modülünü de kullanabilirsin...

Gerçi yeni sürümü henüz yüklemedim ve bir takım geliştirmeleri mevcut. Ama şu an ki sürümde bir Japon Bayrağı yapmak aşağıdaki kadar kolay. Zaten oyunun sahnesini çizmek için temel öğeler ve fazlası mevcut. Bir tek mouse ile alakalı şeyler için biraz beklemen gerekebilir..

import sdlmini;

void main() {
   /* with() ile kuruyoruz ki sınıfın tüm olanaklarından sanki içindeymiş gibi faydalanalım,
    * ancak renk yapısını sınıf içine almadım ve eğer black seçerseniz SDL'nin varsayılanı
    * olduğundan değişim olmaz. Ama kurucunun ve tüm işlevlerin varsayılan rengi beyaz!
    * Aşağıda bunu göstermek için gereksiz yere kullandım...:)
    */
   with( new scene(600, 400, "Japon Bayrağı", clr.white) ) {
     do {
          circle( w/2, h/2, cast(int)(h/(5/3.0))/2, clr.red );
          /* keyEvent() işlevi eğer:
           * 0 olursa, sahne ESC beklemek üzere durur (döngüyü dondurur/by-pass)
           * 1 olursa, arada ESC basıldımı diye bakar ve basıldıysa çıkar
           * 2 olursa, arada ESC basılmasına iki defa bakar: ilkinde durur, ikincisinde çıkar (0 durumu)
           */
     } while( escEvent(1) );
   }
   SDL_Quit();
}

Bu örneği, ''dmd japonBayrak sdlmini -L-lSDL'' şeklinde derlemen yeterli. Tabi sisteminde yüklü SDL kütüphanesi olma şartı var. Hatta hiç bir örneğe ihtiyaç duymadan sdlmini'yi test eden kodu şu şekilde de çalıştırabilirsin:
Alıntı:

>

'dmd sdlmini -L-lSDL -debug'

Orada bir kısım olanaklar test edilmiş. Aslında daha çok imkan var. Yani mini olduğuna bakma, hatta SDL'de çok güzel olaylar var. Hele basit örnekler ile başla. Eminim zamanla çok hoşuna gidecektir.

Başarılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 25, 2013

Hoşgeldin yunusaydin! :)

Program başlangıç için çok güzel ama tabii ki geliştirilebilir. Gözüme çarpanlar:

  • Global değişkenlerden kaçınmak gerek. Bunlar programın farklı parçalarının bağımsız olarak davranmalarına engel olurlar. Onun yerine gerekenleri işlevlere parametre olarak geçirmeye çalışılır. Örneğin oyunTahtasiYazdir'a hangi oyun tahtasını yazdıracağı parametre olarak verilebilir.

  • oyunBiter() gibi işlevlerin isimlerini standart olsun diye soru kipinde yazmayı yeğliyoruz: oyunBitti_mi() gibi...

  • oyunBitti_mi() gibi bir işlevin yalnızca oyunun bitip bitmediğini bildirmesi çok daha iyi olur. Öyle bir işlevin bazen standart çıktıya metin yazdırıyor olması kullanışlılığını düşürür. Eğer olabiliyorsa o yalnızca bu bilgiyi versin ve onu çağıran başka bir kod gerekiyorsa çıktıya bir şey yazdırsın. Böylece oyuncu numarasının bu işlev içinde değiştirilmesi de gerekmemiş olur.

  • oyunBitti_mi() içinde & işlecini kullanmışsın ama sanırım && olacak. (Burada tesadüfen doğru sonucu üretiyor.)

  • oyunTahtasiYazdir() gibi işlevler daha kısa olarak da yazılabilir:

void oyunTahtasiYazdir()
{
   writeln();
   writefln("%(%(%s%)\n%)", oyunTahtasi);
   writeln();
}

Tabii writeln() çağrıları yerine düzen dizgisinde '\n' de kullanılabilir ama ortalığı daha karıştırmak istemedim. :) Bu olanağı şurada konuşmuştuk:

http://ddili.org/forum/thread/998

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 26, 2013

Cevaplarınız için çok sağolun, teşekkür ederim :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]