Forum: Projeler pisti RSS
kart.d'yi nasıl gerçekleştireceğiz ?
Sayfa:  önceki  1  2  3  4  sonraki 
acehreli (Moderatör) #16
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 2147
Az ilgili not: belki de OyunKağıdı'nın DesteDeğer türünün içinde olmaması gerekiyor. Eğer OyunKağıdı yalnızca anahtarsa, değer tarafında bulunmasına gerek yok galiba.

Sorunun yanıtını biraz daha açayım:

kart.d içinde DesteDeğerTanımla() diye bir işlev var. O işlevin döndürdüğü tablo nerede yaşayacak? Programın durumuyla ilgili oynanmış.evet/hayır gibi bilgiler taşıdığı için, o tablodan tek adet bulunmalı. Kopyalarsak olmaz, çünkü kopyaların değişikliklerden haberleri olmaz.

Deste değerleri bilgisi, tek bir yerde yaşayacak.

Görevlinin de onu kullanması gerektiği için, en iyisi o tabloyu, görevli kurulurken vermek:

class Görevli
{
    DesteDeğer[] desteDeğer;
 
    this(DesteDeğer[] desteDeğer)
    {
        this.desteDeğer = desteDeğer;
    }
 
// ... desteDeğer'i istediği gibi kullanır ...
}

Olmaz mı?

Ali
canalpay (Moderatör) #17
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ı
Hala bir şey yapamadım.

Kart['2']['♣'] dediğimde puan.tek puan.pişti  davranış.normal  oynana.evet değerlerini döndürecek bir şey arıyorum

Nasıl int a =5 ; dediğimizde a yazdığımız yerde a 5 değerini döndürüyor.

Kart['2']['♣'] yazdığımda da "kartPuanı.çift,piştiPuanı.pişti,oynanmış.hayır,kartDavranışı.normal"               değerlerini döndürecek bir şey arıyorum.
canalpay (Moderatör) #18
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ı
Son şekli. Sadece şuan girintileme sorunu var. O halde buraya kopyalıyorum:
// Kart davranışları ve puanları burada tanımlanacak.
//module kart;
 
import std.string;
import std.stdio;
struct OyunKartı
{
    
    dchar değer;
    dchar biçim;
    string toString()
    {
        return format("%s %s",değer,biçim);
    }
}
    
enum kartPuanı
{
    yok =0,
    tek =1,
    çift =2,
    üç =3,
}
enum piştiPuanı
{
 
    pişti =10,
    valeliPişti =20 }
 
enum kartDavranışı
{
    normal,alır }
 
enum oynanmış
{
    evet,hayır }
 
 
struct DesteDeğer
{
    kartPuanı puan;
    piştiPuanı pişti;
    oynanmış oynanmış_mı;
    kartDavranışı davranış;
    
}
 
 
OyunKartı[] OyunKartıTanımla()
{
    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);
        }
    }
    
    return kart;
}
/*
* A : 1 puan x 4 = 4 puan
* J : 1 puan x 4 = 4 puan //Alır //pişti 20 puan
* sinek 2'li: 2 puan x 1 = 2 puan
* Karo 10'lu: 3 puan x 1 = 3 puan
*
* */
DesteDeğer[OyunKartı] DesteDeğerTanımla(OyunKartı[] kartlar)
{
DesteDeğer[OyunKartı] değerler;
foreach(kart;kartlar){
if(kart.değer=='A'){
değerler[kart]=DesteDeğer(kartPuanı.tek,piştiPuanı.pişti,
oynanmış.hayır,kartDavranışı.normal);
continue;
}
if(kart.değer=='J'){
değerler[kart]=DesteDeğer(kartPuanı.tek,piştiPuanı.valeliPişti,
oynanmış.hayır,kartDavranışı.alır);
continue;
}
if((kart.değer=='2')&&(kart.biçim=='♣')){
değerler[kart]=DesteDeğer(kartPuanı.çift,piştiPuanı.pişti,
oynanmış.hayır,kartDavranışı.normal);
continue;
}
if((kart.değer=='0')&&(kart.biçim=='♢')){
değerler[kart]=DesteDeğer(kartPuanı.üç,piştiPuanı.pişti,
oynanmış.hayır,kartDavranışı.normal);
continue;
}
 
değerler[kart]=DesteDeğer(kartPuanı.yok,piştiPuanı.pişti,
oynanmış.hayır,kartDavranışı.normal);
}
return değerler;
}
 
