Diskuze: C# TExax Holdem Poker
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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..
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é.
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.
Zobrazeno 5 zpráv z 5.