Conectar-se
Quem está conectado
23 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 23 Visitantes

Nenhum

Ver toda a lista


Compartilhe
Ver o tópico anteriorIr em baixoVer o tópico seguinte
Data de inscrição : 20/12/2010
Número de Mensagens : 109
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Problema de IA

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)
avatar
Data de inscrição : 18/01/2011
Número de Mensagens : 13
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Ver perfil do usuário

Re: Problema de IA

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...
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Problema de IA

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
avatar
Data de inscrição : 18/01/2011
Número de Mensagens : 13
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0
Ver perfil do usuário

Re: Problema de IA

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.
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Problema de IA

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.
Data de inscrição : 20/12/2010
Número de Mensagens : 109
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Problema de IA

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
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Problema de IA

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)
Data de inscrição : 20/12/2010
Número de Mensagens : 109
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Problema de IA

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
avatar
Ranking : Sem avaliações
Data de inscrição : 11/10/2009
Número de Mensagens : 2184
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Problema de IA

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.
Data de inscrição : 20/12/2010
Número de Mensagens : 109
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Problema de IA

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...
avatar
Ranking : Nota B
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Número de Mensagens : 2964
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 1
   : 0
   : 3
Ver perfil do usuário

Re: Problema de IA

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.
Data de inscrição : 20/12/2010
Número de Mensagens : 109
Insígnias de JAM :

Insignia 1x 0 Insignia 2x 0 Insignia 3x 0

Prêmios
   : 0
   : 0
   : 0
Ver perfil do usuário

Re: Problema de IA

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
Ver o tópico anteriorVoltar ao TopoVer o tópico seguinte
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum