Zanim skoczymy prosto w implementację BSP może wypadało by zrobić małą rozgrzewkę?
Weźmy zatem ołówek i zakreślmy ramy architektoniczne.
Architektura
BSP jest algorytmem generowania poziomów – potrzebujemy więc fragmentu API przez który ów algorytm będzie dostępny dla klienta.
Zaszkicujmy nasze API dostępowe:
(def generators
{"empty" rl-engine.dungeon-generator.empty/generate-dungeon})
(defn list-generators
"Returns vector with names of all available dungeon generators."
[]
(keys generators))
(defn get-generator
"Returns generator with given name."
[name]
(get generators name))
Mamy tutaj dwie funkcje odpowiadające za:
Dostęp do listy nazw wszystkich algorytmów
Dostęp do wybranego algorytmu po nazwie
A dlaczego tak? Nie można by było udostępnić po prostu funkcji dla każdego algorytmu?
Ależ oczywiście, że można by było – kwestia w tym, że ich ilość będzie się zmieniać. Więc jeżeli wystawimy naszym klientom np. metodę per algorytm to będą oni bardzo niepocieszeni, jeżeli w kolejnej wersji biblioteki metoda to zmieni swoją nazwę bądź argumenty (szczególnie w dynamicznie typowanym języku).
Struktura danych
Ok, mamy pierwsze API – teraz zabierzemy się za strukturę danych.
Tutaj nie będziemy wymyślać nic nadzwyczajnego – poziom w rougelike’ach najnaturalniej zobrazować w dwuwymiarowej tablicy np:
Poziom w Adom
Dla uproszczenia w naszej wersji oznaczymy sobie:
Podłoga – 0
Ściana – 1
Czyli przykładowy poziom będzie wyglądał tak:
1 1 1 1 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1
Prosta implementacja
Jaki jest najprostszy algorytm generowania poziomów?
Pusty!
Dokładnie. Napiszmy więc algorytm generujący jeden pusty pokój.
Warto zauważyć, że pojawia nam się tutaj kolejny fragment architektoniczny – definiujemy interfejs między klientem a algorytmem.
Będziemy wymagać od klienta aby podał nam wymaganą wysokość i szerokość poziomu.
Ok, a teraz przejdźmy po kodzie.
Zacznijmy od końca:
(take height (range))
Generujemy tutaj listę liczb całkowitych o ilości heightza pomocą wbudowanej funkcji range.
Będzie to nasza lista wysokości.
[0, 1, 2, 3, 4]
Teraz dla każdego elementu w tej liście generujemy wiersz kolejnych liczb (get-row).
Będzie to nasza lista szerokości.
Be First to Comment