Ultimamente, tenho me divertido programando um jogo de aventura simples baseado em texto e estou preso ao que parece ser uma questão de design muito simples.
Para dar uma breve visão geral: o jogo é dividido em Room
objetos. Cada Room
um tem uma lista de Entity
objetos que estão naquela sala. Cada Entity
um possui um estado de evento, que é um mapa simples de string-> booleano e uma lista de ações, que é um mapa de string-> função.
A entrada do usuário assume o formulário [action] [entity]
. Ele Room
usa o nome da entidade para retornar o Entity
objeto apropriado , que usa o nome da ação para encontrar a função correta e a executa.
Para gerar a descrição da sala, cada Room
objeto exibe sua própria string de descrição e, em seguida, anexa as strings de descrição de cada Entity
. A Entity
descrição pode mudar com base no seu estado ("A porta está aberta", "A porta está fechada", "A porta está trancada", etc).
Aqui está o problema: usando esse método, o número de funções de descrição e ação que preciso implementar rapidamente fica fora de controle. Somente minha sala de partida possui cerca de 20 funções entre 5 entidades.
Posso combinar todas as ações em uma única função e alternar entre elas, mas ainda são duas funções por entidade. Também posso criar Entity
subclasses específicas para objetos comuns / genéricos, como portas e chaves, mas isso só me leva até agora.
EDIT 1: Conforme solicitado, exemplos de pseudo-código dessas funções de ação.
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
As funções de descrição agem da mesma maneira, verificando o estado e retornando a string apropriada.
EDIT 2: Revisou a redação da minha pergunta. Suponha que possa haver um número significativo de objetos no jogo que não compartilhem comportamento comum (respostas baseadas em estado a ações específicas) com outros objetos. Existe uma maneira de definir esses comportamentos exclusivos de maneira mais limpa e sustentável do que escrever uma função personalizada para cada ação específica da entidade?