Estou criando um jogo de ação 2D baseado em mapas com design de interação semelhante ao Diablo II. Em outras palavras, o jogador clica em torno de um mapa para movê-lo. Acabei de terminar o movimento do jogador e estou indo para o caminho.
No jogo, os inimigos devem cobrar o personagem do jogador. Existem também cinco tipos diferentes de terreno que oferecem bônus de movimento diferentes. Eu quero que a IA aproveite esses bônus de terreno enquanto eles tentam alcançar o jogador.
Disseram-me para verificar o algoritmo de pesquisa A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Estou fazendo este jogo em HTML5 e JavaScript e encontrei uma versão em JavaScript: http://www.briangrinstead.com/blog/astar-search-algorithm-in-javascript Estou tentando descobrir como ajustá-lo Apesar.
Abaixo estão minhas idéias sobre o que preciso mudar. Com o que mais eu preciso me preocupar?
- Ao criar um gráfico, precisarei inicializar a matriz 2D que passo adiante com uma travessia de um mapa que corresponde aos diferentes tipos de terreno.
- in graph.js: a definição "GraphNodeType" precisa ser modificada para lidar com os 5 tipos de terreno. Não haverá paredes.
- em astar.js: O g e h pontuação terá de ser modificado. Como devo fazer isso?
- em astar.js: isWall () provavelmente deve ser removido. Meu jogo não tem paredes.
- no astar.js: Não tenho certeza do que é isso. Eu acho que indica um nó que não é válido para ser processado. Quando isso aconteceria?
- Em um nível alto, como altero esse algoritmo de "oh, existe uma parede aí?" para "esse terreno me levará ao jogador mais rápido que o terreno ao meu redor?"
Por causa do tempo, também estou debatendo a reutilização do meu algoritmo de Bresenham para os inimigos. Infelizmente, os diferentes bônus de movimento do terreno não serão usados pela IA, o que fará com que o jogo seja péssimo. : / Eu realmente gostaria de ter isso para o protótipo, mas não sou desenvolvedor de profissão nem cientista da computação. : D
Se você souber de algum código que faça o que estou procurando, compartilhe!
Dicas de verificação de sanidade para isso também são apreciadas.
fonte
Respostas:
Você precisa prestar atenção a uma linha muito específica no algoritmo:
Esse é o custo desse nó específico. Você gostaria de modificá-lo para algo como
Isso fará com que o caminho evite terrenos caros e prefira terrenos baratos; é sua responsabilidade fazer com que 'currentNode.cost' retorne algo apropriado para o seu terreno. É que nem todo terreno tem um custo de 1 que você está prestando atenção ... alguns terrenos são mais baratos que outros. Há outras considerações, mas esse ponto específico no código deve ser o foco de sua atenção.
fonte
Esse é exatamente o tipo de coisa para a qual A * é. Tudo o que você precisa fazer é atribuir os vértices entre os custos dos nós com base nos tipos de terreno. (Parece que seus exemplos usam um gráfico em que todos os vértices têm um custo de 1.)
fonte
Esta implementação é um pouco específica para o ligar / desligar no momento. Como diz Myrddin Emrys, você precisará modificar a pontuação g com base no custo (em vez de apenas 1). Houve uma discussão sobre isso aqui: https://github.com/bgrins/javascript-astar/issues/3 .
Eu adoraria ter essa solução transportada de volta para a biblioteca principal, se você a trabalhar!
fonte