.[ ČeskéHry.cz ].
Pathfinding systém u hry typu had
Jdi na stránku 1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Witiko



Založen: 05. 06. 2009
Příspěvky: 20

PříspěvekZaslal: 9. březen 2011, 00:26:38    Předmět: Pathfinding systém u hry typu had Odpovědět s citátem

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í. Smile 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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 9. březen 2011, 08:39:04    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Witiko



Založen: 05. 06. 2009
Příspěvky: 20

PříspěvekZaslal: 9. březen 2011, 11:54:12    Předmět: Odpovědět s citátem

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ě. Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 9. březen 2011, 12:58:45    Předmět: Odpovědět s citátem

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 Smile 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Witiko



Založen: 05. 06. 2009
Příspěvky: 20

PříspěvekZaslal: 9. březen 2011, 13:06:00    Předmět: Odpovědět s citátem

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 Smile 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. Smile 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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 9. březen 2011, 16:05:16    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 9. březen 2011, 16:22:45    Předmět: Odpovědět s citátem

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í Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Witiko



Založen: 05. 06. 2009
Příspěvky: 20

PříspěvekZaslal: 9. březen 2011, 16:38:56    Předmět: Odpovědět s citátem

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ý. Wink 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. Sad

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ý. Rolling Eyes
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 9. březen 2011, 17:00:10    Předmět: Odpovědět s citátem

Jinak metody po kterych patras se obecne oznacuji spis pathfinding nez trackfinding, to jen aby si treba na googlu nasel nejake relevantni odkazy Wink

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Witiko



Založen: 05. 06. 2009
Příspěvky: 20

PříspěvekZaslal: 9. březen 2011, 17:21:41    Předmět: Odpovědět s citátem

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 Wink

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. Smile

Děkuju za smysluplné návrhy. Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Witiko



Založen: 05. 06. 2009
Příspěvky: 20

PříspěvekZaslal: 11. březen 2011, 19:47:06    Předmět: Odpovědět s citátem

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. Smile 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. Very Happy
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 11. březen 2011, 20:19:48    Předmět: Odpovědět s citátem

Zvyk pri psani algoritmu je takovy, ze je algoritmus, pokud je to mozne, co nejvice obecny Wink. 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Witiko



Založen: 05. 06. 2009
Příspěvky: 20

PříspěvekZaslal: 11. březen 2011, 20:42:24    Předmět: Odpovědět s citátem

Weny Sky napsal:
Zvyk pri psani algoritmu je takovy, ze je algoritmus, pokud je to mozne, co nejvice obecny Wink. 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. Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 11. březen 2011, 20:52:34    Předmět: Odpovědět s citátem

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 Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
satik



Založen: 06. 05. 2010
Příspěvky: 161
Bydliště: Krkonose

PříspěvekZaslal: 12. březen 2011, 10:24:13    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna