Diskuze: C# TExax Holdem Poker

C# .NET .NET (C# a Visual Basic) C# TExax Holdem Poker American English version English version

Avatar
dave.bubenik
Člen
Avatar
dave.bubenik:

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
Avatar
hanpari
Redaktor
Avatar
Odpovídá na dave.bubenik
hanpari:

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 dave.bubenik
vodslon:

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
rwn
Člen
Avatar
Odpovídá na dave.bubenik
rwn:

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  +2 20.2.2015 15:17
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
rt
Člen
Avatar
rt:

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.