Forum: Projeler pisti RSS
Oyunun çizilmesi
Sayfa:  1  2  sonraki 
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Oyunun çizilmesi
Can'dan şimdiye kadar duyduğumuz tasarımlar oyunun görüntülenmesini dışarıda bıraktıklarına göre, o konuyu onun tasarımlarından bağımsız olarak düşünmeye başlayabiliriz.

Oyunun nasıl görüntüleneceğini düşünelim. Bunun için birden çok ortam kullanabileceğimizi biliyoruz: GtkD, QtD, konsol ekranı, vs. Bunların hepsi ile de uyumlu olan nasıl bir arayüz düşünebiliriz?

Programı hangi ortamda çalıştığımızdan bağımsız olarak işleteceğiz, ve örneğin çiz() diyerek oyunun belirli bir anının görüntülenmesini sağlayacağız. Bunun için, ortamdan bağımsız bir arayüz tasarlamak gerekiyor.

Sesli düşünüyorum...

class OyunÇizici
{
    int yükseklik;
    int genişlik;
    // vs.
 
    this(int yükseklik, int genişlik, /* vs. */)
    {
        // ...
    }
 
    // masayı boşaltır
    abstract void sil();
 
    // masaya bir nesne yerleştirir
    abstract void yerleştir(Konum konum, OyunNesnesi nesne);
 
    // bütün masayı gösterir ortama uygun olarak gösterir
    abstract void çiz();
 
    // insan oyuncuyla etkileşir ve eldeki kağıtlardan hangisinin
    // seçildiğini döndürür
    abstract int kağıtSeç(OyunKartı[] el);
}

Bu sınıf, Can'ın Masa'sı tarafından kullanılabilir ve ortama uygun olarak çalışır.

Tabii aslında bu sınıftan türetilen bir çizici kullanılır. Bunu en kolay olarak konsol ortamında yazabiliriz:

class KonsolOyunÇizici : OyunÇizici
{
    dchar[][] tuval; // bütün masanın çizildiği 'resim'
 
    // ... yukarıdaki işlevleri iki boyutlu dizi içine çizecek şekilde tanımlar
}

KonsolOyunÇizici.çiz işlevi çok çok kolay olarak, tuval'in satırlarını art arda ekrana yazar. Ve örneğin şöyle bir çıktı elde edilir:

          Oyuncu 1
Oyuncu 2            Oyuncu 3
            Ali
        5♢ K♡ K♠ 4♡

(Tabii tasarıma göre masada başka oyun nesneleri de bulunabilir.)

Ne dersiniz? Can'dan başkaları öncelikli olacak şekilde ;) bu konuda çalışmak isteyen var mı? :)

Aslında aynı fikirden İşlevler dersinin 3 numaralı probleminde de söz etmiştim:

  http://ddili.org/ders/d/islevler.html

Tabii başka birisi de GtkD veya QtD veya başka bir ortam için de yazabilir. Yukarıdaki kodlar da tamamen taslak... :) Yazmaya başladıkça değişmesi gerekecektir...

Ali
canalpay (Moderatör) #2
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Can'dan şimdiye kadar duyduğumuz tasarımlar oyunun görüntülenmesini dışarıda bıraktıklarına göre, o konuyu onun tasarımlarından bağımsız olarak düşünmeye başlayabiliriz.

Evet aynen öyle. Sizcede daha iyi olmadı mı ?

Ne dersiniz? Can'dan başkaları öncelikli olacak şekilde ;) bu konuda çalışmak isteyen var mı? :)

Beni şutluyorsunuz sanırım. Size başarılar. Oyun görüntülenirken gtkD ve qtD ile uğraşmak istemeyenler belki curses ile uğraşmak isteyebilirler. Yani cursesi D'de çalıştırdık, isteyen onlar ile uğraşşsın. Veya herşeyi kendileri yazmak isteyebilir.

Size başarılar !

Not : Ben yokum rahat rahat projenin bu kısmına bulaşabilirsiniz :-p
Avatar
Racih (Moderatör) #3
Üye Ağu 2009 tarihinden beri · 126 mesaj · Konum: Antalya
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hmm bak bu benlik iş :P . Ben uğraşıyım, öğrene öğrene ilerlerim.
canalpay (Moderatör) #4
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ramazan Bey şimdiden şu kodlardaki

