Forum: Projeler pisti RSS
kart.d'yi nasıl gerçekleştireceğiz ?
Sayfa:  önceki  1  2  3  4  sonraki 
acehreli (Moderatör) #31
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 2169
canalpay:
bilgisayarın PSU'su patladı

Fazla program yazıyorsun! :-p

OyunKartıTanımla işlevindeki
    dchar[] biçimler="♠♡♢♣"d.dup;
    dchar[] değerler="234567890JQKA"d.dup;

dizileri randomShuffle yapar amacımıza erişiriz.

Nasıl düşündüğünü bilmiyorum ama 52'lik diziyi en sonunda karıştırmak daha iyi bir karışım sağlar; yoksa aynı şekilli kartlar hep bir arada bulunabilirler.

Ali
canalpay (Moderatör) #32
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ı
Nasıl düşündüğünü bilmiyorum ama 52'lik diziyi en sonunda karıştırmak daha iyi bir karışım sağlar; yoksa aynı şekilli kartlar hep bir arada bulunabilirler.
Tamam zaten öyle yapacaktım ki yaptımda. Ama olurda hata verirsede başka çözümümde var demeye getirdim:
OyunKartı[] OyunKartıTanımla()
out (sonuç)
{
    assert(sonuç.length == 52);
}
body
{
    dchar[] biçimler="♠♡♢♣"d.dup;
    dchar[] değerler="234567890JQKA"d.dup;
    OyunKartı[] kart;
    foreach(değer;değerler){
        foreach(biçim;biçimler){
            kart~=OyunKartı(değer,biçim);
        }
    }
    randomShuffle(kart);
    return kart;
}

Ordaki şu kod çok saçma değil mi ?
kart~=OyunKartı(değer,biçim);

Çok hız kaybettiriyordur. Onun yerine zaten sabit uzunlukta olduğuna göre dinamik dizi yerine sabit uzunlukta dizi tanımlayabilirdim ki yapacağımda.
canalpay (Moderatör) #33
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ı
Bütün dediklerimi yaptım:
http://github.com/acehreli/pisti/blob/master/pisti/kart.d

Artık bir yorum yapın kodlarla ilgili. (Çok yerden yere vurmayın :-p )
acehreli (Moderatör) #34
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #32
canalpay:
Ordaki şu kod çok saçma değil mi ?
kart~=OyunKartı(değer,biçim);

Bana çok mantıklı geliyor. Destenin sonuna yeni bir kart ekliyoruz.

Çok hız kaybettiriyordur

Doğru. Örneğin 100 nano saniye olacağına belki de 100 bin nano saniye oluyordur. Yani tam bin katı yavaştır! :) (Tamamen atıyorum; gerçekne ne olduğunu bilmiyorum.)

Ama dakikalarla ölçülen bir programın en başında ve bir kere yapılan bir işlemden bahsediyoruz.

Bu gibi hız endişeleri programcıların kafalarına hep girer. Çok bilinen endişelerdir. "Gerekmeden yapılan eniyileştirme her kötülüğün anasıdır" diye bilinir (premature optimization is the mother of all evil).

Doğru olan, programı açık ve okunaklı yazmaktır. Ondan sonra, ve eğer bir yavaşlık varsa, ancak ve ancak ölçtükten (profiling) sonra en çok yavaşlık getiren yerleri hızlandırılır.

Onun yerine zaten sabit uzunlukta olduğuna göre dinamik dizi yerine sabit uzunlukta dizi tanımlayabilirdim ki yapacağımda.

(Sonradan not: Gördüğüm kadarıyla dönüş türünü sabit uzunluklu yapmamışsın; yani bir dilim döndürüyorsun. O zaman bu paragrafta söylediğim geçerli değil. Şöyle demiştim: O ancak oyun sırasında da sabit kalacaksa olabilir. Sabit uzunluklu dizilerin uzunluğu değiştirilemez.)

Ayrıca, ister sabit dizi olsun, ister dinamik dizinin uzunluğu baştan kartlar.length=52 olarak belirlensin, dizilerin elemanları en başta varsayılan kurucuyla kurulurlar. Yani =52 yapılınca önce 52'lik ve varsayılan değerli bir dizi oluşur.

Ondan sonra, o dizilerin üstüne teker teker atarız. Eğer elemanların atanmaları veya varsayılan şekilde kurulmaları yavaşsa, zaten o yöntem de hızlı değildir.

Eğer gerçekten hız gerekiyorsa, bence burada yapılabilecek en hızlı çözüm, diziyi elle kurmak olabilir (derlemedim):

    OyunKartı[52] kart = [ OyunKartı('2', '♠'), /* ... */];

