Algoritmus na generování "náhodné mapy"

Ahoj.

Rozhodl jsem se po napsání svého příspěvku na téma "Jak jsem se dostal ke hraní stolních her" o revizi svých do šuplíku uložených her a zamyslel se nad jejich "poplatnosti době". Ano, prostě i principy her se s časem mohou posunovat a s tím, jak člověk získává zkušenosti s hraním jiných her může takové ohlédnutí za vlastními výtvory leckdy vyznít úsměvně. A první, co jsem se rozhodl "změnit", byla přeměna statického herního plánu na mojí hru Gangy na dynamický, který si hráči seskládají sami těsně před hrou.

Pohlédl jsem na starý herní plán a zamyslel se ve světle nových skutečností a výsledkem je zadání, jehož vyřešením získám generátor "náhodných" herních plánů. Chci to naprogramovat v nějakém programovacím jazyce, já skromně dělám ve Visual Basicu, ale chápu, že to je jen prostředek a nikoli podmínka. Ale napadlo mne, že je tu třeba někdo, kdo to napíše rychleji než já tento příspěvek a že mi tím třeba ("rád") pomůže. A pokud ne, tak tím třeba rozpoutám zajímavou diskuzi o tom, jak nám počítače pomáhají při tvorbě vlastních her, pokud pomineme jejich neoddiskutovatelnou úlohu při zpracování grafiky pro hru. Takže vzhůru k zadání.

Ačkoli tuším, že řešením tohoto zadání je rekurze, někoho srostlého s programováním třeba napadne jiný postup. Takže:

Mám šachovnicovou síť o hraně 12 políček dle tohoto nákresu

www.sextagon.cz/odloziste/hry/gangzzz/zakladni_matice.jpg

a na každém políčku může být právě jeden typ budovy, resp. právě jedna budova jednoho typu. Mám celkem 4 typy budov, tzn. 36 budov o každého ze 4 typů (12 × 12 = 144 / 4 = 36), které chci na šachovnici "libovolně" naskládat tak, aby byly splněny dvě podmínky:

1) V každé čtveřici políček dle tohoto nákresu (ohraničeno oranžově)

www.sextagon.cz/odloziste/hry/gangzzz/zakladni_matice_ctverice1.jpg

se musí vyskytovat všechny 4 typy budov, resp. v každé takovéto čtveřici se může nacházet právě jedna!!! Protože jsou 4 políčka a 4 druhy budov, tak je to logické a platné z obou stran pohledu. Toto je samozřejmě primitivní, protože na první pohled se zdá, že můžu prostě libovolně namíchat ty 4 druhy budov do libovolné čtveřice. Bohužel se do celého problému ještě přidává druhá podmínka.

2) Zároveň v každé čtveřici políček dle tohoto nákresu (ohraničeno zeleně)

www.sextagon.cz/odloziste/hry/gangzzz/zakladni_matice_ctverice2.jpg

se musí také vyskytovat všechny 4 typy budov, resp. v každé takovéto čtveřici se může nacházet právě jedna!!!

Je to takové dvouvrstvé sudoku :-)

Jedno z možných řešení je např. tady ( 4 druhy budov jsou znázorněny 4mi různými barvami - žlutou, modrou, růžovou a šedou):

www.sextagon.cz/odloziste/hry/gangzzz/zakladni_matice_vyhovuje.jpg


www.sextagon.cz/odloziste/hry/gangzzz/zakladni_matice_vyhovuje1.jpg


www.sextagon.cz/odloziste/hry/gangzzz/zakladni_matice_vyhovuje2.jpg

Tak prosím, zda je tu někdo, kdo tu rekurzi nebo jinou techniku dokáže napsat? Děkuji uctivě.
21.11.2010 19:38:05

reseni
jako inspiraci bych zkusil prave sudoku algoritmicke reseni. Po vlozeni nekolika nahodnych barev by se dopocital zbytek. Nebo naplnit obvod, to lzecelkem snadno a dopocitat vnitrek. Dopocitavat by sedalo prochazenim stavoveho prostoru, nejspise do hloubky a defacto zkouseni vsech moznosti.

21.11.2010 20:22:57

Falco
Procházet celý stavový prostor by asi bylo poměrně náročné (navíc při stejném počátečním rozložení bys dostal vždy stejné výsledky - což by se jistě dalo ovlivnit nějakou lehce randomized funkcí) - stavový prostor je samozřejmé dobrý nápad, jenom by to chtělo doplnit třeba nějakou jednoduchou heuristiku a ohodnocování uzlů.

No když na d tím tak přemýšlím, tak by ten stavový prostor nebyl zas tak veliký (a se současnou výpočetní kapacitou...). Když jsem psal pro ségru nějaký štěpení molekul, tak tam možných stavů bylo mnohem víc... ale je fakt že jsem prohledával do šířky, aspoň myslím teda, už je to dávno.

21.11.2010 20:42:14