struct KullanıcıAyarları
{
    dchar[] kulllanıcıAdı;
    int kişiSayısı;
    int bitmePuanı;
    
}

değerleri kullanıcıdan alan bir arayüz yapmaya kalkışabilirsiniz. İster gtkD ile ister qtD ile(Sanırım siz çalıştıramadınız ama Mengü Bey çalıştırmış idi. Ona nasıl çalıştırdığını sorabiliriz.) ister kendiniz sıfırdan bir konsol arayüzü yazarak isterseniz curses ile(http://ddili.org/forum/post/1921'de bağlayıcının kodları var.).
Avatar
Racih (Moderatör) #5
Üye Ağu 2009 tarihinden beri · 126 mesaj · Konum: Antalya
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler :) ncurses le uğraşıyordum. Fakat getmaxyx si tanımadı.

benim_ncurses.d dosyasına şunu ekledim;
int getmaxyx(WINDOW *win,int row, int col);

deneme.d ye şunu ekledim;
getmaxyx(stdscr,row,col);

dmd -w -L-lncurses deneme.d ile derledim verdiği hata;

deneme.o: In function `_Dmain':
deneme.d:(.text._Dmain+0x23): undefined reference to `getmaxyx'
collect2: ld çıkış durumu 1 ile döndü
--- errorlevel 1

Düzeltme : Şuan getmaxy ve getmaxx olarak iki fonksiyona ayrılmış. Şimdi diğer sorunlarla uğraşıyorum.
Bu mesaj Racih tarafından değiştirildi; zaman: 2010-06-17, 10:06.
canalpay (Moderatör) #6
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bende tanıtamadım. Ama benim bildiğim benim_ncurses.d dosyasına :
extern (C) int getmaxyx(WINDOW *win,int row, int col);
eklenmesi gerekiyor.

Ancak yine de aynı hata veriyor.

Ve benim bildiğim kadarıyla(KUTALMIS Bey beni aydınlatmıştı : http://ddili.org/forum/post/1887) bu hata bağlayıcının bizim şu komutta dmd -w -L-lncurses deneme.d kırmızı olarak tanımladığımız yerde getmaxyx işlevini tanımlanmadığını söylüyor.

Ali Bey gelince yanlışım var ise söyler ancak ben böyle biliyorum.
Avatar
Racih (Moderatör) #7
Üye Ağu 2009 tarihinden beri · 126 mesaj · Konum: Antalya
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
ozaman
extern (c) {
int getmaxx(WINDOW *win,int row);
int getmaxy(WINDOW *win,int col);
int raw();
}

bu şekilde de çalışması lazım. Ama böylede o komut yemedi.
canalpay (Moderatör) #8
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şöyle bir hata mı verdi :
curses.d(521): valid linkage identifiers are D, C, C++, Pascal, Windows, System

Eğer böyle bir hata verdiyse extern (c) yerine extern (C) yaz. Yani C'yi büyük yaz.

Çünkü ben getmaxy'yi denedim ve derlendi. Yok eğer başka bir hata varsa hata kodunuda söyleki anlayabilelim.
Avatar
Racih (Moderatör) #9
Üye Ağu 2009 tarihinden beri · 126 mesaj · Konum: Antalya
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
bende de derlendi fakat boş değer veriyor. Ayrıca parçalama hatası diyor. Benden kaynaklı bir hata var. Ah bir bulsam
canalpay (Moderatör) #10
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet size özgü bir hata.
şöyle bir kod:
writeln(getmaxy(stdscr,5));

-1 değerini çıkışa yazdırıyor.
Avatar
Racih (Moderatör) #11
Üye Ağu 2009 tarihinden beri · 126 mesaj · Konum: Antalya
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Galiba pencere yaratılmadığından dolayı bu şekilde oluyor. En iyisi bir birleştirici yazmak.

Düzeltme : Tamam hallettim. Sorun Pencerenin boyutlandırılmaması. Ayrıca konum belirlemede kullanılan mvprintw yi yanlış kullanmışım.
Eski Hali;
int mvprintw(int x,int y,...);

Şimdiki Hali;
int mvprintw(int x,int y,const char *fmt,...);

Ali abi 3 noktayı anlatırsa iyi olur :)
Bu mesaj Racih tarafından değiştirildi; zaman: 2010-06-17, 14:03.
canalpay (Moderatör) #12
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Benim curses.d dosyam : http://paste.linux-sevenler.org/index.php?id=32352

