dlha metoda + test

Programovacie jazyky, rady, poradňa...
p4to
Expert
Expert
Používateľov profilový obrázok
Príspevky: 156
Registrovaný: 17 jún 2010, 8:07

dlha metoda + test

Príspevok od používateľa p4to »

Zdravim,
Kodim hru Black Jack v C# a mam tam jednu metodu ktora vracia podla kombinacie kariet optimalny tah hraca, problem je ze metoda je dost dlha a tazko citatelna...
Chcem sa spytat ci by sa dala este nieako zjednodusit...
+ by som chcel pouzit unit test na tuto metodu.. avsak kombinacii je strasne vela a kontrola je ties narocna ...

tu je obrazok podla ktoreho som vytvoril metodu
strategia
strategia
Kod je tu

Kód: Vybrať všetko

public RozhodnutieHraca OptimalDecision()
        {
            Karta krupier = _round.KrupieroveKarty[0];
            Karta k1 = _round.HracoveKarty[0];
            Karta k2 = _round.HracoveKarty[1];
            ushort kombinacia = DajLepsiuKombinaciu(_round.HracoveKarty);

            // A,A  
            if (k1.HodnotaKarty == HodnotaKarty.Ace &&
                k2.HodnotaKarty == HodnotaKarty.Ace)
                return RozhodnutieHraca.Split;
            // 8,8 
            if (k1.HodnotaKarty == HodnotaKarty.Eight &&
                k2.HodnotaKarty == HodnotaKarty.Eight)
                return RozhodnutieHraca.Split;
            // 7,7 
            if (k1.HodnotaKarty == HodnotaKarty.Seven &&
                k2.HodnotaKarty == HodnotaKarty.Seven)
            {
                if (krupier.HodnotaKarty == HodnotaKarty.Ace)
                    return RozhodnutieHraca.Hit;
                if (krupier.HodnotaKarty.Hodnota <= 7)
                    return RozhodnutieHraca.Split;
                return RozhodnutieHraca.Hit;
            }
            // 6,6 
            if (k1.HodnotaKarty == HodnotaKarty.Six &&
                k2.HodnotaKarty == HodnotaKarty.Six)
            {
                if (krupier.HodnotaKarty == HodnotaKarty.Ace)
                    return RozhodnutieHraca.Hit;
                if (krupier.HodnotaKarty.Hodnota <= 6)
                    return RozhodnutieHraca.Split;
                return RozhodnutieHraca.Hit;
            }
            // 9, 9    
            if (k1.HodnotaKarty.Hodnota == 9 &&
                k2.HodnotaKarty.Hodnota == 9)
            {
                if (krupier.HodnotaKarty.Hodnota == 7 ||
                    krupier.HodnotaKarty.Hodnota >= 10 ||
                    krupier.HodnotaKarty.Hodnota == 1)
                    return RozhodnutieHraca.Stand;

                return RozhodnutieHraca.Split;
            }
            // 17+
            if (kombinacia >= 17)
                return RozhodnutieHraca.Stand;
            // 8-
            if (kombinacia < 9)
                return RozhodnutieHraca.Hit;
            //12 - 16
            if (kombinacia > 11 &&
                kombinacia < 17)
            {
                if (krupier.HodnotaKarty.Hodnota >= 7)
                    return RozhodnutieHraca.Hit;
                if (kombinacia == 12 && (krupier.HodnotaKarty.Hodnota <= 3))
                    return RozhodnutieHraca.Hit;
                return RozhodnutieHraca.Stand;
            }
            //  X,X    A
            if (krupier.HodnotaKarty == HodnotaKarty.Ace)
                return RozhodnutieHraca.Hit;
            // 5, 5
            if (k1.HodnotaKarty == HodnotaKarty.Five &&
                k2.HodnotaKarty == HodnotaKarty.Five)
            {
                if (krupier.HodnotaKarty.Hodnota <= 9)
                    return RozhodnutieHraca.Double;
                return RozhodnutieHraca.Hit;
            }
            // 4, 4
            if (k1.HodnotaKarty == HodnotaKarty.Four &&
                k2.HodnotaKarty == HodnotaKarty.Four)
            {
                if (krupier.HodnotaKarty.Hodnota == 5 ||
                    krupier.HodnotaKarty.Hodnota == 6)
                    return RozhodnutieHraca.Split;
                return RozhodnutieHraca.Hit;
            }
            // 3,3; 2,2
            if (k1.HodnotaKarty.Hodnota<=3 &&
                k2.HodnotaKarty.Hodnota<=3)
            {
                if (krupier.HodnotaKarty.Hodnota <= 7)
                    return RozhodnutieHraca.Split;
                return RozhodnutieHraca.Hit;
            }
            // x,x,  5,6
            if (krupier.HodnotaKarty == HodnotaKarty.Six ||
                krupier.HodnotaKarty == HodnotaKarty.Five)
            {
                return RozhodnutieHraca.Double;
            }
            //A,7; 7,A 
            if ((k1.HodnotaKarty == HodnotaKarty.Ace && k2.HodnotaKarty == HodnotaKarty.Seven) ||
                (k2.HodnotaKarty == HodnotaKarty.Ace && k1.HodnotaKarty == HodnotaKarty.Seven))
            {
                if(new ushort[]{2, 7, 8}.Contains(krupier.HodnotaKarty.Hodnota)) 
                    return RozhodnutieHraca.Stand;
                if (new ushort[] { 3,4 }.Contains(krupier.HodnotaKarty.Hodnota))
                    return RozhodnutieHraca.Double;
                return RozhodnutieHraca.Hit;
            }
            // 10
            if (kombinacia == 10)
            {
                if(krupier.HodnotaKarty.Hodnota== 10)
                    return RozhodnutieHraca.Hit;
                return RozhodnutieHraca.Double;
            }
            // 11
            if (kombinacia == 11)
                return RozhodnutieHraca.Double;

            // xx     7+
            if(krupier.HodnotaKarty.Hodnota>=7)
                return RozhodnutieHraca.Hit;
            if(krupier.HodnotaKarty == HodnotaKarty.Two)
                return  RozhodnutieHraca.Hit;
            if(kombinacia==9)
                return RozhodnutieHraca.Double;
            if( (k1.HodnotaKarty == HodnotaKarty.Ace && k2.HodnotaKarty == HodnotaKarty.Six) ||
                (k2.HodnotaKarty == HodnotaKarty.Ace && k1.HodnotaKarty == HodnotaKarty.Six)  )
                return RozhodnutieHraca.Double;

            if (krupier.HodnotaKarty == HodnotaKarty.Four)
            {
                if(new ushort[]{4,5}.Contains(k1.HodnotaKarty.Hodnota) || 
                    new ushort[]{4,5}.Contains(k2.HodnotaKarty.Hodnota))
                    return RozhodnutieHraca.Double;
            }

            return RozhodnutieHraca.Hit;
        }
