Problema de IA

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Resolvido Problema de IA

Mensagem por elicray em Seg 24 Jan 2011, 18:29

Estou a tentar fazer um bomberman(um pouco diferente de um bomberman normal, mas não deixa de ser um bomberman), mas deparei-me com um problema: o inimigo...

Ele está "meio burro" pois acaba sempre por suicidar-se em menos de 20 segundos. Para tornar o inimigo mais desafiador, estou a tentar fazer com que ele se aperceba de quando está ao alcance de uma bomba e, quando isso acontece, ele foge. Infelizmente, não estou a conseguir por isso vim pedir aqui ajuda ;)

O meu problema actual, é mesmo não conseguir fazer com que ele identifique se está dentro do raio de fogo de alguem, e de onde vem...

Alguma dica?


Última edição por elicray em Dom 30 Jan 2011, 09:25, editado 1 vez(es)

elicray

Número de Mensagens : 109
Data de inscrição : 20/12/2010
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por mpirlo123 em Seg 24 Jan 2011, 19:10

você faz esse código assim:

if distance_to_object (bomba_obj) < 50 "raio de fogo da bomba"
{
//codigo do que ele deve fazer
}

distance_to_object(bomba_obj): Ele vai comparar a distancia do objeto que chamou esse script, com o objeto que vc pois no argumento 0.

> : sinal "maior" se a distancia for maior que...50 "raio de fogo"

50: distancia...

mpirlo123

Número de Mensagens : 13
Idade : 20
Data de inscrição : 18/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por Markituh em Seg 24 Jan 2011, 19:22

Hmm... Sim, a estrutura que o cara acima lhe passou é correta. Mas você devia armazenar o raio numa certa variável, pois quando se pega o item que aumenta a potência o raio da bomba aumenta obviamente. Mas cara, no Bomberman de NES os inimigos eram burros mesmos, eles só voltavam quando colidia com a bomba. Pois se voltasse toda vez que detectasse o raio, seria impossível pegar ele, entendes? É mais viável você colocar para ele ir na direção contrária quando colidir com o objeto da bomba:
Código:
direction=!direction

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por mpirlo123 em Seg 24 Jan 2011, 19:31

É verdade os inimigos eram burros mesmo,mas você poderia colocar para quando ele colidir com o raio da bomba ele ir na direção contrária, e então só daria para matá lo colocando uma bomba com grande alcance de fogo bem perto dele assim ñ daria tempo dele fugir.

mpirlo123

Número de Mensagens : 13
Idade : 20
Data de inscrição : 18/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por Markituh em Seg 24 Jan 2011, 19:35

Sim, sim, isso daria certo. Mas se o jogador encurralasse ele na parede ele iria ficar andando contra ela. Por que? Porque ela está desviando do alcance do raio. Portanto ainda acho que seria mais viável só virar ao colidir. Mas você que sabe cara, escolha a melhor forma que preferir.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por elicray em Seg 24 Jan 2011, 19:40

Quanto ao distance_to_object eu já tinha pensado nisso mas não retorna de onde vem o perigo, logo, não me serve...

Mas você devia armazenar o raio numa certa variável, pois quando se pega o item que aumenta a potência o raio da bomba aumenta obviamente.
Eu já tenho a var do alcance e o power up de aumentar o alcance, basicamente, já completei o raio

Mas cara, no Bomberman de NES os inimigos eram burros mesmos, eles só voltavam quando colidia com a bomba. Pois se voltasse toda vez que detectasse o raio, seria impossível pegar ele, entendes?
Quando eu modifiquei o codigo para ele so mudar de direcção quando batesse numa parede ou numa bomba ele durou aproximadamente 10 segundos... Soltou a bomba, foi contra a parede e, apesar da nova direcção ser aleatoria, como no inicio do jogo o espaço que se tem para movimento é pouco ele acaba sempre por morrer...

Eu queria apenas que ele não se suicida-se com tanta frequência, que se desviasse apenas das suas bombas

EDIT: Aqui está um bomberman bastante engraçado, os inimigos são desafiadores, dificeis de matar...
Bomb It

elicray

Número de Mensagens : 109
Data de inscrição : 20/12/2010
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por Markituh em Seg 24 Jan 2011, 19:45

O espaço que se tem para movimento é pouco? Só é você fazer um bom uso do choose... Repetir um mesmo valor para assim este vir com mais frequência.
Código:
choose(obj_nada,obj_nada,obj_nada,obj_parede,obj_parede)

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por elicray em Seg 24 Jan 2011, 19:48

Sim, eu estava planeando usar isso mais tarde (vi na engine de Bomberman que tem ca no forum e achei interessange) mas a taxa de suicidio continua a ser elevada

