Como posso implementar um sistema de comando para um jogo de aventura no estilo apontar e clicar?

11

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 ate, 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 giveverbo, 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 usequais às vezes levam um substantivo e outras vezes dois.

Então, como você implementaria um sistema que lida com isso?

SpoonMeiser
fonte
1
Parece haver três tipos de verbo, um tipo para substantivos zero, outro para dois, etc. Eles não são da mesma classe de objeto. Você não pode "olhar polvo com frasco de picles" assim looké um verbo single-substantivo, etc.
tenpn

Respostas:

10

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:

  1. O usuário clica em um cheeseburger.
  2. O jogo mostra um menu: "pegue, coma, olhe, dê para ___".
  3. O usuário seleciona "dar para ___".
  4. O jogo diz "dar a quem?" e aguarda o usuário clicar em outro substantivo (ou em um botão de cancelamento).
  5. Usuário clica em um macaco.
  6. Jogo dá o cheeseburger para o macaco.

Em termos de implementação, cada objeto no jogo precisa ter dados para:

  1. Qual conjunto de verbos você pode aplicar a ele.
  2. Para verbos, permite que pegue um objeto, que conjunto de objetos pode ser aplicado.
  3. Para cada par de verbo ou objeto de verbo, o comportamento a ser executado quando o usuário faz isso.

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.

maravilhoso
fonte
+1, tanto no lado da modelagem como no lado da interface. Sim, principalmente eu estou concordando, porque é assim que eu faria, mas eu gosto desta resposta.
drhayes 17/07/10
Se concordarmos, então claramente devemos ambos estar certos. ;)
munificent
Então, efetivamente, você acha que o comportamento a ser executado deve sempre ser definido pelo primeiro substantivo?
SpoonMeiser
1
Sim, acho que vários substantivos compartilharão o comportamento (de modo que "pegar" usaria o mesmo código para pegar objetos diferentes), mas faz sentido depender do substantivo para determinar o conjunto de verbos que podem ser aplicados para isso. Dado que o conjunto de substantivos é muito grande (tudo no jogo) e o conjunto de verbos pequeno (provavelmente um punhado de operações), acho que faz sentido para o usuário escolher um substantivo primeiro, pois isso reduz as combinações mais rapidamente. E, pragmaticamente, permite que o usuário clique em algo para iniciar uma interação, e não em alguma palavra.
munificent
Esse é o tipo de aceleração máxima que ele fez.
Jari Komppa
2

Apresento solução simplista. Pode ser estendido, é claro.

Eu acho que uma lista simples de (verbo, objeto1, objeto2) resolveria isso:

  • se o jogador clicou no objeto (verbo) "use" e clicou no objeto "balloon" e o jogador clicou no objeto "pump" e existe um trigêmeo ("use", "ballon", "pump"), então "Você usou ballon com pump"
  • Às vezes, o objeto2 seria NULL como em "use helium" (use, helium, NULL)
  • Exigir que o jogador clique primeiro no verbo do objeto
  • se o jogador clicar em algo que não corresponde a nada, diga "Não posso fazer isso, isso é um absurdo"
  • É claro que você deve verificar após cada clique se a sequência está correta.

Como lidar com os padrões:

  • Se o primeiro clique não estiver no objeto de verbo, procure a possível ação padrão.
  • Uma maneira de armazenar padrões seria criar quadrupleto (verbo, objeto1, objeto2, é o padrão)
  • Outra maneira de armazená-los seria ter uma lista de trigêmeos padrão
  • ...

Alguns exemplos:

  • (uso, balão, bomba)
  • (dá, John, batata)
  • (caminhar, piranhas, NULL)
  • (uso, inventário, bomba)
  • (aberto, porta ao telhado, NULL), padrão .... exemplo de ação padrão

Pode ser estendido:

  • adicione alguns eventos a serem disparados (dê algo ao jogador, o jogador dirá "Não posso fazer isso porque sou um pirata poderoso", comece a cena, mude algo no mundo ...)
  • adicione algumas pré-condições. Às vezes, o balão pode estar na gaiola, então você precisa expressar "se o balão não estiver na gaiola". Eu acho que posso abordar isso com cálculo de evento ou prólogo ou fazê-lo com ponteiro de função ...
  • Às vezes, a frase na linha de comando não seria "olhar no buraco", mas seria reescrita para "olhar no buraco", isso requer apenas uma variável :)
user712092
fonte
1

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.

tenpn
fonte
1
Não acho que interpretar a entrada dos jogadores seja um problema. Certamente, não há nada tão sofisticado quanto analisar a entrada de uma aventura de texto necessária aqui. Realmente, a questão se resume a como você projetaria sua hierarquia de objetos e interações para permitir flexibilidade máxima sobre qual objeto define a ação real a ser executada.
SpoonMeiser