AI pong imperfeito

19

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.

Setzer22
fonte
5
Bem, geralmente você faz o morcego AI só se movem uma certa velocidade por isso, se a bola é bem colocada pelo jogador do AI não pode alcançá-lo ..
4
Eu começaria limitando a velocidade na qual a IA pode mover a raquete e / ou construindo em um tempo de atraso aleatório (curto) antes que a AI comece a responder a um acerto.
11
possível duplicata de O que faz um oponente de computador se sentir vivo?
MichaelHouse
4
@ byte56 Eu realmente não chamaria isso de burro dessa pergunta. Parece o exemplo dado aqui blog.stackoverflow.com/2011/01/… em "Se você deseja fechar a pergunta de um usuário como uma duplicata, ela deve ser uma duplicata real". Essa pergunta é um bom recurso (e alguém provavelmente poderia usá-la para obter uma resposta, considerando o conteúdo lá), mas, na verdade, não responde às especificidades dessa pergunta.
Tétrada
11
@Tetrad Acho que as respostas acabam sendo muito parecidas, mas, você está certo, as perguntas são diferentes. Eu acho que essa pergunta é uma versão mais específica da questão vinculada. Se o OP tivesse visto o outro primeiro, não tenho certeza se essa pergunta teria sido feita. Quando votei, fiquei indeciso, por isso votei novamente na pergunta e nas respostas e votei como duplicado. Poderia ser de qualquer maneira para mim.
Michaelhouse

Respostas:

20

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.

DDR
fonte
Todas as respostas fornecidas forneceram informações realmente boas, mas como precisei marcar uma para ser a resposta certa, escolhi essa como realmente gosto da sua abordagem. Isto, combinado com algumas outras coisas disse em outras respostas (como brincar com o tempo de reação) pode ter realmente um human-like AI, e com uma dificuldade ajustável fácil
Setzer22
Isso funcionou perfeitamente para minha configuração porque tenho ângulos, velocidade e aceleração variáveis ​​com base em certos movimentos especiais, de modo que a bola pode estar em todo o lado. A IA estava sendo adquirida, mas agora está muito melhor. Eu posso ver por que esse método não é o melhor para velocidade bloqueada e ângulos de 45 graus, mas esse não é o meu jogo.
31416 jackrugile
11
Enquanto eu gosto dessa abordagem, tive problemas com minha implementação. O problema é que, como a bola traçadora se move mais rápido que a bola que representa, ela pode perder algumas colisões que acontecerão com a bola que representa. Razão, é claro, que a bola marcador moverá uma distância maior entre as armações.
Wolfgang Schreurs
Se você deseja maior fidelidade, poderá recalcular a posição da bola marcador duas vezes por quadro e reduzir pela metade a velocidade de cada cálculo.
DDR
22

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
Este. Não ajuda a IA a saber onde a bola atingirá se ela puder se mover, digamos, 3px por quadro e precisar mover de cima para baixo.
21813 KeithS
14

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.

Russell Uhl
fonte
2
Você poderia explicar por que exatamente usou sin(cos(tan(x)))?
Nulo13 jun13
5
porque eu era jovem, estúpido, e em uma TI83, sin (cos (tan (x))) criou uma boa unidade de atraso na IA. Também porque, até onde eu sei, a calculadora não possui um comando de espera que possa usar milissegundos. Talvez um pouco de clareza: eu não usei o assembly ou o micro script ou qualquer outro idioma que você possa compilar para executar nessas coisas. Eu usei o código de programação no firmware (o botão prgm). Eu tinha no máximo 8 linhas de código na tela a qualquer momento. Não conseguia me lembrar de nada mais complicado por um tempo de atraso.
Russell Uhl
2
Aprendi a programar no código do firmware da TI83. Então tive que aprender novamente a programação estruturada em C ++. Eu diria que a TI83 me ensinou o que é um código de cadeia de espaguete e por que é ruim. Eu não usei uma declaração goto desde então. Bons tempos embora.
ContextSwitch
2
oh bom senhor, os gotos. Eu revisito o código de vez em quando ... e desisto rapidamente. Eu não tenho idéia de como eu consegui programar essa coisa durante um período de semanas durante minhas aulas de matemática.
Russell Uhl 13/06
11
Não há necessidade de ficar na defensiva com relação ao seu atraso de trigonometria. A matemática de ponto flutuante em um loop era uma maneira comum de fazer uma pausa em programas escritos há várias décadas e o desempenho / capacidade das calculadoras estão alinhados com um computador da era dos anos 80.
22613 Dan Neely
6

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:

  • quando o usuário bate na bola
    • a IA pode reagir imediatamente e ir para onde a bola estará. Se for rápido o suficiente, chegará lá a tempo
  • quando a bola cruza o meio do campo
    • a IA deve esperar até cruzar o meio do campo antes de reagir

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.

Trenin
fonte
2

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:

  • Tempo de reação (a rapidez com que a IA começa a se mover)
  • Velocidade (a rapidez com que a IA move a raquete)
  • Precisão (quão perto a IA chegará de onde realmente quer mover sua raquete, dando a chance de ultrapassar ou ultrapassar onde eles querem estar)

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".

Blobinator
fonte
2

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.

Vaughan Hilts
fonte
1

Aqui está uma lista de algumas opções, algumas das quais já foram abordadas:

  • Faça com que jogadores de computador mais inteligentes apontem a bola para que seja mais difícil para o jogador alcançar com muitos rebotes e faça o oposto para adversários fáceis.
  • Um jogador inteligente moverá a raquete para o meio enquanto a bola estiver a caminho do adversário e eles não sabem para onde ela voltará.
  • Antes do salto final, é mais difícil para um ser humano prever onde a bola terminará. Faça com que a IA tenha uma imprecisão semelhante.
  • Limite a velocidade da raquete para que fique mais lenta que a bola. Precisa ser menos da metade da velocidade vertical para faltar com o jogo perfeito.
  • Aumente a velocidade da bola com base na dificuldade, duração da partida, etc.
  • Os seres humanos não reagem instantaneamente. Jogadores de IA também não deveriam.
  • Dê à IA uma chance aleatória de cometer um erro e perder a bola.
Adão
fonte
0

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.

Pitto
fonte