Então, estou começando a aprender Java e um pouco de OpenGL enquanto estiver usando o LWJGL. Para começar fácil, estou escrevendo um clone do Atari Pong. Eu configurei corretamente a tela do jogo, a detecção de colisões e todo o jogo está funcionando, na verdade, se fosse um jogo para 2 jogadores, eu já estaria pronto agora, mas como estou planejando fazer isso, um jogo para um jogador , Eu tenho que criar uma IA simples para controlar o segundo jogador.
Saber onde a bola vai bater parece bastante trivial, e criar uma IA que sempre bate na bola parece uma coisa fácil de fazer, mas eu quero que o jogo possa ser vencido, então nem sempre posso fazer com que o IA bata no bola.
Então, aqui está minha pergunta: como devo codificar isso para adicionar imperfeições humanas à IA. Devo decidir aleatoriamente se a IA falhará em um determinado momento? Ou há uma coisa mais inteligente (ou talvez óbvia) que estou perdendo aqui?
Muito obrigado.
Respostas:
Minha IA de pong imperfeita favorita é brutalmente simples, mas permite fazer uma falha de IA bastante agradável.
Invisible Ball AI
Configuração da IA : Quando a bola reflete sua raquete, você sabe onde está e com que rapidez está indo. Gera uma bola invisível nesse ponto, mas a uma velocidade maior. Ele terminará para onde a bola visível está indo. Cada quadro faz com que a IA se mova em direção ao local da bola invisível. Pare a bola invisível quando ela atingir o lado da IA, por isso é onde a AI deve mover sua raquete.
Resultados : a IA parece que está tentando prever o caminho da bola. Digamos que o jogador tenha refletido a bola em um ângulo íngreme para que ela ricocheteie na parede. A IA rastreará a bola um pouco e, sendo mais lenta que a bola, deixará de rastreá-la com rapidez suficiente. Você enganou a IA e ela parece bastante lógica do ponto de vista humano. Você pode ver o computador tentando prever para onde a bola vai e então - ah, errou, estava muito lento e você ganhou um ponto.
Isso é significativamente melhor do que inserir aleatoriedade, pois faz com que a IA pareça relativamente inteligente. Um oponente digno. Ele também permite que a IA seja executada exatamente pelas mesmas regras que o humano, o que parece melhor para o jogador e facilita seu trabalho.
Configurações : Você também pode ajustar a velocidade da bola invisível, pois isso determinará a distância que a IA planejará. Quanto mais rápida a bola invisível, mais tempo a raquete terá que se mover para bloquear e melhor o jogador terá que mirar.
fonte
Os jogos de Pong que eu joguei parecem se comportar da seguinte maneira: a raquete controlada pela IA sabe onde a bola vai bater, mas é limitada na rapidez com que pode alcançar essa posição. Então, às vezes, erra. Eu acho que essa é a maneira mais óbvia de fazer isso.
fonte
Quando criei um clone quase pacman, tão incrível, na minha TI83? calculadora, o maior problema que encontrei foi que os "fantasmas" eram muito rápidos. Eu tive que desacelerá-los de alguma forma. Então, eu coloquei um grande e velho pecado (cos (tan (coordenada x))) lá. Níveis mais fáceis executariam esse cálculo algumas vezes, e níveis mais difíceis executariam apenas uma das operações.
O ponto é, TEMPO DE REAÇÃO. Pesquise o que é um tempo de reação humano típico e adicione 10ms a ele. Use isso como ponto de partida. À medida que os níveis ficam mais difíceis, remova o tempo do tempo de reação ... o que pode ser simples
Thread.sleep(time);
para a IA. Aguarde esse período de tempo antes que o AI comece a se mover.Você também pode controlar a rapidez com que a raquete se move ou, se você realmente quiser se complicar, determinar onde a bola será baseada em diferentes graus de informação ... diga apenas 2 pixels em vez de um vetor. Adicione modificadores de ângulo às paredes para adicionar um grau de aleatoriedade, forçando a IA a recalcular.
fonte
sin(cos(tan(x)))
?Se você simplesmente desacelerar a raquete, sempre que acertar a bola em um ângulo agudo (por exemplo, movendo-se para cima e para baixo muito em vez de ir direto para o outro lado), o computador quase sempre errará porque a bola está se movendo para cima / para baixo mais rápido que o remo pode compensar.
Em vez disso, o que eu faria é brincar com a velocidade da raquete e o ponto em que a IA reage. Por exemplo:
Outra coisa a mudar é como a IA reage. Você destacou uma estratégia em que a raquete sempre se move para a posição em que a bola estará. Uma pessoa nem sempre pode fazer isso. É mais provável que eles sigam a bola para cima e para baixo, sem saber onde exatamente a bola estará quando chegar a ela devido a todos os rebotes.
Assim, um método mais humano de reação é sempre se mover em direção à bola. Por exemplo, se a bola estiver subindo, a raquete se moverá para cima. Se a raquete for rápida o suficiente, poderá reagir às quedas da parte superior e inferior. Se a raquete não for rápida o suficiente, ela compensará demais movendo-se para cima quando a bola subir, mas quando ela pular, a raquete pode não ser capaz de descer rápido o suficiente.
Por fim, você também pode jogar com o tamanho da raquete para aumentar / diminuir a dificuldade.
fonte
Um fator a considerar é a aleatoriedade - jogadores humanos sempre têm algum grau de variação em suas jogadas; portanto, se você deseja que sua IA pareça humana, também deverá ter alguma variação em suas jogadas.
Você pode configurar intervalos para:
Então, a cada golpe do oponente, a IA pode escolher um valor dentro desses intervalos e tomar suas decisões (e movimentos) com base nisso. Para oponentes mais fáceis da IA, você pode fazer com que esses intervalos sejam bastante ruins, mas também possui amplos intervalos para dar à AI alguns "tiros de sorte". Para oponentes mais difíceis, você pode aumentar esses intervalos e colocá-los todos no intervalo "bom".
fonte
Vou sugerir uma solução mais geral que não é específica apenas para o pong. Acredito que isso possa ser aplicado a qualquer jogo - não apenas ao pong. Você quer um comportamento humano, certo? Para que um humano possa sentir que está interpretando um humano ... e, portanto, por extensão, espero vencer. Então, o que você faz?
Observe um humano! Como um jogador pode perder no pong? Bem, se assistirmos dois jogadores de pong, é bastante óbvio. Geralmente, a perda ocorre porque a bola é muito rápida e o tempo de reação dos jogadores foi atrasado. São dois parâmetros, um dos quais é ajustável. O outro é a capacidade dos jogadores de pressionar a direção certa. Então você tem uma frequência de erro e uma freqüência de reação - ambas podem ser ajustadas dependendo da dificuldade.
Uma IA fácil teria maior atraso de entrada e mais tendência a cometer erros aleatórios - onde, como uma IA mais difícil, seria ajustada para que esses parâmetros fossem ajustados.
Isso pode ser aplicado a praticamente qualquer jogo - mesmo um jogo da velha ou modelos ainda mais complexos. Essa abordagem é dividida em cenários mais complicados, mas é suficiente quando jogos em que o número de parâmetros e escopo são limitados.
fonte
Aqui está uma lista de algumas opções, algumas das quais já foram abordadas:
fonte
Eu fiz um pequeno clone Pong (em LUA).
Minha IA é muito simples, mas não é tão ruim assim.
Eu apenas verifico a posição y da bola e, se abaixar, movo a raquete para baixo, se mais alto, movo a raquete para cima.
Então, para afinar a dificuldade, aumento ou diminuo a distância da bola a partir da qual o remo do computador começa a se mover.
fonte