Moduł Games::Maze

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Co to jest ?

Games::Maze jest modułem służącym do generowania labiryntów w formacie ascii. Oto przykładowy labirynt i jego rozwiązanie :

:--:--:--:--: :--:--:--:--:--: :--:--:--:--: :--:--:--:--:--: | | | | | | * * | | : : :--: :--:--:--:--: : : : : :--: :--:--:--:--: : : | | | | | | | | | | | *| | | | | : :--: : : : : : :--: : : :--: : : : : : :--: : | | | | | | | | | | * * *| | | | : :--:--:--:--: :--:--: : : : :--:--:--:--: :--:--: : : | | | | | | | | | | | *| | | : : : : : : : :--:--:--: : : : : : : : :--:--:--: | | | | | | | | | * * * | :--:--:--:--: : :--: :--: : :--:--:--:--: : :--: :--: : | | | | | | | | *| | : : : :--: :--: : :--:--: : : : :--: :--: : :--:--: | | | | | | | | | | | | | * * *| : : :--: :--:--: :--:--: : : : :--: :--:--: :--:--: : | | | | | | | | | | | * *| : : : :--:--:--:--: : :--: : : : :--:--:--:--: : :--: | | | | | | | | | | | | *| | : :--:--: : :--:--: : : : : :--:--: : :--:--: : : : | | | | | | | | | * | :--:--:--:--:--:--:--:--: :--: :--:--:--:--:--:--:--:--: :--:

Moduł pozwala generować labirynty złożone z dwóch rodzajów pól : kwadratów i sześciokątów. Pozwala również określić ich wielkość, miejsce na wejście, wyjście itp. W końcu pozwala znaleźć dla utworzonego labiryntu rozwiązanie. Ciekawostką jest możliwość generowania labiryntów trójwymiarowych. Otrzymujemy wtedy szereg poziomów labiryntu, z zaznaczonymi przejściami "w górę" i "w dół".

Konstruktor

Labirynty tworzymy np. w ten sposób :

$labirynt = Games::Maze->new(dimensions => [12,7,2], cell => 'Hex');

W tym przypadku utworzyliśmy trójwymiarowy labirynt o wymiarach 12x7x2, który ma pola w kształcie sześciokątów. Oto parametry, z jakimi można wywołać konstruktor :

form
Określa kształt labiryntu. Możliwe wartości to 'Rectangle' (Prostokąt) i 'Hexagon' (Sześciokąt - dotyczy tylko labiryntów, które mają pola w kształcie sześciokąta).
cell
Określa kształt pola. Możliwe wartości to 'Hex' (Sześciokąt) i 'Quad' (Kwadrat).
dimensions
Rozmiary labiryntu - [szerokość, wysokość, głębokość].
entry
Miejsce w którym znajdzie się wejście do labiryntu.
exit
Miejsce wyjścia.
upcolumn_even
Określa, dla form='Rectangle' i cell='Hex', które kolumny mają być umieszczone wyżej, a które niżej. Możliwe wartości to liczba parzysta lub nieparzysta.
start
Miejsce rozpoczęcia dla algorytmu generowania labiryntu. Domyślnie jest losowe.
fn_choosedir
Referencja do funkcji, która jest używana podczas tworzenia labiryntu do wyboru jednego z kierunków. Parametrami są dwie tablice : lista możliwych kierunków i aktualna pozycja. Funkcja zwraca wybrany kierunek. Poniższy kod zawsze zwróci pierwszy z możliwych kierunków. sub first_dir { return ${$_[0]}[0]; }

Metody

make
Tworzy labirynt o parametrach podanych w konstruktorze.
solve
Znajduje drogę od wejścia do wyjścia.
unsolve
Wymazuje drogę znalezioną przez "solve".
reset
Czyści wszystkie pola labiryntu - metoda nie powinna być wywoływana przez użytkownika, jest ona przeznaczona do użytku przez inne metody.
describe
Zwraca hasz wypełniony parametrami labiryntu.
internals
Zwraca hasz wypełniony wewnętrznymi (ukrytymi) parametrami labiryntu.
to_ascii
Jedyna metoda pozwalająca obejrzeć labirynt - wywołana w kontekście skalara, zwraca rysunki kolejnych poziomów labiryntu, złożone z literek. Wywołana w kontekście listy, rozdziela kolejne poziomy labiryntu na jej elementy.
to_hex_dump
Zwraca labirynt jako listę liczb w systemie szesnastkowym. Wywołana w kontekście listy zachowa się analogicznie do metody opisanej powyżej.

Przykłady

Oto kilka przykładów labiryntów wygenerowanych za pomocą modułu.