void main()
{
    OyunKartı kr= OyunKartı('0','♢');
    OyunKartı[] kartr=OyunKartıTanımla();
    DesteDeğer[OyunKartı] eş =DesteDeğerTanımla(kartr);
 
    writeln([kr]);
    
}
canalpay (Moderatör) #19
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ı
Daha önceki yazdığım koddaki
writeln(eş[kr]); iifadesinin çıktısı şu şekilde :
DesteDeğer(üç, pişti, hayır, normal)

Ben sadece üç değerine nasıl ulaşırım ?
acehreli (Moderatör) #20
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #17
Hiçbir zaman Kart['2']['♣'] yazmayacağız. Artık kartı ifade eden OyunKartı diye bir tür var. Gerektiğinde program içinde Kart('♣', '2') yazacağız ama ona da gerek olmayacak, çünkü öyle karakterler yalnızca OyunKartıTanımla'nın içinde geçiyorlar ve bir kere deste oluşturulduktan sonra yazmaya gerek yok.

Aslında DesteDeğerTanımla'nın içinde de geçiyorlar...

Bahsettiğin olay, verilen bir kartın bilgisine erişmek. Yani bir arama yapılacak. Çok dikkatli bakmamışım ama DesteDeğerTanımla()'nın bir eşleme tablosu döndüreceğini varsayıyordum. Öyle değilmiş. Öyle olsa, kolayca değerTablosu[kart] diyerek bütün bilgilere erişirdik.

Eğer DesteDeğerTanımla, gerçekten bir dizi döndürecekse, bu sefer de o diziyi baştan sona ilerleyerek istediğimiz kartın bilgisini elde edebiliriz.

Ben eşleme tablosu yöntemi için şöyle değişiklikler yaptım: DesteDeğerTanımla bir eşleme tablosu döndürsün (değişiklikleri ! ile işaretledim):

DesteDeğer[OyunKartı]/*!*/ DesteDeğerTanımla(OyunKartı[] kartlar)
{
    DesteDeğer[OyunKartı]/*!*/ değerler;
    foreach(kart;kartlar){
        if(kart.değer=='A'){
            değerler[kart]/*!*/ = DesteDeğer(kart,kartPuanı.tek,piştiPuanı.pişti,

Yani bütün değerler~=DesteDeğer(/*...*/) kullanımları yerine değerler[kart]=DesteDeğer(/*...*/) yazdım.

Ondan sonra şu deneme programıyla kart bilgilerine eriştim:

void main()
{
    OyunKartı[] deste = OyunKartıTanımla();
    DesteDeğer[OyunKartı] değerler = DesteDeğerTanımla(deste);
 
    // bu noktadan sonra istediğimiz kartın değerini elde edebiliriz:
 
    OyunKartı[] deneme_kartları = [ OyunKartı('5', '♠'),
                                    OyunKartı('2', '♣'),
                                    OyunKartı('6', '♢') ];
 
    foreach (kart; deneme_kartları) {
        if (kart in değerler) {
            auto değer = değerler[kart];
            writeln(değer.kart, " puanı: ", değer.puan);
        } else {
            writeln(kart, " tabloda yok!");
        }
    }
}

Ali
acehreli (Moderatör) #21
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #19
Tamam işte! :) Sen de aynısını yazmışsın...

canalpay:
Daha önceki yazdığım koddaki
writeln(eş[kr]); iifadesinin çıktısı şu şekilde :
DesteDeğer(üç, pişti, hayır, normal)

Ben sadece üç değerine nasıl ulaşırım ?

eş[kr].kart veya eş[kr].kart.değer

Ali
canalpay (Moderatör) #22
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 işte! :) Sen de aynısını yazmışsın...

Jokerli pişti 20 puan. En son ben yazdım puan bana eklenir :-)

Sanırım benim kodlarım sizinkinden biraz daha farklı. Şuan kafam durduğu için biraz ara vereceğim.
Çünkü eş[kr].kart veya eş[kr].kart.değer dediğimde hata veriyor.

kart.d(106): Error: no property 'kartPuanı' for type 'DesteDeğer'

Bu arada DesteDeğer Yapısından OyunKartı türünü çıkardım. Yani yeni şekli :
struct DesteDeğer
{
    kartPuanı puan;
    piştiPuanı pişti;
    oynanmış oynanmış_mı;
    kartDavranışı davranış;
   
}
acehreli (Moderatör) #23
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben çıkarttığını farketmediğim için öyle yazmışım. "üç"ün puan olduğunu da farketmemişim; kağıdın değeri sanmışım...

Şu nasıl: eş[kr].puan

Ali
canalpay (Moderatör) #24
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ı
Yanıtlanan mesaj #22
Sağolun anladım. Herhalde kafam çok dağıldı :-)

