Останнім часом я розважаю себе програмуванням простої текстової пригодницької гри, і я застряг у тому, що здається дуже простим дизайнерським питанням.
Для короткого огляду: гра розбита на Room
об’єкти. У кожному Room
є список Entity
предметів, які знаходяться в цій кімнаті. Кожен Entity
має стан події, що представляє собою просту рядок-> булева карта та список дій, що представляє собою рядок-> функціональна карта.
Введення користувача приймає форму [action] [entity]
. Room
Використовує ім'я особи , щоб повернути відповідний Entity
об'єкт, який потім використовує ім'я дії , щоб знайти правильну функцію і виконує його.
Для створення опису кімнати кожен Room
об'єкт відображає власну рядок опису, а потім додає рядки опису кожного Entity
. Entity
Опис може змінюватися в залежності від його стану ( «Двері відчинені», «Двері закриті», «Двері замкнені», і т.д.).
Ось проблема: за допомогою цього методу кількість функцій опису та дій, які мені потрібно реалізувати, швидко виходить з рук. Моя початкова кімната має близько 20 функцій між 5 об'єктами.
Я можу об'єднати всі дії в одну функцію та if-else / переключитися через них, але це все-таки дві функції на одну сутність. Я також можу створити специфічні Entity
підкласи для загальних / загальних об'єктів, таких як двері та ключі, але це поки що отримує мене.
EDIT 1: За запитом, приклади псевдокоду цих функцій дій.
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
Функції опису діють майже однаково, перевіряючи стан та повертаючи відповідний рядок.
EDIT 2: Переглянуто формулювання мого питання. Припустимо, що може бути значна кількість ігрових об’єктів, які не поділяють загальну поведінку (відповіді на державу на конкретні дії) з іншими об'єктами. Чи є спосіб я визначити ці унікальні форми поведінки більш чітким, більш досяжним способом, ніж написання спеціальної функції для кожної конкретної дії?