Dakujem
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: dlha metoda + test

Príspevok od používateľa audiotrack »

ja by som to možno vôbec nerobil takto podmienkovo. Ten obrázok čo si ukázal je krásna matica. Tú by som si definoval, a potom už len zoberiem hodnotu na danom indexe podla karty krupiera a hráča.
p4to
Expert
Expert
Používateľov profilový obrázok
Príspevky: 156
Registrovaný: 17 jún 2010, 8:07

Re: dlha metoda + test

Príspevok od používateľa p4to »

matica napadla aj mna ale ked som si predstavil, ako to budem pisat tak som chcel skusit tie if-y ...
teraz ma napadli dve matice. Jedna trojrozmerna hracova karta 1, hracova karta 2 a krupierova karta a druha dvojrozmerna matica pre kombinaciu hracovych kariet a krupierovu kartu

ponecham oba sposoboby a porovnam ich cez unit testy (vystup ci sa zhoduje), porovnam aj kolko to bude mat riadkom ...potom to sem hodim pre vas :)

kazdopadne diki za odpoved
Aiden
Darca
Darca
Používateľov profilový obrázok
Príspevky: 2213
Registrovaný: 06 apr 2007, 14:28

Re: dlha metoda + test

Príspevok od používateľa Aiden »

Pocet riadkov by som bral do uvahy najmenej, za ovela dolezitejsiu povazujem citatelnost kodu. To ti casto krat prinasa aj kratke methods, lahsi unit testing a nizsi cost of change v pripade potreby. Spominany maticovy pristup je rozhodne lepsi, ako vnorene podmienky.
Napísať odpoveď