elicray

Número de Mensagens : 109
Data de inscrição : 20/12/2010
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por Markituh em Seg 24 Jan 2011, 19:54

Tenta usar collision_line, se der colisão com a bomba, ele volta.
Código:
if collision_line(x,y,x+raio,y,obj_bomba,100,true)
{
direction=!direction
}
Aí se a linha de colisão colidir com o obj_bomba desde a posição x + o valor do raio, ele irá voltar. Repita o processo para as demais direções:
Código:
if collision_line(x,y,x+raio,y,obj_bomba,100,true)
{
direction=!direction
}
if collision_line(x,y,x-raio,y,obj_bomba,100,true)
{
direction=!direction
}
if collision_line(x,y,x,y+raio,obj_bomba,100,true)
{
direction=!direction
}
if collision_line(x,y,x,y-raio,obj_bomba,100,true)
{
direction=!direction
}
A sintaxe da collision_line é a seguinte:
Código:
collision_line(x1,y1,x2,y2,objeto,precisão,notme)
x1 e y1 são os pontos iniciais; x2 e y2 os pontos finais. Objeto é o objeto que está a ser verificado a colisão, precisão a precisão da linha. notme é para não contar o próprio objeto; true se sim, false se não. Tente este esquema, se não der certo avise.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por elicray em Seg 24 Jan 2011, 19:57

É capaz de resultar, amanha dou os resultados, eu sou português e não tenho os mesmos horários, estou meio cansado hoje...

elicray

Número de Mensagens : 109
Data de inscrição : 20/12/2010
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por saim em Ter 25 Jan 2011, 15:41

Eu sugeriria diferente. Como existem vários jogadores e cada jogador tem uma bomba de raio diferente, sugiro uma collision_line com o tamanho da fase (room) e, no caso de colisão, checa pelo raio daquela bomba, especificamente. Dá pra colocar todos os 4 testes num "for", variando o ângulo.


Código:
linha=max(room_width,room_height)
//essas direções abaixo são pra ver se pode ir nelas.
direcao[0]=1 //0
direcao[1]=1 //90
direcao[2]=1 //180
direcao[3]=1 //270


Código:
var i, cont;
for (i=0;i<4;i+=1){
 direcao[i]=1
 na_reta=collision_line(x,y,x+lengthdir_x(linha,90*i),y+lengthdir_y(linha,90*i),obj_bomba)
 if na_reta //se tem alguma bomba no caminho
  if na_reta.raio_da_bomba>=point_distance(x,y,na_reta.x,na_reta.y) //se estou no raio da bomba
  direcao[i]=0 //não ir na direção da bomba
 if place_meeting(x,y,x+lengthdir_x(1,90*i),y+lengthdir_y(1,90*i),obj_parede)
  direcao[i]=0 //não ir na direção das paredes
 }
//agora cada direção tem 0 ou 1, variando se pode ir naquela direção ou não

cont=0 //verifica se alguma direção é possível
for (i=0;i<4;i+=1){
 cont+=direcao[i]}

//se cont=0, não tem pra onde ir, melhor aceitar a morte
if cont=0
 speed=0
 else //se cont não for 0, alguma direção tem que ser possível
 while (1){ //loop infinito até o break ser chamado
  dir=choose(0,1,2,3) //escolhe um valor aleatório
  if direcao[dir]=1{  //se a direção aleatória é permitida
  direction=direcao[dir] //vai na direção permitida
  break}
  }

Ainda assim, é possível have falhas, como:
- a collision_line pode encontrar uma bomba distante e o perigo estar numa bomba próxima, na mesma linha
- o suicídio talvez poderia ser evitado se fugir de uma bomba prestes a explodir, indo em direção a outra que acaba de ser disposta (o código não prevê tempos de explosão)
- no bomberman original, existe um upgrade que te permite jogar longe a bomba já disposta. O código não prevê essa opção.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por elicray em Qui 27 Jan 2011, 15:13

Desculpem a ausência, o meu pc encrava várias vezes e de vez em quando não consigo vir cá ao fórum, que foi o que se sucedeu nos últimos dias

@Markituh
Obrigado pela ajuda, acho que com o collision_line talvez consiga melhorar a IA do inimigo

@Saim
Gostei da ideia do collision_line do tamanho da room, vou ver se depois consigo dar um edit no code para resolver o problema que apontas-te:
a collision_line pode encontrar uma bomba distante e o perigo estar numa bomba próxima, na mesma linha

elicray

Número de Mensagens : 109
Data de inscrição : 20/12/2010
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: Problema de IA

Mensagem por Conteúdo patrocinado Hoje à(s) 21:47


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum