Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
David Bubenik:20.2.2015 11:01

EDIT: Omlouvám se za chybu v nadpisu! NEvšiml jsem si toho :D :D

Čau,
objevil se mi takový větší problém, který nedokážu vyřešit a proto se obracím na vás :D

Ve škole máme projekt, ve kterém máme za 14 dní vyhotovit ve VS Multiplayer Texas Holdem Poker.

Náhodná generace a ukládání karet hráčům + Vykládání karet na stůl již mám zasebou, ale samozřejmně mi vznikl problém s "logikou solvování" karet.

Prasácky se mi povedlo zjistit kdy je mezi 7dmi kartami 5 stejně barevných, protože karta je pole [číslo,barva].

Zaboha ale nevím jak na postupku. Nevím, jak zjistit, zda se v poli nachází 5 po sobě jdoucích karet.

Stejně tak nedokážu vymyslet, jak smazat z pole karty, které jsou vyložené 2x, abych předešel nějakým chybám v zjištování.

Samozřejmně jsem debil a zatím nedokážu vymyslet ani fullhouse, dvojičku, trojičku, apod.

Není tady nějaká hodná duše, která poradí?

Editováno 20.2.2015 11:02
Odpovědět
20.2.2015 11:01
Hardware je to, do čeho můžež kopnout, když nefunguje software.
Avatar
hanpari
Tvůrce
Avatar
Odpovídá na David Bubenik
hanpari:20.2.2015 12:13

Velice stručně.
Setřídíš karty podle velikosti
Zjistíš a uložíš si hodnotu nejnižší karty jako i.
procházíš zbylé karty
Inkrementuješ o 1 hodnotu i a zkontroluješ, zda i == hodnotě karty.
Pokud ne, postupka není.
POkud cyklus projde, máš postupku.

 
Nahoru Odpovědět
20.2.2015 12:13
Avatar
vodslon
Člen
Avatar
Odpovídá na David Bubenik
vodslon:20.2.2015 13:33

Ahoj, to je moc pěknej a řekl bych i hodně těžký ukol. Můžu se zeptat co děláš za školu ? :). Jinak první na čem je potřeba se zamyslet je, bude to jenom na lokála a nebo přes sít? Protože jeslti přes sít, tak doporučím nejdříve si postavit logiku hry ,střídání hráčů, sdílení třídy balíček karet, karty na stole atd. Pak máš balíček karet, udělal bych to jako něco list <color,int> ... Pak rozdat karty, ty co rozdáš by měli z balíčku zmizet, no a pak metody na hodnoty karet, hodně asi využiješ linq, kterým budeš dělat selecty z objectů..podporuje i order, třeba pro situaci, kdy hráč bere na vyšší kartu.. Když o tom takhle přemejšlím, musíš tam mít vždy i porovnání největší karty u postupky, páru atd. Hodně zajímavá funkce bude zkusit jeslti je to trojce karet nebo fullhouse :) , no řikám není to jednoduchý, teda pro mě by nebylo..

 
Nahoru Odpovědět
20.2.2015 13:33
Avatar
rawen
Člen
Avatar
Odpovídá na David Bubenik
rawen:20.2.2015 15:17

Mě to vyhodnocení nepřijde až tak těžký, přes linq dotaz se dá docela efektivně vyhledávat i co se týče kombinací. Vždy jde v podstatě o kombinaci 7mi karet, které si buď sdružíš podle hodnoty nebo barvy a pracuješ pak s celou skupinou. Mohlo by to vypadat například takto:

// karty podle hodnot do skupin
var dotazHodnoty = from p in pole
                 group p by p.Hodnota into pocty
                 select new { Nazev = pocty.Key, Pocet = pocty.Count(),  Skupina = pocty};

to stejné obdobně i pro barvy

// karty podle barev do skupin
var dotazBarvy = from p in pole
                 group p by p.Barva into pocty
                 select new { Nazev = pocty.Key, Pocet = pocty.Count(), Skupina = pocty };

Následně si můžeš zjistit počty jednotlivých hodnot, přičemž se dívám na zastoupení víc jak jedno

foreach(var d in dotazHodnoty)
{
    // zjištění dvojic, troji, čtveřic
    foreach(var p in d.Skupina)
    {
        if (d.Pocet > 1)
        {
            Console.WriteLine("máš číslo:" + p.Hodnota.ToString() + " " + d.Pocet.ToString() + "-krát");
            break;
        }
    }
}

obdobně i pro barvu přičemž hledám barvu zastoupenou víc jak 4x - jinak mě barva nezajímá

foreach (var d in dotazBarvy)
{
    // zjištění barvy
    foreach (var p in d.Skupina)
    {
        if (d.Pocet > 4)
        {
            Console.WriteLine("máš barvu: " + d.Nazev);
            break;
        }
    }
}

Co se týče fullhousu, tak je potřeba seřadit hodnoty a smazat duplicitní prvky, protože ty ve fullhous nehrajou roli. Třeba by to šlo takhle, (jinak by to šlo i přes .Distinct(), ale nejsem si ted jistaj jak to přesně je u dvourozměrné hodnoty)

pole = pole.OrderBy(o => o.Hodnota).ToList();

// odstranění duplicitních prvků
for (int i = 1; i < pole.Count; i++)
{
    if (pole[i - 1].Hodnota == pole[i].Hodnota)
    {
        pole.RemoveAt(i);
    }
}

Zjistit fullhouse by se dalo třeba takto, největší problém tam je v tom, že se může vybírat až ze 7mi karet, takže se nedá podívat na nejmenší hodnotu a hledat o jednu větší, protože nemusí být fullhouse od nejmenší hodnoty. Pro ro je potřeba projet vždy první 3karty, pokud ani jedna nedokáže udělat fullhouse, tak tam není

// zjištění fullhousu
for (int i = 0; i < 3; i++ )
{
    if(pole.Count() - i > 4)
        if (pole[i].Hodnota + 4 == pole[i + 4].Hodnota)
        {
            Console.WriteLine("máš fullhouse:" + pole[i].Hodnota + " až " + pole[i + 4].Hodnota);
        }
}

první kontrola if je zde pouze z důvodu, že je zde příliš duplicitních karet, takže třeba jen 4 druhy hodnot. Následně stačí porovnat danou hodnotu a zjistit jestli hodnota o 4 pozice dál je o 4 větší. Tohle se dá díky tomu, že zde nejsou žádné duplicitní prvky a hodnoty jsou seřazené. :)

Nahoru Odpovědět
20.2.2015 15:17
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
rt
Člen
Avatar
rt:28.2.2015 16:25

Ja bych doporucil pouzit knihovnicku. Viz treba http://www.codeproject.com/…and-Analysis - je to C# prepis poker.eval knihovnicky, ktera je velmi optimalizovana na rychlost (coz asi neocenis), ale hlavne se s ni strasne krasne pracuje a veci, ktere zminujes, jsou pomoci toho na jedno volani.

Pro inspiraci s dalsimi problemy muzes mrknout, jak se to resi v https://code.google.com/…ffin-muffin/ - je to multiplayer pokerovy server/client, ktery je pekne navrzeny a dobre naprogramovany. Takze veci ohledne prechodu stavu hry jsou tam moc krasne vyreseny a stoji za inspiraci.

 
Nahoru Odpovědět
28.2.2015 16:25
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.