Klasszikus algoritmusok mazes

- mint a Forbes, csak jobb.

Klasszikus algoritmusok mazes

előszó


Írásban cikkek me spodviglo szinte teljes hiánya az anyagok Orosz körülbelül algoritmusok generálására mazes. Ügyéről, az a tény, hogy általában van a témával kapcsolatban, akkor vegye figyelembe a két cikket: egy és kettő. Az érték és a haszon, amelyek közül csak kettő. Az első - a fordítás a formális algoritmus és egy kis magyarázatra. Ami persze jó, de nagyon rosszul, és nem okozott a vágy, hogy vizsgálja meg a téma további.

Adok egy tanácsot - ne nézd meg a kódot, amíg nem írjuk meg a megvalósítás. Kapsz sokkal több örömet és hasznot hibajavítások és hibaelhárítás, mint ha csak lefordítani egyik nyelvről a másikra.

Komolyan. Hallgassa meg a tanácsot. Valószínűleg több időt, de megéri megéri. Én például, a hibák miatt pár tűnt, nagyon vicces generátor „idegen” szövegek, amelyeket fel lehet használni a különböző sci-fi játék, hogy megteremtse a szöveget. Remélem megtanulják a témát maguk és nem siet.

Fogom használni a „offset”, ami arra utal, angol elfogultság. Ie hozzászokik az algoritmus minta minden irányban. Például jobb Shift - labirintusok algoritmus generál hosszú jobb oldali folyosókon.

Színező labirintusok előfordul viszonyítva a távolság a bal szélen a mező sarkában, hogy bizonyos sejtekben. Minél messzebb van a kiinduló helyzetbe - a sötétebb szín.

Tökéletes Maze - egy labirintus, amelyben az egyik cellában van kötve egy másik csak egy. Más szóval, a feszítőfa.

Amikor elkezdtem ásni a labirintus téma, fogalmam sem volt, hogy a végén majd írásban egy cikket, és úgy döntött, a nyelv, amelyen van egy lehetőség, hogy ne túl sok időt töltenek renderelés és az építészet és foglalkozni kizárólag logika. Ennek eredményeként, a C ++ és Lua, esett a választás Lua és Love2D.

Ne aggódj, ha nem ismerik a Lua. ismeri a nyelvet nem fáj, hogy megértsék a végrehajtás, mivel az egyszerűség a szintaxis. Ha legalább egy kicsit tudsz programozni, 80% -a kód nem okoz Önnek problémák megértését. A fennmaradó 20% - a nyelv sajátos, amiről mindig írni az első cikk, ami megmagyarázza a munkájukat.

Az első dolog, amit meg kell mondani:
Lua csak egy adatstruktúra - egy asztal - egy asszociatív tömb, amellyel létrehozzuk a szükséges vázat. Például, osztályok, készletek, hagyományos tömbök, vermek, sorok, és hasonlók. Lásd őket tudjuk sem a kisbetű-gombbal, vagy indexet használ.
Hasonlóképpen, nem korlátozzuk az asztal alatt csak egyféle adatot egy objektumot, és a munka, mint struktúrák C / C ++. Ez a kód teljesen korrekt:


Hozzárendelése nulla eltávolítani a pályáról:


második:
Lua nincs rejtett mechanizmus másolás táblázatokat. Az alábbi kód nem másolja, és hozzon létre egy új objektumot SomeNewArray, csak másolatok utalás a tárgy SomeArray, ezért meg fog változni, ugyanúgy, mint ha át az érték egy nem const referencia vagy pointer C / C ++:

Bináris fa algoritmus


Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Az első és legegyszerűbb algoritmus, hogy megértsék, hogy én úgy. Ennek lényege az, hogy előkészítsék az utat egy véletlenszerű irányba egyes cella területén: az én végrehajtás vagy felfelé, vagy jobbra (attól függően, hogy a kiválasztott eltolás Ön által). Mi folyamat csak 1 cella időegység, ezért tudunk generálni egy labirintus végtelen méretű, megtartva csak a végeredményt (a labirintus), nem kell tárolni bármilyen mellékhatás információkat.

