{"id":974,"date":"2026-04-02T01:36:14","date_gmt":"2026-04-02T04:36:14","guid":{"rendered":"https:\/\/www2.ic.uff.br\/pplay\/?page_id=974"},"modified":"2026-09-14T11:24:26","modified_gmt":"2026-09-14T14:24:26","slug":"i-a-2-0","status":"publish","type":"page","link":"http:\/\/www2.ic.uff.br\/pplay\/i-a-2-0\/","title":{"rendered":"I.A"},"content":{"rendered":"\n<div class=\"doc-container\">\n    <div class=\"doc-header\">\n        <h1>Intelig\u00eancia Artificial (A* e Vis\u00e3o)<\/h1>\n        <div class=\"doc-badge\">M\u00f3dulos: navigation, collision | Dificuldade: Avan\u00e7ado<\/div>\n        <p>Fazer um inimigo seguir o jogador \u00e9 f\u00e1cil (apenas subtrair X e Y). Mas fazer ele <strong>desviar de paredes num labirinto<\/strong> exige Algoritmos de Busca em Grafos. A Power PPlay 2.0 possui o algoritmo A* (A-Estrela) embutido no motor matem\u00e1tico, aliado ao Sensor de Raycasting.<\/p>\n    <\/div>\n\n    <div class=\"doc-section\">\n        <h2>1. Vis\u00e3o Computacional (Raycasting 2D)<\/h2>\n        <p>O inimigo s\u00f3 deve te atacar se n\u00e3o houver um obst\u00e1culo entre voc\u00eas. O <code>raycast<\/code> lan\u00e7a uma linha imagin\u00e1ria entre dois pontos e retorna a primeira coisa que ele bater.<\/p>\n        <pre class=\"doc-code\"><code>from PPlay.collision import Collision\n\n# Origem, Destino e Lista de Obst\u00e1culos poss\u00edveis (paredes e player)\nvisto = Collision.raycast(\n    inimigo.x, inimigo.y, \n    player.x, player.y, \n    mapa.get_solidos() + [player]\n)\n\nif visto == player:\n    print(\"O inimigo te enxergou!\")\nelif visto in mapa.get_solidos():\n    print(\"O inimigo est\u00e1 olhando para a parede.\")<\/code><\/pre>\n    <\/div>\n\n    <div class=\"doc-section\">\n        <h2>2. Navega\u00e7\u00e3o em Labirintos (A* Algorithm)<\/h2>\n        <p>O m\u00e9todo <code>encontrar_caminho<\/code> analisa o seu <code>TileMap<\/code> e retorna uma lista de coordenadas. O inimigo s\u00f3 precisa andar at\u00e9 o pr\u00f3ximo ponto da lista.<\/p>\n        <pre class=\"doc-code\"><code>from PPlay.navigation import Navigation\nfrom PPlay.timer import Timer\n\ncaminho_ia =[]\n\ndef calcular_rota():\n    global caminho_ia\n    # A engine cuida da Heur\u00edstica de Manhattan internamente\n    caminho_ia = Navigation.encontrar_caminho(\n        meu_mapa, \n        (inimigo.x, inimigo.y), \n        (player.x, player.y)\n    )\n\n# Agendamos o rec\u00e1lculo para 2 vezes por segundo (otimiza\u00e7\u00e3o de CPU)\nTimer.every(0.5, calcular_rota)\n\nwhile True:\n    Timer.update()\n    \n    # Movimento Suave da IA (Steering)\n    if len(caminho_ia) > 1:\n        alvo = caminho_ia[1] # Pr\u00f3ximo tile\n        dx = alvo[0] - inimigo.x\n        dy = alvo[1] - inimigo.y\n        dist = math.hypot(dx, dy)\n        \n        # Se estiver perto do centro do bloco, pula pro pr\u00f3ximo\n        if dist > 2:\n            inimigo.x += (dx\/dist) * velocidade_ia * janela.delta_time()\n            inimigo.y += (dy\/dist) * velocidade_ia * janela.delta_time()\n        else:\n            caminho_ia.pop(0)<\/code><\/pre>\n    <\/div>\n\n    <div class=\"doc-tip\">\n        <div class=\"doc-tip-title\">\ud83d\udca1 Dica do S\u00eanior: Tweens e Anima\u00e7\u00f5es Matem\u00e1ticas<\/div>\n        <p>Quer fazer um bot\u00e3o do menu deslizar suavemente para a tela com efeito &#8220;el\u00e1stico&#8221;? Use o <code>Tween<\/code>! Ele muda um valor do ponto A ao ponto B em X segundos.<br><br>\n        <code>Tween.to(botao_jogar, \"x\", 400, duracao=1.0, tipo=\"bounce\")<\/code><br>\n        Lembre-se de colocar <code>Tween.update()<\/code> no seu loop principal!<\/p>\n    <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Intelig\u00eancia Artificial (A* e Vis\u00e3o) M\u00f3dulos: navigation, collision | Dificuldade: Avan\u00e7ado Fazer um inimigo seguir o jogador \u00e9 f\u00e1cil (apenas subtrair X e Y). Mas fazer ele desviar de paredes num labirinto exige Algoritmos de Busca em Grafos. A Power PPlay 2.0 possui o algoritmo A* (A-Estrela) embutido no motor matem\u00e1tico, aliado ao Sensor de [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"tutorial-template.php","meta":{"footnotes":""},"_links":{"self":[{"href":"http:\/\/www2.ic.uff.br\/pplay\/wp-json\/wp\/v2\/pages\/974"}],"collection":[{"href":"http:\/\/www2.ic.uff.br\/pplay\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www2.ic.uff.br\/pplay\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www2.ic.uff.br\/pplay\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"http:\/\/www2.ic.uff.br\/pplay\/wp-json\/wp\/v2\/comments?post=974"}],"version-history":[{"count":2,"href":"http:\/\/www2.ic.uff.br\/pplay\/wp-json\/wp\/v2\/pages\/974\/revisions"}],"predecessor-version":[{"id":1096,"href":"http:\/\/www2.ic.uff.br\/pplay\/wp-json\/wp\/v2\/pages\/974\/revisions\/1096"}],"wp:attachment":[{"href":"http:\/\/www2.ic.uff.br\/pplay\/wp-json\/wp\/v2\/media?parent=974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}