Şimdi kodları bir düzene sokup git ile yollayacağım. commit mesajı olarak ne desem ki :-)


Birde kartları karıştırma, ikiye kesme işlevlerinide kart.d'de mi yazalım ?
acehreli (Moderatör) #25
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
kartları karıştırma, ikiye kesme işlevlerinide kart.d'de mi yazalım ?

Sakıncası yok. deste modülü de düşünülebilir ama deste yalnızca OyunKartı[] olacaksa, yani daha başka özelliği bulunmuyorsa, kart.d'de durmasında da bir sakınca yok.

Ali
canalpay (Moderatör) #26
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ı
deste modülü de düşünülebilir ama deste yalnızca OyunKartı[] olacaksa, yani daha başka özelliği bulunmuyorsa, kart.d'de durmasında da bir sakınca yok.

Evet deste sadece OyunKartı dizisi olacak. Ama şimdi aklıma geldi de nasıl karıştıracağım. RandomShuffle sanırım hata verir.


void randomShuffle(Range, RandomGen = Random)(Range r,
 
        ref RandomGen gen = rndGen)
 
{
 
    foreach (i; 0 .. r.length)
 
    {
 
        swap(r[i], r[i + uniform(0, r.length - i, gen)]);
 
    }
 
}

randomShuffle böyle tanımlanmış. Burda yine sanırım std.algorithm'den swap işlevi kullanılmış. Eğer swap OyunKartı dizisini kabul ederse onu bu koddaki gibi karıştırırım.  Kabul etmezse herhalde swap işlevinide kendim yazmak zorunda kalırım.(Sanırım randomShuffle şablon ile yazılmış. O zaman hata vermez.)


Asıl merak ettiğim şey kağıdı kesme işi. Ben pişti oynarken kağıdı kesmede önemli bir amacımız yoktu. Bu projede kağıt kesmede geçerli olan kural ne olacak ?
acehreli (Moderatör) #27
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
RandomShuffle sanırım hata verir.

D'nin dizileri zaten rastgele erişimli aralık (random access range) olarak geçerler. O yüzden bütün Phobos aralık algoritmalarında kullanılabilirler.

Asıl merak ettiğim şey kağıdı kesme işi. Ben pişti oynarken kağıdı kesmede önemli bir amacımız yoktu. Bu projede kağıt kesmede geçerli olan kural ne olacak ?

Bazı pişti kurallarında kağıt kesilir, altına bakılır, eğer valeyse hemen ilk elde kesene verilir. Şimdilik bizi durduracak bir olay değil; sonra ilgileniriz.

İleride gerekince şöyle bir kodla kesilebilir:

    // en dışarıdan kesilememeli; kesim noktası [1,51] aralığında olmalı
    int kesimNoktası = uniform(0, 51) + 1;
 
    // Kesince ele gelen bölüm
    OyunKartı[] eldekiBölüm = deste[kesimNoktası .. $];
 
    // gerekirse çıkartılır ve kullanılır
    writeln("kesilen kağıt: ", eldekiBölüm[0]);
 
    // deste tekrar ters sırada birleştirilir
    deste = eldekiBölüm ~  deste[0 .. kesimNoktası];

Ali
canalpay (Moderatör) #28
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ı
D'nin dizileri zaten rastgele erişimli aralık (random access range) olarak geçerler. O yüzden bütün Phobos aralık algoritmalarında kullanılabilirler.


Yani bu DesteDeğer[OyunKartı] türünde tanımlanmış değerler değişkeni randomShuffle ile karıştırabilmesi gerekir.
   Ama randomShuffle(değerler); deyince kütüphane kabul etmiyor. Verdiği hata:


/home/canalpay/dmd/linux/bin/../../src/phobos/std/random.d(778): Error: cannot implicitly convert expression (i) of type uint to OyunKartı
/home/canalpay/dmd/linux/bin/../../src/phobos/std/random.d(778): Error: template std.random.uniform(string boundaries = "[)",T1,T2,UniformRandomNumberGenerator) if (is(CommonType!(T1,UniformRandomNumberGenerator) == void) && !is(CommonType!(T1,T2) == void)) does not match any function template declaration
/home/canalpay/dmd/linux/bin/../../src/phobos/std/random.d(778): Error: template std.random.uniform(string boundaries = "[)",T1,T2,UniformRandomNumberGenerator) if (is(CommonType!(T1,UniformRandomNumberGenerator) == void) && !is(CommonType!(T1,T2) == void)) cannot deduce template function from argument types !()(int,uint,MersenneTwisterEngine!(uint,32,624,397,31,-1727483681u,11,7,-1658038656u,15,-272236544u,18))
/home/canalpay/dmd/linux/bin/../../src/phobos/std/random.d(111): Error: template instance std.random.randomShuffle!(DesteDeğer[OyunKartı],MersenneTwisterEngine!(uint,32,624,397,31,-1727483681u,11,7,-1658038656u,15,-272236544u,18)) error instantiating
acehreli (Moderatör) #29
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Rastgele erişimli'nin (random access) anlamı, daha çok "tamsayı indeksle erişilebilir" olmalı. Bu açıdan, herhalde yalnızca dizileri veya dizi gibi erişilebilen veri yapılarını öyle kabul edebiliriz.