Stavový prostor
No, to co nazýváte stavovým prostorem, jestli chápu dobře, zase tak moc velký není. Každé políčko totiž patří současně maximálně DO DVOU čtveřic, čili každé políčko je třeba porovnat pouze se šesti dalšími políčky! Výjimku samozřejmě tvoří rohová políčka a krajová políčka, ta patří jen do jedné čtveřice.

Čili já bych si na prvním rohovém políčku vygeneroval náhodnou posloupnost těch 4 druhů budov (aby při každém generování byla možnost jiného vygenerovaného celku díky jinému startovacímu druhu budovy - tento princip zajistí náhodnost i u dalších políček). Porovnal bych zvolenou budovu s ostatními třemi sousedícími políčky. Ta podmínka projde, protože je to první prvek v celku a ostatní jsou prázdná (zatím). Pak bych tu samou funkci rekurentně vyvolal pro vedlejší políčko, čili bych opět vygeneroval náhodné pořadí 4 druhů budov. Pokud by při porovnání zbylých tří políček nedošlo ke konfliktu, opět bych se posunul o další políčko vpravo a tak stále dokola. Pokud by na druhém políčku došlo ke shodě/konfliktu, tzn. vlatně by se jako první na tomto políčku vygenerovala stejná budova jako na políčku vlevo (víc jich tam zatím není), vzala by se druhá budova v pořadí vygenerovaném pro druhé políčko... A tak dále a tak dále. Pokud dojde ke konfliktu při všech čtyřech budovách na daném políčku, znamená to, že taková kombinace nikdy nepovede k cíli a je třeba se vrátit o políčko zpět a přestože jeho předchozí test uspěl, i tak je třeba na něm změnit druh budovy. Ale to právě elegantně řeší rekurze, protože si pamatuje poslední "stavy" před zanořením do nižší úrovně a pokud tedy při vynoření z nižší úrovně je indikován neúspěch, mechanismy rekurze samy zabezpečí, že v nadřazené úrovni dojde ke změně budovy, ačkoli předtím testem prošla!

No, tak teď si to snad už jen namaluju jako vývojový diagram a hurá do toho :-) Věřím tomu, že množina všech možných vyhovujících řešení je konečná a že je poměrně malá. Neumím to matematicky dokázat, ale něco mi říká, že jsou to permutace bez opakování, tudíž to bude hodně malá podmnožina všech kombinací.

21.11.2010 22:34:08 | Upraveno autorem (porovnej)

...
mno jinak bych nezamnenoval postup s algoritmem, rekurze je pristup, vse co jde napsat normalne jde i rekurzi a naopak. Nicmene to reseni vypada rozumne. Kdyz si nastudujes stavovy prostor, urcite reseni uloh, algoritmus A*, prorezavani tak mozna najdes lepsi optimalizaci.
Nicmene kdyby se problem zdal narocny na vymysleni exaktniho postupu tak by se dal skusit geneticky algoritmus ale nehodi se uplne na tento typ ulohy.
Zkus ten postup co jsi popsal a ono by to nemelo byt tak dlouhe. Nejaka kvadratocka slozitost.

21.11.2010 23:48:55

Acer1968
Je fakt, že už jsem dlouho z tohodle mimo, nicméně to co ty popisuješ není podle mého názoru rekurze, ale právě prohledávání stavového prostoru do hloubky (respektive některé části), protože když se dostaneš do slepé větve, vracíš se o úroveň výš a zkoušíš, jestli další větev nebude vhodnější. Což mě napadá, jestli náhodou samo prohledávání stavového prostoru není vlastně rekurzivní (fakt už je to mrtě dlouho, co jsem tohle dělal naposledy), potom bysme v podstatě každý jinými slovy mluvili o tom samém.

22.11.2010 08:03:01

Morthe
Ve skutecnosti do hloubky muzes prohledavat primo rekurzi kdy se ti promenne ukladaji na Stack nebo si vytvoris vlastni stack a mas nerekurzivni algoritmus. A ano, mluvite o tom samem :), v zasade. Ale prislo mi ze Acer to psal jako ze to nejspise pochopil stejne.

22.11.2010 13:25:27

Stavový prostor
No, už jsem ze školy hodně dlouhý čas, takže něco jako pojem "Stavový prostor" a techniky jeho prohledávání mi opravdu už z hlavy vypadly. Každopádně Wikipedie nemlčí a tak jsem si osvěžil znovu něco, co třeba budu potřebovat. Díky všem za nakopnutí správným směrem. Teď už to nějak dám do kupy.

22.11.2010 15:44:40

...
To je klasika, neco se naucis, vyzkousis zapomenes. Ale pak kdyz si vzpomenes ze neco takoveho kdysi fungovalo tak se snadno dohleda a zase si vzpomenes :). Jinak se pak pochlub jak to dopadlo :).

22.11.2010 21:01:45

Vybíráme z Bazaru

Panství hrůzy
Panství hrůzy
Akt. cena: 1900 Kč
Končí za: 10 dnů

Nejnovější otázky

další >>

Velké herní akce

Kalendář všech akcí >>

Offcanvas