dimensions => [10,3,1], cell => 'Hex'
__ __ __ __ / \__/ \__/ \__/ \__/ \__ \ \__ __/ __ \__ \ / \__ \ / __/ \ / / \__ \ / \ / / __/ \ / __/ \ / \ / \ / __/ \__ \ __/ \__ \__ \ \__/ \__/ \__/ \__/ \__/
dimensions => [5,5,3], cell => 'Quad'
:--:--:--:--: : |f | f |f | : :--: : : : | | | |f | :--: : :--:--: |f | | | | : : : : : : | | | | | : : :--:--: : | | f |f | :--:--:--:--:--: :--:--:--:--:--: |c | |c |b | : : : : :--: |f | | |f c | :--:--: :--:--: |b |f |f |f | :--:--:--:--: : |f f |f | :--:--:--:--:--: |f c |c f | :--:--:--:--:--: :--:--:--:--:--: | c | :--: : :--:--: |c | |c | :--:--: :--: : |c |c | c |c | : : :--:--:--: |c | | c |c | :--: : :--:--: |c | c | : :--:--:--:--:
dimensions => [20,20,1], cell => 'Quad'
:--:--:--:--:--:--:--:--:--:--:--:--:--:--:--:--:--: :--:--: | | | | | | * | | : :--: : :--: :--: : :--:--:--:--: :--:--: : : : : | | | | | | | | *| | :--: :--:--:--:--: :--:--:--:--: : :--:--: : : :--:--: | | | | | | | * * *| :--:--: : :--:--:--:--:--: : : :--:--: :--:--:--:--: : | | | | | | *| : :--:--:--: :--:--: :--:--:--:--:--: :--:--:--:--: : : | | | | | | | *| :--: :--: : : :--: : :--:--:--: :--:--:--:--:--: : : | | | | | | | | | *| : :--: : : :--:--: : :--: : :--:--: : :--: :--: : | | | | | | | | | | | * *| : : :--:--:--: : : :--: :--:--: :--: : : :--: :--: | | | | | | | | | | | | | * *| : : :--: : :--: :--: : : :--:--: : : : :--:--: : | | | | | | | | | | | | * * *| : :--: : :--: :--: : : :--:--: : :--:--: : :--:--: | | | | | | | | | * * *| :--: :--:--: :--: :--:--: : :--:--:--:--:--: :--:--: : | | | | | | * * * * *| | * * *| : :--: : :--: :--:--: :--:--: : :--:--: : : :--:--: | | | | | | * * *| | | *| | * * *| :--: :--:--: : : :--:--: : :--: : : : :--:--:--: : | | | | | * * *| | | | | * * * *| *| : :--: : : :--:--: :--:--: :--:--: : :--:--:--: : : | | | | | | | * * *| | | | | * *| : : : : : :--: : :--: :--: : :--:--: : : :--:--: | | | | | * *| | * *| | | | | : : : :--:--: : :--: : : : :--:--:--:--:--: : : : | | | *| *| | | *| | | | :--:--:--:--: : : :--:--:--: :--:--:--:--:--:--:--:--: : | * * * * * *| * * * * *| | | | : :--: :--:--:--:--:--:--:--: : :--: : :--:--:--: : : | * *| | | | | | | | | | :--: : : :--: :--:--: :--:--: :--: :--: :--:--:--: : | * *| | | | | | | | | | | : :--:--: : :--: : :--: : :--: : :--:--:--:--: : : | * * * | | | | | :--:--: :--:--:--:--:--:--:--:--:--:--:--:--:--:--:--:--:--:
dimensions => [10,10,1], cell => 'Quad', form => 'Hexagon'
__ __/ \__ __/ __ \__ __/ __ \__/ \__ / \__ \ / \ \__ __/ / __/ / \ / \__ __/ __/ \ / \__/ __/ __ \__ __/ \__ \ / __ \__/ \__/ __/ \__ __/ \ / \__/ \ / __ __/ / \__ __/ \ / \__/ \__ \__ \__/ \__/ __/ \__ \__ / \ \__ __ \ / \ / / / \__ \ \ \ / \__/ \__ \__/ / \ / \__/ \ / __/ \ / / \ / __ \ / \__/ \ / \ / __/ __/ __/ \ \ / \ / \ / \ __/ __/ \__ \__ __/ __/ / \ / \ / \__/ \__/ \__/ \__ \ / \ / \ / \ \ / \ / \ / \ / __ \__ \ / \ \ \ / / __/ \ / \ \ / __ __ \ / \ / \ / \ \ / __/ \__ \__/ \ / \__/ \ / \ / \ / \ / / \__/ \ / \__/ __/ \__ \ / \__/ \ / \__/ \ \__ / / / \ / __/ __/ \ / \__ \ / / \__/ \__/ __/ \ / __/ \ / __ \ / __/ \ \__ \__ \__/ \ / \__/ \ __/ __/ \__ \ / / __/ \ / / __/ / \__/ \ / / \__ \ \ / \__ \ / \__/ __/ \__/ __ \ / / \__/ / __ \__ \__ __/ \__ \ / \__/ \__/ \ \ \__/ __/ \__/ \__ \__ \ / / __/ __/ \ / / \__ \__ \ / \__ __/ \__/ \__ \__ \__/ \ \ \__ \ / __ \__/ __/ \__ \__/ __/ \ / / \__ \ / __/ \__ \__ \ __/ __/ \ \ \__ \ / \__ \ __/ \ / \__/ \ \ \__/ \ / \__ \ / \__/ __/ \ / / \ / \__/ \__ \ / \__ \ / __/ __/ \__/ __/ \__ \__ \ / \__ \__/ \__ \__/ \__ \ / __/ __/ __ __/ \__ \__/ \__ \__ \__/ \__ \ \__ __/ \__ \ / __/ \__/ __/ \__/

A to kod generujący ostatni z przykładowych labiryntów, przy okazji rozwiązując go :

use Games::Maze; $labirynt = Games::Maze->new(dimensions => [10,10,1], cell => 'Hex', form => 'Hexagon'); $labirynt->make(); print $labirynt->to_ascii(); $labirynt->solve(); print $labirynt->to_ascii();

Dodatkowe informacje

Dokumentacja modułu znajduje się na stronie http://search.cpan.org/~jgamble/Games-Maze-1.03/lib/Games/Maze.pm

Autor opracowania

S.P.

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.