DenemeDeğer[OyunKartı] deyince eşleme tablosu oluyor. Eşleme tablosu ve agaç gibi yapıların kendi özel iç düzenleri olduğu için elemanları istediğimiz gibi yer değiştiremeyiz. O yüzden çalışmıyor. Daha doğrusu, sort kendi içinde herhalde tamsayı indeksle erişmeye çalışıyor ve o yüzden "uint'i OyunKartı'na dönüştüremiyorum" anlamında bir hata veriyor.

Pişti oyununda bizi ilgilendiren iki konu var:

1) Destenin fiziksel yapısı: Bunu bir dizi olarak halletmek çok doğal olur, çünkü zaten gerçek oyunda da art arda duran kağıtlar var. Dağıtmak da çok kolay olur: bir diziden dörder dörder azaltır, başka diziye (oyuncunun eline) ekleriz. Yere atarken de el dizisinden çıkartır ve yerdekiler dizisine ekleriz.

2) Her kağıt hakkında bilgi: Eşleme tablosunu bir veri tabanı gibi düşündük ve oyun kağıdının şekil+değer ikili değerini kullanarak kağıt hakkında bilgiye eriştik. Ama eğer hep OyunKartı dizileri ile ilgilenirsek, ayrıca eşleme tablosunda bilgi aramaya da gerek kalmaz. DesteDeğer, başlangıçta düşünüldüğü gibi yine bir OyunKartı içerebilir.

Yine başlangıçtaki gibi DesteDeğerTanımla da tekrar DesteDeğer[] döndürebilir. Sonuçta bu bir deste olabilir.

Eğer DesteDeğer[] ile amaç kağıt sayma gibi işlerse, aslında onu çıkanlar isminde başka bir dizi ile de halledebiliriz. O, DesteDeğer dizisi değil, OyunKartı[] dizisi olabilir.

Benim kendi fikrim şöyle: Bize oyun sırasında gereken, OyunKartı[] türleri; yani OyunKartı dizileri. Hem deste, hem yerdekiler, hem de eldekiler hem o türden olabilir. OyunKartı çok yalın olduğu için, kağıt saymak isteyenler kendileri için ayrıca bir çıkanlar isminde OyunKartı[] da barındırabilirler.

Ama OyunKartı'nın genişletilerek en azından puan gibi ek üyelerinin olmasını da anlıyorum. Zaten o yüzden DesteDeğer türüne doğru gitmeyi düşünmüş olmalısın. O da güzel.

Sonuçta, DesteDeğer elemanları serbestçe diziden diziye atlayabilen ve tek bir dizide yaşayan elemanlar mı olmalı, yoksa tek bir bilgi tablosunda oturan elemanlar mı?

Belki de fazla irdeliyorum... :/

Asıl soruya dönersek, elemanları rastgele veya başka bir şekilde sıralamak önemliyse eşleme tablosu değil dizi kullanmak gerekir.

Ali
canalpay (Moderatör) #30
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ı
Ben Kart.d'nin şu anki tasarımını çok sevdim.

randomShuffle'yi ben yanlış yerde kullandım. Bugün de aklım başımda değil. Çünkü bilgisayarın PSU'su patladı bir ses bir koku ve bir de korku. Belki ben bilgisayarın başında olmasam bir su almaya gitsem bazı kötü şeyler olabilirdi. PSU'yi açtım ve sigortanın camı bile kırılmış :-) Neyse konuya dönersek:

OyunKartı[] türünde oluşturulan 52'lik OyunKartı dizisi randomShuffle yapılmalı. Eğer onu randomShuffle yapamazsakta sorun yok. OyunKartıTanımla işlevindeki
    dchar[] biçimler="♠♡♢♣"d.dup;
    dchar[] değerler="234567890JQKA"d.dup;

dizileri randomShuffle yapar amacımıza erişiriz.
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-07-27, 01:50:46 (UTC -07:00)