Estou fazendo um ponto e clicando no jogo de aventura, e atualmente estou tentando descobrir a melhor maneira de implementar um sistema de comando.
Suponha uma interface no estilo Monkey Island ou Maniac Mansion, com uma paleta de verbos e objetos na cena e no inventário. Clicando sobre isso, você cria uma sentença para executar.
por exemplo, você pode clicar look at
e, em seguida, em uma árvore para "olhar para a árvore" ou clicar em uma maçã e give
, em seguida , em uma garota, para "dar de maçã para garota".
Existem três formas possíveis de uma frase:
verb
, por exemplo "salvar"verb noun
, por exemplo, "pegue a maçã", "olhe o polvo"verb noun noun
, por exemplo, "dê picles a cães raivosos", "use o pé de cabra com um jarro de picles"
Em diferentes situações, desejarei que a ação seja definida por diferentes objetos.
Por exemplo, para o give
verbo, pode haver uma ação padrão definida que faça o personagem dizer algo como "eu prefiro me apegar a isso", ou o cão raivoso pode definir uma ação em que ele come tudo o que você tenta dar .
Se a interface funcionar como o Maniac Mansion, você constrói a sentença e, em seguida, pede para executá-la (no Maniac Mansion, clicando na frase ou clicando novamente na última coisa em que você clicou).
Se funcionar como a Ilha dos Macacos, a sentença será executada assim que estiver concluída, o que representa um problema para verbos como os use
quais às vezes levam um substantivo e outras vezes dois.
Então, como você implementaria um sistema que lida com isso?
fonte
look
é um verbo single-substantivo, etc.Respostas:
Pode ser mais fácil usar se você reverter a ordem de seleção. Então o usuário clica em um substantivo e, em seguida, o jogo exibe o conjunto de verbos que podem ser executados nesse substantivo. Se o verbo exigir um objeto (ou seja, "dê a ___", o jogo esperará que o usuário selecione o objeto antes de executar a ação).
Algo como:
Em termos de implementação, cada objeto no jogo precisa ter dados para:
Como a gramática realmente não aninha nada, você não precisa de algo tão complicado quanto um padrão de intérprete.
fonte
Apresento solução simplista. Pode ser estendido, é claro.
Eu acho que uma lista simples de (verbo, objeto1, objeto2) resolveria isso:
Como lidar com os padrões:
Alguns exemplos:
Pode ser estendido:
fonte
Há dois problemas aqui: interpretar a entrada do player em uma árvore de sintaxe e depois executá-la.
Para o primeiro estágio, cada botão de verbo cria uma instância de verbo concreto derivada de alguma interface de verbo. Essa instância receberia outros substantivos ou verbos para validação. Se válido, anexaria o substantivo à sua árvore de sintaxe interna, caso contrário, seria rejeitado com um erro apropriado.
Após pressionar cada botão, você pode perguntar à árvore de verbos se ela estava em um estado válido para prosseguir (para a entrada no estilo Monkey Island).
Uma vez no segundo estágio, o verbo concreto seria responsável por analisar sua própria árvore e atualizar o estado do jogo.
Uma solução mais complexa envolveria a análise externa da árvore para o verbo. Cada elemento da árvore seria responsável por pequenas ações que, juntas, produzissem o resultado desejado. Essa abordagem permitiria fazer frases mais emergentes a partir de pequenos blocos de construção.
Confira o padrão Intérprete para obter mais informações sobre o estágio de análise.
fonte