Autor Zpráva
albert111
Profil *
Dobrý den, níže položím rovnou otázku. Mám v plánu udělat turnajového pavouka ve stylu playoff. Uživatelé budou v kvízu soutěžit proti sobě a ten, kdo v daném kole vyhraje, tak postoupí dále. Naprogramovat si to celé zvládnu sám, problém mi ale dělá představa, jak zprovoznit pavouka, respektive žádám, zda je zde někdo, kdo něco podobného dělal nebo o tom něco ví, o menší vysvětlení a "navedení" správným směrem, jak vytvořit kolo po kole z uživatelů, kteří postoupili z kola přechozího. V základu mě napadá vytvořit počáteční kolo jako zápis řádku v databázi s uziv_1 a uziv_2 a sloupkem vysledek, kde by se bud nachazel "uziv_1" nebo "uziv_2", vzal bych veskere zaznamy a zkontroloval, zda vsechna prvni kola obsahuji vysledek a opět bych vždy po dvou vytvořil v dtaabázi řádek s kolem číslo 2 a dalšími dvěma hráči, co postoupili. Ovšem jak toto poté zapsat do pavouka? Rád ybch se vyhl tomu, že pavouk bude muset být "na míru", rád bych aby se toto dalo provádět nezávisle na 16 uživatelích, 32, 64 etc., ovšem nenapadá mě žádná optimální účinná taktika, jak co nejefektivněji na to. Děkuji
Keeehi
Profil
Dá se to udělat třeba takto: Každému hráči přiřadíš na začátku číslo (id v turnaji) od 1 do N. V prvním kole spolu hrají hráči kteří mají stejné ceil(id/2). V druhém kole spolu hrají hráči kteří vyhráli v prvním kole a zároveň mají stejné ceil(id/4). Obecně, v K-tém kole spolu hrají hráči kteří vyhráli v kole K - 1 a zaroveň mají stejné ceil(id/2*K). Kol celkem je log(2, N).
Pokud bys hráče čísloval od nuly, pak stačí funkci ceil vyměnit za floor.
Kajman
Profil
A pokud je problémem až html tabulka, tak mrkněte např. na
PHP Single Elimination Tournament Table
Kcko
Profil
Keeehi:
log(2, N)
spíše pow ne?
albert111
Profil *
Děkuji za vyčerpávající odpověď, pomalu si připravuju podklady se na to o víkendu vrhnout, ale zajímají mě ještě dvě věci a to
1) Jak vyřešit lichý počet uživatelů? První a nejlehčí možnost je vyhodit toho jednoho posledního, ale to nevím, jestli bude dobrý nápad.
2) K tomu pavouku, při hledání se na tento script na generování tabulky jako pavouka narazil, ale nepovedlo se mi rozchodit detekci, kdy se vykreslují již další kola, abych do ně mohl dosadit data z druhé zápasu atd.
tttttttt
Profil *
Kcko:
N je počet hráčů, log(2, 128) = 7 kol.

albert111
1) Problém není lichý počet uživatelů, ale počet uživatelů, který není mocninou 2. Jednoduché řešení je doplnit hráče fiktivními hráči do nejbližší vyšší mocniny, kteří v prvním kole vždy prohrajou.

2) Pokud bude mít turnaj 128 účastníků, bude dohromady 127 zápasů (64 v prvním kole, 32 ve druhém, …, 1 v posledním). Jednodušší je číslovat to sestupně, tak, že zápas č. 1 je finále, [2…3] semifinále, [4…7] čtvrtfinále, …, [log(K') … log(K'+1) - 1], kde K' je číslo kola počítané od finále (tj. K' = počet kol — K). Pak se z čísla zápasu dá dopočítat, ve kterém kole se hrál, zápas N se hrál v kole (počet kol) – floor(log(2, N)). Můžu tam mít nějaké ± 1 chyby, ale v principu to takhle půjde.
Keeehi
Profil
albert111:
Jak vyřešit lichý počet uživatelů? První a nejlehčí možnost je vyhodit toho jednoho posledního, ale to nevím, jestli bude dobrý nápad.
Pavouk má spoustu nedostatků. Například pokud budeš mít 17 hračů (obecně 2^x + 1), tak ten poslední jde přímo do finále. Nejjednodušší řešení je prostě zajistit aby počet hráčů byl přesně mocnina dvou. Ono by asi šlo udělat to tak, aby ty vynechané zápasy nevycházely stále na toho jednoho a toho samého hráče ale jak to provést algoritmicky pro jakýkoliv počet hráčů nevím. Další možností je opustit pavouka kde předem víš, s kým se kdy asi utkáš a udělat prostě že vítězové hrají s výtězi. Tedy na začátku hráče zamícháš, vytcoriš dvojice a ty budou hrát. Vítěze hodíš do jednoho pytle, zamícháš a vytvoříš nové dvojice. A takto to opakueš, dokud nebudeš mít vítěze. Pokud je ve skupině lichý počet hráčů, ten poslední automaticky postoupí. Jelikož se to ale náhodně míchá, tak každé kolo to může být někdo jiný. Pokročilá varianta je, že pokud je ve skupině míchy počet hráčů, tak nejdříve z ní vybereš takového hráče, který má reálně odehraných nejvíce kol a toho pošleš do dalšího kola. Tím se zajistí, že ten co kolo přeskakoval minule ho teď nepřekročí ani jen kvůli náhodě.
I tento systém má své nedostatky. Například to, že vyžaduje aby se nejdříve dohrálo celé kolo než se začne další. Tím ten deterministický přístup netrpí.

No a nebo ještě jinak. Turnajových schémat existuje velké množství. My tedy nevíme nic o tom co to pořádáš, ale zkus si o těch dalších něco přečíst a zamyslet se, zda by v tvém případě nebyl jiný systém lepší. Oproti pavouku mohou být například férovější.
Kajman
Profil
Při 17 hráčích bude mít v prvním kole 15 z nich volný postup. V druhém už bude 16 hráčů - tedy mocnina dvojky.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0