Benim örnek.d dosyam :
import curses;
import std.stdio;
void main()
{
    writeln(getmaxy(stdscr,5));
}

Derleme komudum :dmd -w -L-lncurses örnek.d
Ve ardından çalıştırma : ./örnek

Eğer çalışmaz ve parçalama hatası verirse dmd klasörünün(dizininin) içinde D ile örnekler var. Onları derleyin. Yada en basitinden merhaba dünya programını derleyin:
import std.stdio;
 
void main()
{
    writeln("Merhaba dünya!");
}

Bunlarda da çalıştırır ve parçalama hatası yada benzeri bir hata alırsanız derleyiciyi tamamen bütün herşeyi ile silin ve yeniden kurun. Çalışır. Çünkü benim başıma böyle bir şey gelmişti. Sizinde başınıza gelmiş olabilir.
acehreli (Moderatör) #13
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #11
Racih:
int mvprintw(int x,int y,const char *fmt,...);

Ali abi 3 noktayı anlatırsa iyi olur :)

Ben C'den gelen üç noktayı şu derste 'Belirsiz sayıda parametreler' başlığı altında bilerek eksik bırakmıştım: :)

  http://ddili.org/ders/d/parametre_serbestligi.html

_argptr kullanan yöntem hem daha zor, hem de güvensiz. C kütüphaneleriyle etkileşirken kullanmak zorundayız. Onun yerine, D'nin daha kolay kullanılan olanağını göstermiştim.

Bence bu ayrıntılar tam forumlara göre işte... :)

İngilizce belgelerde 'C-style Variadic Functions' başlığında geçiyor:

  http://www.digitalmars.com/d/2.0/function.html

Oradaki örneklerdeki gibi kullanmak riskli. Onun için std.c.stdarg modülü öneriliyor:

  http://www.digitalmars.com/d/2.0/phobos/std_c_stdarg.html

O sayfa boş olduğu için kendimiz yazmaya çalışalım...

Asıl modül dmd'nin altında şu dizinde:

  src/druntime/src/core/stdc/stdarg.d

import std.stdio;
import std.c.stdarg;
 
/*
 * Bu işlev, D'nin C'den aldığı 'belirsiz sayıda parametreli işlev' olanağının
 * kullanımını gösterir. (variadic function parameters).
 *
 * Önce va_start çağrılır, parametrelere va_arg ile erişilir, en sonunda da
 * va_end çağrılır.
 */
void printf_gibi(string düzen, ...)
{
    /*
     * Bizimle doğrudan ilgisi yok; va_ işlevleri bunu kullanacaklar
     */
    va_list parametreler;
 
    /*
     * Birinci parametre, bizim yukarıda tanımladığımız va_list. İkinci
     * parametre ise, '...'den önce gelen parametrenin nerede olduğunu
     * bildiriyor. Bu işlevde '...'den önce 'düzen' olduğu için onu yazıyoruz.
     *
     * Bu işlevden çıkılırken va_end'in de çağrılması gerekir. Unutmamak için
     * onu da scope(exit) ile bildiriyoruz.
     */
    va_start(parametreler, düzen);
    scope(exit) va_end(parametreler);
 
    /*
     * Bu gibi işlevlerde, '...' ile gelen parametrelerin türleri
     * bilinemez. Zaten riskli olmalarının nedeni de odur. Örneğin printf'te de
     * %d yazıp float gönderilebilir ve hatalar oluşabilir.
     *
     * Burada, düzen karakterlerine bakarak ve onlara güvenerek asıl türleri
     * kendimiz açıkça yazacağız.
     */
    foreach (sayaç, düzenKarakteri; düzen) {
        write(sayaç, ": ");
 
        switch (düzenKarakteri) {
        case 'i':
            /*
             * 'i' olduğuna göre bir 'int' olduğunu düşünüyoruz va va_arg!int
             * ile dönüştürüyoruz.
             */
            int sayı = va_arg!int(parametreler);
            write(sayı);
            break;
 
        case 'd':
            /*
             * Aynı şey, ama açıkça değişken tanımlamadım:
             */
            write(va_arg!double(parametreler));
            break;
 
        default:
            throw new Exception("Bilinmeyen düzen karakteri: " ~ düzenKarakteri);
        }
 
        writeln();
    }
}
 
