Forum: Projeler Genel RSS
Çok basit bir tic tac toe (xox) oyunu
yunusaydin #1
Üye Şub 2013 tarihinden beri · 4 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Çok basit bir tic tac toe (xox) oyunu
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;
    }
 
}
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1908 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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 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:
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2013-02-25, 12:24.
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
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
yunusaydin #4
Üye Şub 2013 tarihinden beri · 4 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Cevaplarınız için çok sağolun, teşekkür ederim :)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Projeler Genel RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-10-18, 05:55:11 (UTC -07:00)