Conceitualmente, como criar um mecanismo de regras / restrições (não gráficos / física) para um jogo

16

Eu quero fazer um jogo simples, semelhante aos livros de escolha seu próprio aventura. O jogador é apresentado com um texto narrativo e escolhe sua ação em uma lista de possibilidades. Isso, por sua vez, leva a um novo texto narrativo, ad infinitum. O único problema é que, dependendo de algumas decisões anteriores, a lista de possibilidades pode ser diferente.

À primeira vista, isso soa como uma carga de instruções if-else, implicando que um mecanismo de regras estaria em vigor. Mas, também me parece uma máquina de estados finitos.

Estou prestes a escrever isso em Java ou talvez Groovy. Atualmente, estou mais interessado nas questões conceituais, ou seja, como isso deve ser feito em um nível amplo (como as pessoas implementam jogos de xadrez ou de cartas, afinal?), Mas alguns conselhos sobre uma biblioteca específica também são bem-vindos.

Obviamente, o "mecanismo de jogo" do título não se refere à detecção de colisões ou outras mecânicas de física / gráficos, mas a lógica que decide quais opções um jogador deu à situação e ao seu estado atual.

kaqqao
fonte
1
Esta pergunta é mais adequada para gamedev ?
Uwe Plonus
2
@Uwe Plonus Considerou isso, mas não acredito. Minha pergunta é puramente conceitual e não tem nada a ver com bibliotecas gráficas, 3D e outros tópicos que dominam o gamedev. Venha para pensar sobre isso, esta questão tem pouco a ver com jogos em si ... mas não sei como melhor nomeá-lo.
kaqqao
Jogos de xadrez e cartas são muito diferentes das aventuras.
Deer Hunter
1
Sua pergunta parece abranger também o desenvolvimento de sistemas especializados. Onde a variedade de perguntas de acompanhamento e possíveis diagnósticos fica limitada a cada resposta selecionada. Talvez seja isso o que procurar para encontrar um pouco mais de "input"?
Marjan Venema

Respostas:

7

Com base no que você disse nos comentários, é assim que eu lidaria com isso:

Implemente a história como uma máquina de estados finitos, com um toque. Cada Estado é uma página da história e cada Transição é um link de uma página para outra. Mas cada transição também tem condições . As condições podem ser nulas; nesse caso, a transição sempre aparece como uma opção disponível; caso contrário, elas devem ser avaliadas quando a página for exibida e, se a avaliação retornar False, a transição não será exibida.

Existem duas maneiras básicas de implementar as condições. O primeiro é configurar um mecanismo de script completo dentro do jogo e, em seguida, a Condição parece return player.inventory.contains(GUN). Isso é inicialmente mais complicado de configurar, mas permite scripts mais avançados.

O segundo é codificar as possíveis condições em algum tipo de objeto. Pode ter um RequiredItemcampo e, se esse campo tiver um valor, você verifica se a condição foi atendida. Este sistema é mais simples de configurar. Isso limita o que você pode fazer muito mais do que o script faria, mas se você não precisar da flexibilidade que um mecanismo de script forneceria, provavelmente será muito mais fácil de usar.

Mason Wheeler
fonte
1
Na verdade, usamos algo assim em nosso aplicativo da web completamente não relacionado a jogos. O usuário possui vários estados e qualquer número de eventos pode ser acionado em código, muitos dos quais são predefinidos para fazer a transição de usuários de um estado para outro. Penso que, nos casos descritos da questão, ter algum tipo de linguagem de script rudimentar (ou uma linguagem completa como Python / Lua) para definir condições / gatilhos também seria útil.
Katana314
Eu gosto bastante dessa abordagem. Obrigado! Irá investigar mais. Alguma chance de você conhecer uma biblioteca útil?
22413 kaqqao
@veggen: Não, desculpe. Não é um desenvolvedor Java.
Mason Wheeler
@MasonWheeler: O que você acha de Lázaro ?
Robert Harvey
1
Como essa pergunta chegou à lista de perguntas populares hoje, relatarei que a implementei exatamente como havia dito no comentário anterior. Eu fiz um bom DSL e implementei a lógica do FSM por ser muito, muito simples. Não poderia estar mais satisfeito com a solução. @MasonWheeler Obrigado novamente por um ótimo conselho!
precisa saber é
5

Acho que a resposta está no título: você precisa de um mecanismo de regras. Se você está planejando escrever seu aplicativo com Java, é claro que pode escrever o seu, como sugeriu Gilbert Le Blanc, OU pode dar uma olhada no Drools , um mecanismo de regras.

que opções um jogador deu à situação e ao seu estado atual

Com Drools, ou qualquer outro mecanismo de regras, você pode definir uma situação parametrizada que produz uma lista de ações possíveis. Você pode codificar regras simples que suc tem:

  • o jogador está na páginaX:

    • escolha 1: título: "vá para a esquerda", ação: "página45"
    • escolha 2: título: "vá para a direita", ação: "página56"
    • SE o jogador tiver o Cajado das Bolas de Fogo ENTÃO escolha 3: título "lançar bola de fogo", ação: "página32"
    • Se o jogador tiver uma Habilidade de Percepção de 10 ENTÃO, a escolha 4: título "verificar os escritos na parede", ação: "página67"

O interessante de Drools é que você pode codificar todas as suas regras em um arquivo do Excel e, no início do jogo, fazer com que o Drools leia esse arquivo. Depois que tudo estiver na memória, você só precisa se preocupar com a interface do usuário.

Aqui estão alguns recursos para ajudá-lo a começar com o Drools:

Jalayn
fonte
Em geral - procure o algoritmo Rete implementado em qualquer mecanismo de regras do seu agrado.
Deer Hunter
Sim, Drools foi uma das coisas que eu comecei. Tenho que investigar um pouco mais para ver se consigo avaliar apenas um pacote de regras de cada vez, pois isso é bastante importante no meu caso. Obrigado!
kaqqao
@veggen prazer em ajudar!
Jalayn
2

Conceitualmente, seu jogo é direto. No psudeocode, seria algo parecido com isto:

while not at end of adventure story
    display text
    get response

Agora, encadear todo o texto para que ele flua de uma ação para a próxima é a parte mais difícil. Você poderia usar um banco de dados relacional. Você poderia usar uma árvore.

É um pouco difícil ser mais específico sem saber qual idioma do computador você deseja usar. Desde que você mencionou o Java, eu me inclinaria mais para uma estrutura de árvore.

Crie uma classe de resposta que contenha uma resposta e um link para uma classe de texto.

Crie uma classe de texto que contenha o texto de aventura e uma Lista de respostas como instâncias da classe de resposta.

Editado para responder ao comentário:

Você não calcula nada com base neste modelo. Usando seu exemplo, a árvore se pareceria com isso, onde T é o texto e A é uma opção de ação:

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

Sim, existe alguma duplicação de texto, mas, seguindo a cadeia, ações futuras podem levar em consideração decisões passadas. É uma enorme árvore de decisão.

Gilbert Le Blanc
fonte
Meu problema é calcular as possíveis respostas. Decisões passadas influenciam as opções atuais. Portanto, se um jogador que se deparar com "você tropeçar em um policial morto" escolher "roubar sua pistola" em vez de "não tocar em nada", mais tarde ele terá a opção de "atirar no perseguidor" além de "fugir como louco ", que teria sido a única opção se eles não tivessem adquirido uma arma anteriormente.
kaqqao
@ veggen: Veja a resposta atualizada.
Gilbert Le Blanc