void main()
{
    printf_gibi("idii", 42, 1.25, 7, 100);
}

O program scope(exit)'in de güzel bir örneği oldu! :) va_start kullanılmışsa, va_end'in de çağrılması gerekir. scope(exit) ile bunu garantiliyoruz. scope(exit) ve arkadaşları şurada:

  http://ddili.org/ders/d/hatalar.html

Ali
acehreli (Moderatör) #14
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #12
canalpay:
parçalama hatası yada benzeri bir hata alırsanız derleyiciyi tamamen bütün herşeyi ile silin ve yeniden kurun. Çalışır. Çünkü benim başıma böyle bir şey gelmişti

Yeni derleyiciyle eski libphobos.a'yı karıştırınca olabilir öyle hatalar.

Eski kurma adımlarında libphobos.a'yı /usr/lib'e kopyalamak da vardı. Artık o adımı çıkarttım; çünkü gerek yok. dmd, kendisine uygun libphobos.a'yı zaten kendi alt dizinlerinde buluyor.

Ali
Avatar
Racih (Moderatör) #15
Üye Ağu 2009 tarihinden beri · 126 mesaj · Konum: Antalya
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çok teşekkürler Ali abi :) ellerine sağlık olayı anladım.

Bende ufak ufak masa çervesini çizmeye başlıyorum. Aynı anda dcurses diye birleştiriciyi çıkarmaya başlıyorum. Senin örneklerini taban alarak devam ediyorum.

kartui.d
import dcurses;
import std.stdio;
 
struct masaSınırBölgesi{
    int ls,rs,ts,bs,
    tl,tr,bl,br;
}
struct masaYapısı{
    int baslangicx,baslangicy;
    int yükseklik, genişlik;
    masaSınırBölgesi sınırBölgesi;
}
 
void main()
{
    
    int c;
    int row;
    int col;
    // Baştan bunu cağırmak şartmış
    initscr();
    getmaxy(stdscr,col);
    getmaxy(stdscr,row);
    
    // Bunların çağrılması öneriliyor
    noecho();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);
    row = 5;
    col = 4;
    mvprintw(1,1,"Cikmak icin q tusuna basin");
    mvprintw(row,col,"Masa ");
    while (c != 'q') {
        c = getch();
    }
    
    // Temizlik
    endwin();
} 
void MasayıÇiz(masaYapısı m){
    m.baslangicx = 10;
    m.baslangicy = 20;
    m.yükseklik = 30;
    m.genişlik = 40;
    
}

dcurses.d

module dcurses;
 
extern (C){
 
enum TRUE = 1;
enum FALSE = 0;
 
alias void WINDOW;
 
WINDOW * initscr();
int getmaxy(WINDOW *win,int y);
int getmaxx(WINDOW *win, int x);
int raw();
int cbreak();
int noecho();
int nonl();
int start_color();
int init_pair(short pair, short f, short b);
int init_color(short color, short r, short g, short b);
bool has_colors();
bool can_change_color();
int color_content(short color, short *r, short *g, short *b);
int pair_content(short pair, short *f, short *b);
int intrflush(WINDOW * win, bool bf);
 
// Hile: extern NCURSES_EXPORT_VAR(WINDOW *)   stdscr;
__gshared WINDOW * stdscr;
int keypad(WINDOW *win, bool bf);
int refresh();
int getch();
int printw(const char *fmt, ...);
 
int mvprintw(int x,int y,const char *fmt,...);
int endwin(); 
}

Türkçe karakter sorunu var. Onuda en sona bırakayım. Şuan çerçeveyi oluşturmaya devam ediyorum :).
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:
Sayfa:  1  2  sonraki 
Forum: Projeler pisti 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-12-16, 16:37:57 (UTC -08:00)