Ali
canalpay (Moderatör) #35
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ı
Bana çok mantıklı geliyor. Destenin sonuna yeni bir kart ekliyoruz.

Yine bence aynı şey oluyor. Ayrıca rastgele eklesede farketmez. Ve yine ayrıca trilerinde hatırlarım yine ~= şeklinde bir dinamik dizi ile gerçekleştirmiştim bir string işlevi. Sizde sabit uzunluktaki bir değer ile yapsan daha iyi olur demiştiniz.

Yani eski haline mi getireyim, bu halde mi kalsın yoksa daha başka bir hale mi getireyim ?
acehreli (Moderatör) #36
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
trilerinde hatırlarım yine ~= şeklinde bir dinamik dizi ile gerçekleştirmiştim bir string işlevi. Sizde sabit uzunluktaki bir değer ile yapsan daha iyi olur demiştiniz.

Tam olarak hangi işlev olduğunu hatırlamıyorum ama bir oyunun başındaki desteyi kuran işlevle bir kütüphanenin belki bir döngü içinde binlerce kere çağrılabilecek işlevini aynı şekilde düşünemeyiz.

Programcıya kalan çok karar var.

Yani eski haline mi getireyim, bu halde mi kalsın yoksa daha başka bir hale mi getireyim ?

Yazılmışsa değiştirmeye gerek yok. Birim testlerini geçtiği sürece işimize yarar. Birim testlerini biraz genişlettim; bir hatayı ortaya koyuyorlar. Düzeltmek gerek. ;)

Ali
canalpay (Moderatör) #37
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ı
Tamam OyunKartıTanımla işlevini eski haline getirdim ve hatada giderilmiş oldu. Eski hali derken hala sonucunda desteyi rastgele karıştırıyor.

Birde piştide söyle bir kural varmış :
# Temel kuralı, bir elde bir oyuncuya aynı karttan 3 tane aynı gelirse oyun direk düşer.

Bunu da  OyunKartıTanımla işlevinde gerçekleştirmek gerekir. Ama ondan önce siz bu aynı karttan 4 tane gelmemesini kontrol eden bir unittest tanımlar mısınız ?
canalpay (Moderatör) #38
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ı
Bunu da  OyunKartıTanımla işlevinde gerçekleştirmek gerekir. Ama ondan önce siz bu aynı karttan 4 tane gelmemesini kontrol eden bir unittest tanımlar mısınız ?

Şimdi farkettimde sizce de bunun kart modülü ile ilgisi var mı ? Bence yok. Bu değerleri hakem takip etmeli. Bu kuralın gerçekleşip gerçekleşmediğini hakem.d'de takip etmeliyiz.
acehreli (Moderatör) #39
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Her işlevi kendi birim testlerinde denetlemek gerekir.

OyunKartıTanımla'nın amacı nedir? Ne söz veriyor? (Tabii verdiği sözlerle ilgili ise aslında out bloğunu kullanmak daha doğru olur.)

OyunKartıTanımla'nın birim testleri ayrı olmalı, Hakem'inkiler ayrı.

Ali
canalpay (Moderatör) #40
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ı
OyunKartıTanımla'nın amacı nedir? Ne söz veriyor? (Tabii verdiği sözlerle ilgili ise aslında out bloğunu kullanmak daha doğru olur.)


OyunKartıTanımla'nın amacı piştide hatasız kullanabileceğimiz kartlar tanımlamak. Ama herşeyi onun içine atıpta işlevi şişirmeye gerek yok. Doğrudan kullanıp kullanamayacağımızı hakem.d'de tanımlasak bence daha iyi. Yoksa hakem(diğer bir adı ile denetleyici.d).d'nin amacı kalmaz.

Yani ikiside aynı yerde kesişiyor. Bir tanesinde ki bence hakem.d tanımlamak daha doğru. Ama sizin fikriniz bu fikirden daha doğrudur.
acehreli (Moderatör) #41
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İşlevin denetimini her çağıran yapsa gereksiz olur tabii; veya unutulur. Onun için her işlevin kendi testleri olmalı.

Bundan önce Hakem diye bir sınıfı Süper Zeka oyununda kullanmıştım. Orada iki görevi vardı:

- girişten gelen sayının oyun kurallarına uygun olup olmadığını denetlemek

- girişten gelen sayıya karşılık, oyun kurallarına uygun olan yanıt

Yoksa programın doğru yazılmış olmasıyla ilgisi yoktu.

