Moduł Games::Maze
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaSpis treści
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.