Egy ilyen módszer generál két mellékhatások:

1. mazes erős átlós elfogultság hiánya holtpontok az ő irányába. Nézd meg a screenshotok a fenti, és látni fogja, hogy az egyes folyosók elkötelezett a jobb felső sarokban a sejt, és ennek eredményeként, egy egyedülálló módon rá, és sehol az úton nincs holtpont:

2. Két üres folyosó két oldalán a labirintusból. Ha az algoritmus „ásni”, amíg a végén a sor / oszlop, akkor nincs más választása, mint folytatni az utat csak egy irányba, ami egy üres „határ”.

By the way, a név nem csak ugyanaz, mint az adatok szerkezetét. Az eredmény az ő munkája - véletlen bináris fa, ahol minden egyes sejt (felső) pontosan egy ösvény felé a gyökér (szülő csomópont), ezért pontosan egy útvonal bármely más sejt. Ennek eredményeként minden cella legfeljebb 3 kapcsolatot a szomszédokkal.

Formai algoritmus (az észak-keleti elmozdulás):

  1. Válasszon egy kezdeti sejt;
  2. Válasszon egy véletlenszerű irányba megnyitva az utat. Ha a szomszédos cellák ezen a területen határán túl a területen, ásni egy cellát az egyetlen lehetséges irány;
  3. Ugrás a következő sejt;
  4. Ismételjük 2-3 addig, amíg az összes sejt feldolgozása megtörtént;

Green - jelenlegi tekinthető cella, piros - első sejtekben, amelyekbe áthelyezi.

Kezdve koordinátái (0, 0). Top ebben a sorozatban nem megy, mert különben jön ki a labirintusból a határ. Menj jobbra ütközésig, az úton vesz le a falakat.

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Minden holtpont. Hová menni. Célunk, hogy a következő sort, és látni, hogy most lehet menni az emeletre, és a jobb oldalon.

Klasszikus algoritmusok mazes

Mi dobjon egy pénzérmét, és válassza ... Top. Távolítsuk el a fal, és menj a következő cellába.

Klasszikus algoritmusok mazes

Kitűnő. Esetben azt mondja, hogy menj jobbra. Távolítsuk el a fal, és mozgassa a következő cellába.

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Nincs más választásunk, a bal nem megy, akkor távolítsa el a fal tetején, és menj a következő sorba.

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Coin meggyőz bennünket, hogy a jobb oldalon. Nos, figyelj. Távolítsuk el a fal, és menj sleuduyuschey sejt.

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Ride mérő, szerencsétlen fémdarabot esik, és azt mondja, hogy itt az ideje, hogy menjen fel az emeletre. A bontási a fal, a lépés, hogy a következő cella, és, mivel ez extrém ebben a sorban, távolítsa el a felső fal. Maze kész.

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes


Előnyök:
  • Egy egyszerű végrehajtását;
  • Nagy sebességű;
  • Az a képesség, hogy létrehoz egy végtelen labirintus;

hátránya:
  • Olcsó komplexitás minta;
  • Erős műszak átlósan;
  • A hiányzó holtpontjainak elmozdulás;
  • Monotónia generált mazes;

«Sidewinder» algoritmus


Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Algoritmus lefordíthatatlan neve Sidewinder munkája nagyon hasonlít az algoritmus egy bináris fa, ezzel szemben, hogy nem az a jellemzőjük, offset átlósan, az egyik üres folyosókon és sejtek, nem tartjuk külön-külön, készletek. Labyrinths kapott főleg függőleges vagy vízszintes eltolás (attól függően, hogy a végrehajtás), a hiánya holtpontok az irányba. Összehasonlítva a primitív ember, az offset nem annyira észrevehető, és több, mint egy „spirál”, amely fokozatosan váltja fel a függőleges és vízszintes folyosók.