Pişti oyununda da benzer şekilde bir hakem soyutlaması gelebilir, veya belki de gerek olmayabilir. Örneğin bir kartın puanının ne kadar olduğunu Hakem'e sormaya gerek yok galiba, çünkü o bilgi zaten kart.d'de var.

Ali
canalpay (Moderatör) #42
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ı
girişten gelen sayıya karşılık, oyun kurallarına uygun olan yanıt


Tamam. Hakem.d OyunKartıTanımlanın oyun kurallarına uygun bir yanıt döndürüp döndürmediğini denetleyecek. Eğer uygun yanıt vermemişse tekrar kartlar dağıtılacak.

Yani hakem.d şu kuralı denetleyecek :
# Temel kuralı, bir elde bir oyuncuya aynı karttan 3 tane aynı gelirse oyun direk düşer.

Bakacak. Deste bitene kadar aynı rakamlı karttan oyuncuya 2'den fazla kere gelmiş mi ? Örneğin joker kuzey oyuncusuna 3 kere geldi ise oyun tekrar başlatılacak.
acehreli (Moderatör) #43
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Hakem.d OyunKartıTanımlanın oyun kurallarına uygun bir yanıt döndürüp döndürmediğini denetleyecek.

Çok farklı düşünüyoruz. :) Pişti oynarken kartlar karıştırılır ve oyunculara dağıtılır. Yeni duyduğum kurala göre, elinde 3 kart olan kişi elini açar ve oyunu bozar.

Sen ise destenin uygun olarak karıştırılmasını sağlamak istiyorsun. Düşünce farkımız burada.

Ben, başından beri çok basit bir şey düşünüyorum: karışmış bir deste. Hepsi o kadar. (Senin de belirttiğin gibi, hiç "şişirmeden".)

Şimdi amacımız, bu basit birimin doğru çalıştığını denetlemek. Gerçekten bir deste döndürüyor mu? İşte onu out bloğunda veya birim testlerinde denetlememiz gerek.

Benim en son eklediğim testleri piştiden haberleri yoktu:

- bütün kartlar geçerli mi? yani dizinin bütün elemanları kurulmuş mu?

- tekrarlanan kağıt var mı?

Eğer uygun yanıt vermemişse tekrar kartlar dağıtılacak.

Evet, o "pişti" ile ilgili bir konu. Onun pişti hakemi yapar.

Ali
canalpay (Moderatör) #44
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ı
Yeni duyduğum kurala göre, elinde 3 kart olan kişi elini açar ve oyunu bozar.

Duyduğumuz ve uygulamak istediğimiz kurallar çok farklı olunca birbirimizi anlamıyoruz.

Bence Kuralları zamanında belirtseydik ve daha sonra projeyi bitirseydik ve daha daha sonra tekrar diğer kurallarıda kapsayacak esnek bir şekilde projeyi değiştirseydik herşey daha kolay olurdu. Bence projeler oldukça basit bir biçimde değiştirilebilir ama tek bir biçimde çalışan küçük projeler olarak tanımlanmalı ve daha sonrada ister istemez bu proje büyümeli.


Ayrıca siz hakem.d'de şöyle bir kural belirtmişiniz:
girişten gelen sayının oyun kurallarına uygun olup olmadığını denetlemek

Ama burda bunu giriş çıkış işlemleri ile uğraşan masa denetleyecek.
acehreli (Moderatör) #45
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Bence Kuralları zamanında belirtseydik ve daha sonra projeyi bitirseydik

Evet, anlaşmazlıklar olabiliyor.

Ayrıca siz hakem.d'de şöyle bir kural belirtmişiniz:
girişten gelen sayının oyun kurallarına uygun olup olmadığını denetlemek

Ama burda bunu giriş çıkış işlemleri ile uğraşan masa denetleyecek.

Bunlar benim kafamda canlandırdıklarım: "Masa" deyince benim aklıma oyunun masası geliyor. Masada oyuncular olur, belki önlerindeki kağıtlar, ortadaki kağıtlar, belki şu andaki puanları, vs. Yani masa, aslında pişti oyununda rol alan nesneleri içeriyor. Görüntüleme işini ise başka bir soyutlama, örneğin Çizici hallediyor. Masa, çiziciyi kullanarak görüntüleniyor.

Benim aklımda canlanan da oydu. Bu konuları güzelce yazmamız gerekiyor; yoksa böyle devam edecek... :)

Ali
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:  önceki  1  2  3  4  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-05-25, 16:57:11 (UTC -07:00)