Ostatnio bawię się, programując prostą tekstową grę przygodową i utknąłem w czymś, co wydaje się być bardzo prostym problemem projektowym.
Podsumowując: gra jest podzielona na Room
obiekty. Każdy Room
ma listę Entity
obiektów znajdujących się w tym pokoju. Każdy z nich Entity
ma stan zdarzenia, który jest prostą mapą łańcuchową> logiczną oraz listę akcji, która jest mapą łańcuchową> funkcyjną.
Dane wprowadzane przez użytkownika mają formę [action] [entity]
. Room
Używa nazwy jednostki, aby powrócić odpowiedni Entity
obiekt, który następnie używa nazwy działania, aby znaleźć właściwą funkcję i wykonuje go.
Aby wygenerować opis pokoju, każdy Room
obiekt wyświetla własny ciąg opisu, a następnie dołącza ciąg opisu każdego Entity
. Entity
Opis może się zmieniać w zależności od jego stanu ( „Drzwi są otwarte”, „drzwi są zamknięte”, „Drzwi są zamknięte”, etc).
Oto problem: dzięki tej metodzie liczba funkcji opisu i działania, które muszę zaimplementować, szybko wymyka się spod kontroli. Sam mój pokój startowy ma około 20 funkcji między 5 podmiotami.
Mogę łączyć wszystkie akcje w jedną funkcję i przełączać je między nimi, ale nadal są to dwie funkcje na jednostkę. Mogę również tworzyć określone Entity
podklasy dla wspólnych / ogólnych obiektów, takich jak drzwi i klucze, ale do tej pory mnie to prowadzi.
EDYCJA 1: Zgodnie z żądaniem, pseudokodowe przykłady tych funkcji akcji.
string outsideDungeonBushesSearch(currentRoom, thisEntity, player)
if thisEntity["is_searched"] then
return "There was nothing more in the bushes."
else
thisEntity["is_searched"] := true
currentRoom.setEntity("dungeonDoorKey")
return "You found a key in the bushes."
end if
string dungeonDoorKeyUse(currentRoom, thisEntity, player)
if getEntity("outsideDungeonDoor")["is_locked"] then
getEntity("outsideDungeonDoor")["is_locked"] := false
return "You unlocked the door."
else
return "The door is already unlocked."
end if
Funkcje opisu działają w ten sam sposób, sprawdzając stan i zwracając odpowiedni ciąg.
EDYCJA 2: Zmieniono brzmienie mojego pytania. Załóżmy, że może istnieć znaczna liczba obiektów w grze, które nie mają wspólnego zachowania (reakcje oparte na stanie na określone działania) z innymi obiektami. Czy istnieje sposób, w jaki mogę zdefiniować te unikalne zachowania w czystszy i łatwiejszy do utrzymania sposób niż pisanie niestandardowej funkcji dla każdej akcji specyficznej dla jednostki?