Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Witiko

Založen: 05. 06. 2009 Příspěvky: 20
|
Zaslal: 9. březen 2011, 00:26:38 Předmět: Pathfinding systém u hry typu had |
|
|
Dělám remake klasického hada s několika vychytávkami a mám zde menší problém. Konkrétně je zde určitý typ jídla, který po určitém počtu tahů mizí. Počet tahů je vypočítaný podle počtu políček mezi hadem a jídlem. Často je ovšem mezi hadem a jídlem překážka ve formě hadova těla a proto jsem si uvědomil, že by byl vhodnější trackfinding systém.
Vezměme si následující příklad:
Bylo by asi dobré říci, že had umí procházet zdí, takže to samé se očekává i po trackfinding systému. První problém, který zdánlivě znemožňuje využití algorytmu typu šíření do šířky je tělo hada. Kontrola, jestli je v daném tahu již daný segment těla pryč by neměla být složitá a spočívá v přiřazení jednotlivým segmentům čísla, které bude reprezentovat životnost políčka. Nějak takto:
Daný algoritmus by tedy bylo možné použít, přičemž kontrola, je-li na daném políčku tělo by probíhala ve formě porovnání "aktuálního tahu" trackfinding systému a daného čísla životnosti. Je-li číslo určující tah vyšší, je již políčko volné. Nicméně je zde i druhý problém. Není možné nebrat v potaz políčka těla, která hlavu hada následují, jinak bychom s každým simulovaným tahem trackfindingu "ztratili" jeden segment těla, který se vytvoří tam, kde byla v minulém tahu hlava.
Abych řekl pravdu, věřím tomu, že bych to nějak uplácat dokázal, ačkoliv nároky scriptu by nejspíš nebyly ideální. Problém je v tom, že je celkem jasné, že bych znovu objevoval kolo. Neví někdo, jak přesně na to? Metoda by měla logicky dojít k následujícímu výsledku:

Naposledy upravil Witiko dne 10. březen 2011, 14:30:59, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
Mem

Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 9. březen 2011, 08:39:04 Předmět: |
|
|
Vzhledem k tomu, že ten had se bude hýbat, mi přijde jako nejjednodušší řešení (ale rozhodně ne optimální) odsimulovat pohyb na tahy formou stromu. Jsou sice až 3 možnosti pohybu v jednom tahu, ale i pokud se ti nepovede odsekávat některé větve, tak to je na 10 tahů necelých 60 tisíc listů, a to se imho dá v pohodě projít... A naprogramovat je to triviální a máš jistotu, že najdeš správné řešení |
|
Návrat nahoru |
|
 |
Witiko

Založen: 05. 06. 2009 Příspěvky: 20
|
Zaslal: 9. březen 2011, 11:54:12 Předmět: |
|
|
Mem napsal: |
Vzhledem k tomu, že ten had se bude hýbat, mi přijde jako nejjednodušší řešení (ale rozhodně ne optimální) odsimulovat pohyb na tahy formou stromu. Jsou sice až 3 možnosti pohybu v jednom tahu, ale i pokud se ti nepovede odsekávat některé větve, tak to je na 10 tahů necelých 60 tisíc listů, a to se imho dá v pohodě projít... A naprogramovat je to triviální a máš jistotu, že najdeš správné řešení |
Problém je v tom, že ve skutečnosti může mít herní plocha i např. 50x50 políček a víc (nejspíš bych na to nasadil horní limit) a počet tahů na dostání se k jídlu by tak byl maximálně 48 tahů, ale to pouze v případě, že had není dočasně uvězněný vlastním tělem. I v případě "pouze" 48mi tahů se díváme na ~7.98 * 10^22 záznamů v poli. Tolik záznamů v poli mi ani jazyk, ve kterém pracuji, nedovoluje udělat, takže ano, to bohužel zní poměrně neoptimálně.  |
|
Návrat nahoru |
|
 |
Mem

Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 9. březen 2011, 12:58:45 Předmět: |
|
|
Witiko napsal: |
Problém je v tom, že ve skutečnosti může mít herní plocha i např. 50x50 políček a víc |
Aha, já vycházel čistě z obrázku Pokud se ale spokojíš se suboptimálním výsledkem (nemusí to být hned nejkratší cesta), určitě by šla udělat heuristika, která by ten strom značně prořezala (v levelu budou jen objekty jako had, které umíš obcházet, a pak jednotlivé čtverečky?). A výsledná cesta se pak může zkusit ještě finálně zjednodušit |
|
Návrat nahoru |
|
 |
Witiko