Ami a mellékhatásokat, a Sidewinder létre egyetlen üres folyosó egyik oldalán kettő helyett. Létrehozása óta a készlet az első sorban a területen, akkor nem kell a lehetőséget, hogy ásni az utat a csúcsra, mint mi a legszélsőségesebb függőleges helyzetbe, és megpróbálja fölé menni vezet a kijárat a határokat. De ha szervezünk készletek elhagyása nélkül a függőleges, akkor hozzon létre néhány elszigetelt területek egymástól.

A 9. példa esetében az első sorban a sejtek osztható három, melyek között található a falak. Mindegyik készlet a második sor fog ásni egy utat, hogy az egyik a három „blokk” a fenti. A harmadik sor megnyitná az utat a „blokk” a második. És így tovább, amíg a végén a területen. Ennek eredményeként, mi pedig 3 ágú egymástól elszigetelve függőleges területen, amely nem alkalmas a tökéletes labirintus, amelyben az egyes pontok a mezőnek pontosan egy út a többi.

Formai algoritmus (szabványos offset):

  1. Válasszon ki egy kiindulási számot,
  2. Válassza ki a kiindulási sejtek, és ez a jelenlegi;
  3. Inicializáljon egy üres halmaz;
  4. Add az aktuális cella a készlet;
  5. Döntse el, hogy előkészítsék az utat a jobb oldalon;
  6. Ha betonozott, majd helyezze egy új sejt, és ez a jelenlegi. Ismételje meg a 3-6 lépéseket;
  7. Ha nem aszfaltozott, akkor válasszon egy véletlenszerű halmaza sejt és megnyitva az utat a csúcsra onnan. Mi megy a következő sort és ismételje 2-7;
  8. Folytassa, amíg minden sorban kerülnek feldolgozásra;

Red sejtek - tagok sokasága.
Kezdjük az első sorban, és látja, hogy a fejünk felett - a határokat. A bontás és a falak közvetlenül a második sorban, hozzon létre egy üres halmaz.

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Tehát, itt érdekes. Nézzük hozzá a sor az első két sorozat sejteket.

Klasszikus algoritmusok mazes

Válasszon egy ilyen sejtek, és távolítsa el az ezekhez kapcsolódó felső fal az első sorban.

Klasszikus algoritmusok mazes

Null set, add hozzá a következő cellába sor.

Klasszikus algoritmusok mazes

Ezúttal senki nem kombinálni, csak megnyitva az utat a jobb felső sarokban ez az egyetlen sejt.

Klasszikus algoritmusok mazes

Megismételjük tetteinkért. Null set, mozog a következő cellába, add meg ... És ő volt az utolsó a sorozatban, akkor csak vegye ki a fal tetején, és menj az alábbi telefonszámot.

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Most csak kombinálni az első három sejtek egy készletben.

Klasszikus algoritmusok mazes

Véletlenszerűen kiválasztunk egy sejt, ebben az esetben, a második fal és távolítsa el a felső az előző sor.

Klasszikus algoritmusok mazes

Nos, újra itt nincs más választásunk, távolítsa el a fal tetejére, és menj az alábbi telefonszámot.

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Ebben az időben, a legtöbb sejt Pervan teszünk egyetlen. Távolítsuk el a fal az előző sor, és lépni a következő cellába.

Klasszikus algoritmusok mazes

Klasszikus algoritmusok mazes

Tegyük fel akarta egyesíteni a három a végén sejtekben.

Klasszikus algoritmusok mazes

Ismét vonzott átlagosan több sejt, amelyből a falon, és távolítsa el a felső. Minden labirintus kész.

Klasszikus algoritmusok mazes

  • Az a képesség, hogy létrehoz egy végtelen labirintus;
  • Csak egy üres folyosón;
  • Egy sokkal összetettebb képet, szemben a bináris fa algoritmus;

hátránya:
  • A bonyolultabb végrehajtását;
  • A hiányzó holtpontjainak elmozdulás;
  • Erős függőleges elmozdulás;