Založen: 05. 06. 2009 Příspěvky: 20
|
Zaslal: 9. březen 2011, 13:06:00 Předmět: |
|
|
Mem napsal: |
Witiko napsal: |
Problém je v tom, že ve skutečnosti může mít herní plocha i např. 50x50 políček a víc |
Aha, já vycházel čistě z obrázku Pokud se ale spokojíš se suboptimálním výsledkem (nemusí to být hned nejkratší cesta), určitě by šla udělat heuristika, která by ten strom značně prořezala (v levelu budou jen objekty jako had, které umíš obcházet, a pak jednotlivé čtverečky?). A výsledná cesta se pak může zkusit ještě finálně zjednodušit |
Ano, políčko může aktuálně nabývat těchto hodnot - hlava, tělo, 3 typy jídla nebo nic. První dva typy jsou definované jako kolizní. Na herním poli mohou být najednou 2 jídla zároveň a ve vyhledávání cesty by se mělo počítat s tím, že had může na jídlo narazit a o pole se "prodloužit".
Se suboptimálním výsledkem se spokojím, alespoň bude mít hráč určitou míru tolerance, aby se k jídlu dostal. Důležitá je hlavně rychlost. V ideálním případě jsem počítal, že k nalezení cesty by došlo v rámci ~100ms. |
|
Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 9. březen 2011, 16:05:16 Předmět: |
|
|
Rekl bych, ze se na problem divas ze spatneho uhlu. Co tak generovat jidlo do patricne vzdalenosti? Tedy prohledavani do sirky a v urcite vzdalenosti vybrat uzly a nahodne z nich vybrat jeden.
Jinak puvodni problem by sel vyresit klidne A*, kdy by si kazdy uzel uchovaval informaci o sve hloubce. Startovni by mel hloubku 0. Tri nove vznikle hloubku 1, z tech by vychazely uzly s hlubkou 2 ... Pak by si hada chapal jako prekazku v pripade, ze telo hada ma cislo vetsi nez je hloubka aktualniho uzlu, v pripade, ze by byl ocislovan od ocasu smerem k hlave. |
|
Návrat nahoru |
|
 |
Mem

Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 9. březen 2011, 16:22:45 Předmět: |
|
|
Ten první wenyho nápad zní dobře
U toho druhého si nejsem jistý, jestli je schopen podchytit i případ, kdy stejným políčkem může had projet v různou dobu (na základě předchozích tahů), nebo nedejbože vícekrát.. a případně, jestli to něčemu vadí  |
|
Návrat nahoru |
|
 |
Witiko

Založen: 05. 06. 2009 Příspěvky: 20
|
Zaslal: 9. březen 2011, 16:38:56 Předmět: |
|
|
Weny Sky napsal: |
Rekl bych, ze se na problem divas ze spatneho uhlu. Co tak generovat jidlo do patricne vzdalenosti? Tedy prohledavani do sirky a v urcite vzdalenosti vybrat uzly a nahodne z nich vybrat jeden.
Jinak puvodni problem by sel vyresit klidne A*, kdy by si kazdy uzel uchovaval informaci o sve hloubce. Startovni by mel hloubku 0. Tri nove vznikle hloubku 1, z tech by vychazely uzly s hlubkou 2 ... Pak by si hada chapal jako prekazku v pripade, ze telo hada ma cislo vetsi nez je hloubka aktualniho uzlu, v pripade, ze by byl ocislovan od ocasu smerem k hlave. |
To první není špatný nápad. Alespoň pro generování jídla to je nápad znamenitý. Nicméně stejně jsem chtěl do hry přidat AI, takže trackfinding musím implementovat stejně.
Co se týče navrhovaného řešení č. 2, jde prakticky o to samé, co již navrhuji v prvním příspěvku. Jeden již zmiňovaný problém s tímto přístupem je ten, že tělo hada se za hadem táhne, tzn. problém s tímto trackfinding systémem by nastal v případě, kdy by had musel podruhé projít, jak poukazuje Mem, přes to samé políčko. Toto samo o sobě by nejspíš nebyl problém a každý uzel by mohl uchovávat kromě hloubky i číslo reprezentující tah, kdy bude opět průchozí.
Skutečný problém je ale v algorytmu vlny samotném. Tento algorytmus nepočítá s tím, že by bylo třeba z nějakého důvodu procházet to samé políčko podruhé a kdyby k tomu došlo, dojde k přepsání staré hodnoty pole a následně po nalezení finálního uzlu a zpětném vyhledání cesty opakovaným posunem na okolní nejmenší číslo by byla v daném dvakrát prošlém uzlu slepá ulička.
Nejspíš by bylo možné uchovávat veškeré průchody políčkem ve vícerozměrném poli, nicméně si říkám, nesnažím-li se silou použít algoritmus na situaci, pro kterou nebyl určený.  |
|
Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 9. březen 2011, 17:00:10 Předmět: |
|
|
Jinak metody po kterych patras se obecne oznacuji spis pathfinding nez trackfinding, to jen aby si treba na googlu nasel nejake relevantni odkazy
No a ted k veci. Kdyz se vam nelibi navrh s A*, ktery je IMHO pro prostredi bez jinych prekazek dostacujici, tak mam jeste jeden navrh:
- cislovat policka jako delka hada + hlubka prohledavani
- pruchod je mozny kdyz je vyraz "aktualni hodnota uzlu - delka hada" vetsi nez policko na ktere chce vstoupit
- na prohledavani pouzit iterativni prohledavani do hloubky |
|
Návrat nahoru |
|
 |
Witiko

Založen: 05. 06. 2009 Příspěvky: 20
|
Zaslal: 9. březen 2011, 17:21:41 Předmět: |
|
|
Weny Sky napsal: |
Jinak metody po kterych patras se obecne oznacuji spis pathfinding nez trackfinding, to jen aby si treba na googlu nasel nejake relevantni odkazy
No a ted k veci. Kdyz se vam nelibi navrh s A*, ktery je IMHO pro prostredi bez jinych prekazek dostacujici, tak mam jeste jeden navrh:
- cislovat policka jako delka hada + hlubka prohledavani
- pruchod je mozny kdyz je vyraz "aktualni hodnota uzlu - delka hada" vetsi nez policko na ktere chce vstoupit
- na prohledavani pouzit iterativni prohledavani do hloubky |
Ano, to dává smysl. Osobně nevím, jestli bude had potřebovat jít přes nějaké pole vícekrát, žádný příklad mě nyní nepadá, ale ani mě nenapadá nic, co by tomu bránilo. Teoreticky by teda dost možná fungoval i ten první návrh.
Děkuju za smysluplné návrhy.  |
|
Návrat nahoru |
|
 |
Witiko

Založen: 05. 06. 2009 Příspěvky: 20
|
Zaslal: 11. březen 2011, 19:47:06 Předmět: |
|
|
Mám ještě jeden dotaz k tématu a sice výpočet maximální možné hloubky vyhledávání podle algoritmu hvězdičky (v našem případě pluska) na 2D poli s danými rozměry. Osobně bych si myslel, že maximální možná hloubka je například na herním poli 8 x 8 takováto:
38 při neprůchozích stěnách
18 při průchozích stěnách
Pro výpočet pro libovolné rozměry herního pole používám následující kód (schematizováno):
Při neprůchozích stěnách
kód: |
šířka = šířkaPole - 1,
výška = výškaPole - 1,
součet = výška * 2 + šířka + (šířka & 1);
while((šířka -= 2) > 1 && (výška -= 2) > 1) {
součet += šířka + výška;
}
navrátit součet; |
Při průchozích stěnách
kód: |
šířka = šířkaPole - 1,
výška = výškaPole - 1,
součet = 1 + (šířka & 1);
while((šířka -= 2) > 1 && (výška -= 2) > 1) {
součet += šířka + výška;
}
navrátit součet; |
Nicméně jsem si to skutečně vymyslel, je dost možné (hlavně v případě průchozích stěn) že lze sestavit složitější bludiště a tím tak navýšit maximální hloubku vyhledávání. Místo přiřazování konstantě nějakou z prstu vycucanou hodnotu bych ji radši vypočítal, je to takový dobrý zvyk při psaní algoritmu.  |
|
Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 11. březen 2011, 20:19:48 Předmět: |
|
|
Zvyk pri psani algoritmu je takovy, ze je algoritmus, pokud je to mozne, co nejvice obecny . Proto mi zavadeni nejakych konstant hloubky neprijde zrovna jako stastne reseni. Ani si nejak nedokazu predstavit, kde v algoritmu A* jde neco takoveho pouzit, aby se jednalo o efektivni implementaci. |
|
Návrat nahoru |
|
 |
Witiko

Založen: 05. 06. 2009 Příspěvky: 20
|
Zaslal: 11. březen 2011, 20:42:24 Předmět: |
|
|
Weny Sky napsal: |
Zvyk pri psani algoritmu je takovy, ze je algoritmus, pokud je to mozne, co nejvice obecny . Proto mi zavadeni nejakych konstant hloubky neprijde zrovna jako stastne reseni. Ani si nejak nedokazu predstavit, kde v algoritmu A* jde neco takoveho pouzit, aby se jednalo o efektivni implementaci. |
Není naopak obecnost algoritmu problém? Při nezavedení určitých heuristik a úprav algorytmu pro specifické potřeby může člověk dostat mnohem horší časy výkonu algoritmu.  |
|
Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 11. březen 2011, 20:52:34 Předmět: |
|
|
Jenze ty zadnou specifickou potrebu nemas, ty dostanes horsi cas a vysledky prave tehdy, pokud se budes snazit vymyslet nejaka vylepseni. Neber to nejak spatne, je to proste muj nazor.
Ten algoritmus je pro tve potreby dostatecne optimalizovany a vhodny. Stejne tak proflaknuta heuristika F = G + H.
Zamer se na jeho spravnou implementaci a az te bude brzdit, tak se zacni zabyvat nejakou silenou optimalizaci  |
|
Návrat nahoru |
|
 |
satik
Založen: 06. 05. 2010 Příspěvky: 161 Bydliště: Krkonose
|
Zaslal: 12. březen 2011, 10:24:13 Předmět: |
|
|
jen mala oprava, pri pruchozich stenach se da na uvedenem obrazku najit i kratsi cesta, o dve policka:
a da se urcite najit i bludiste, kde nejkratsi cesta bude delsi, napr. v bludisti, kde se da prochazet stenami takto:
(EDIT: v tomhle pripade by se dala vymyslet i jeste delsi cesta)
(v bludisti s nepruchozimi stenami pak analogicky) |
|
Návrat nahoru |
|
 |
|