From 15aaaf2ca0b3dbf1fe213bcc8af934b1fa8a0dd6 Mon Sep 17 00:00:00 2001 From: Ricardo Date: Sat, 20 Jul 2024 05:40:25 -0300 Subject: [PATCH] =?UTF-8?q?Adicionado=20agentes=20inteligentes=20ao=20proj?= =?UTF-8?q?eto=20dino=20ia=20(Agentes=20feitos=20por=20Jos=C3=A9=20Gabriel?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- projetos/projeto-dino-ia/DinoSimples.png | Bin 0 -> 796 bytes projetos/projeto-dino-ia/dino.css | 27 +++ projetos/projeto-dino-ia/dino.html | 5 +- projetos/projeto-dino-ia/dino.js | 88 ++++++-- projetos/projeto-dino-ia/dinoAgenteSimples.js | 202 ++++++++++++++++++ 5 files changed, 306 insertions(+), 16 deletions(-) create mode 100644 projetos/projeto-dino-ia/DinoSimples.png create mode 100644 projetos/projeto-dino-ia/dinoAgenteSimples.js diff --git a/projetos/projeto-dino-ia/DinoSimples.png b/projetos/projeto-dino-ia/DinoSimples.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1984c4f7565e4a9a8981c65bc815e463ad8b66 GIT binary patch literal 796 zcmV+%1LOROP)TwHzy`dQL{P7dEvFnT;n z#A1M-(?4jafMW&qPDnVv0axFl23$=v#53T&fVazOaASTL{_+)!1R5I{umSH0sLQm* z{4l&L7!lto10JQdzuow% z22+KSz%86)ybb{H&4Y+Ye4ESn*v)!*{P>1I~5Jr~+{F z-)!A5x*+P6WM2WP=Qm)Lm}rk1uvgdQ-kKZv8?acBs<{EH#6)`o7J;ee2za$+9Cgcv zuOcWzv;XKBFl8_~Zoo-^Dino +

Dino (Enter para iniciar e Seta para cima para pular)

-

PONTUAÇÂO: 0

+

PONTUAÇÂO (Agente Simples): 0

+

PONTUAÇÂO (Agente Modelo): 0

+
diff --git a/projetos/projeto-dino-ia/dino.js b/projetos/projeto-dino-ia/dino.js index d21e1e2..8b7c9b8 100644 --- a/projetos/projeto-dino-ia/dino.js +++ b/projetos/projeto-dino-ia/dino.js @@ -1,3 +1,4 @@ +(function() { let jogo = document.getElementById("jogo"); let dino = document.getElementById("dino"); let pontos = document.getElementById('pontos'); @@ -6,6 +7,8 @@ let jogoAtivo = false; let pontuacao = 0; let dinoPosY = jogo.offsetHeight - dino.clientHeight; let dinoPosX = 0; +let velocidadeCacto = 3; // Velocidade inicial dos cactos +let intervaloCactos = 1000; // Intervalo inicial para criar cactos // Move o dino para baixo dino.style.transform = `translate(${dinoPosX}px, ${dinoPosY}px)`; @@ -51,33 +54,38 @@ function criarCactus() { return { element: cactoDiv, position: posicaoInicial }; } - function moverCactus() { let cactos = []; + let ultimoTempo = 0; function criarCactos() { - const intervaloCactos = setInterval(() => { + if (!jogoAtivo) return; + let tempoAtual = Date.now(); + if (tempoAtual - ultimoTempo >= intervaloCactos) { let cacto = criarCactus(); cactos.push(cacto); - if (!jogoAtivo) { - clearInterval(intervaloCactos); - } - }, 1000); + ultimoTempo = tempoAtual; + } + requestAnimationFrame(criarCactos); } - criarCactos(); function animar() { if (jogoAtivo) { for (let index = 0; index < cactos.length; index++) { let cacto = cactos[index]; - cacto.position -= 3; // Velocidade dos cactos + cacto.position -= velocidadeCacto; // Velocidade dos cactos cacto.element.style.transform = `translate(${cacto.position}px, ${jogo.offsetHeight - dino.offsetHeight - 30}px)`; - if (cacto.position <= -20) { + if (cacto.position <= 0) { jogo.removeChild(cacto.element); cactos.splice(index, 1); index--; pontuacao++; - pontos.innerText = `PONTUAÇÂO: ${pontuacao}`; + pontos.innerText = `PONTUAÇÃO (Agente Modelo): ${pontuacao}`; + + if (pontuacao % 10 === 0) { + velocidadeCacto += 0.5; // Aumenta a velocidade dos cactos a cada 10 pontos + intervaloCactos = Math.max(200, intervaloCactos - 50); // Diminui o intervalo de criação dos cactos, até um mínimo de 200ms + } } if (colisao(dino, cacto.element)) { clearInterval(timer); @@ -94,6 +102,7 @@ function moverCactus() { requestAnimationFrame(animar); } } + criarCactos(); animar(); } @@ -119,22 +128,66 @@ function limparTela() { function reiniciarJogo() { limparTela(); jogoAtivo = true; + velocidadeCacto = 3; // Reseta a velocidade dos cactos + intervaloCactos = 1000; // Reseta o intervalo de criação dos cactos moverCactus(); timer = 0; - pontos.innerText = `PONTUAÇÂO: 0`; + pontos.innerText = `PONTUAÇÃO (Agente Modelo): 0`; pontos.style.color = 'black'; pontos.style.backgroundColor = 'transparent'; - // // Posiciona o dinossauro no início do jogo + // Posiciona o dinossauro no início do jogo dinoPosY = jogo.offsetHeight - dino.clientHeight; - // dinoPosX = 0; + dinoPosX = 0; // Atualiza a posição do dinossauro - dino.style.transform = `translateY(${dinoPosY}px)`; + dino.style.transform = `translate(${dinoPosX}px, ${dinoPosY}px)`; window.addEventListener("keydown", (e) => {if (e.code == 'Enter' && !jogoAtivo) {reiniciarJogo();}}); } +function iniciarAgente(sensor) { + agente_timer = setInterval(() => { + if(sensor()) { + acionador(); + } + if (!jogoAtivo) { + clearInterval(agente_timer); + } + }, 50); +} + +// Agente Reativo Simples +function agenteSimples() { + iniciarAgente(sensorAS); +} + +// Agente Reativo Baseado em Modelo +function agenteModelo() { + iniciarAgente(sensorAM); +} + +function sensorAS() { + let dinoRect = dino.getBoundingClientRect(); + let cacto = document.getElementsByClassName('cacto')[0]; + let cactoRect = cacto.getBoundingClientRect(); + + return (dinoRect.right + 20) >= cactoRect.left; +} + +function sensorAM(){ + let dinoRect = dino.getBoundingClientRect(); + let cacto = document.getElementsByClassName('cacto')[0]; + let cactoRect = cacto.getBoundingClientRect(); + let estado = velocidadeCacto; + let modelo = (estado - 3) * 12; + + return (dinoRect.right + 20 + modelo) >= cactoRect.left; +} + +function acionador(){ + window.dispatchEvent(new KeyboardEvent('keydown', {code: 'ArrowUp'})); +} // Eventos window.addEventListener("keydown", (e) => { @@ -143,4 +196,9 @@ window.addEventListener("keydown", (e) => { } }); -window.addEventListener("keydown", (e) => {if (e.code == 'Enter' && !jogoAtivo) {reiniciarJogo();}}); \ No newline at end of file +window.addEventListener("keydown", (e) => {if (e.code == 'Enter' && !jogoAtivo) { + reiniciarJogo(); + // agenteSimples(); + agenteModelo(); +}}); +})(); \ No newline at end of file diff --git a/projetos/projeto-dino-ia/dinoAgenteSimples.js b/projetos/projeto-dino-ia/dinoAgenteSimples.js new file mode 100644 index 0000000..f6b04cc --- /dev/null +++ b/projetos/projeto-dino-ia/dinoAgenteSimples.js @@ -0,0 +1,202 @@ +(function() { +let jogo = document.getElementById("jogo"); +let dinoAS = document.getElementById("dinoAS"); +let pontosAS = document.getElementById('pontosAS'); +let timerAS = 0; // Inicializa o timerAS +let jogoAtivoAS = false; +let pontuacaoAS = 0; +let dinoASPosY = 0; +let dinoASPosX = 0; +let velocidadeCactoAS = 3; // Velocidade inicial dos cactos +let intervaloCactosAS = 1000; // Intervalo inicial para criar cactos + +function pularAS() { + if (timerAS == 0) { + let inicio = Date.now(); + timerAS = setInterval(() => { + let tempoPassado = Date.now() - inicio; + if (tempoPassado >= 250) { + clearInterval(timerAS); + let tempoRestante = 250; + timerAS = setInterval(() => { + tempoRestante -= 10; + dinoAS.style.transform = `translateY(${tempoRestante / 3}px) rotate(180deg) scaleX(-1)`; + if (tempoRestante <= 0) { + clearInterval(timerAS); + timerAS = 0; + } + }, 10); + } + dinoAS.style.transform = `translateY(${tempoPassado / 3}px) rotate(180deg) scaleX(-1)`; + }, 10); + } +} + +function criarCactusAS() { + let cactoASDiv = document.createElement('div'); + cactoASDiv.className = 'cactoAS'; + + let cactoASImg = document.createElement('img'); + cactoASImg.src = './SmallCactus1.png'; + cactoASImg.width = 20; + cactoASImg.height = 30; + + // Posicionar o cacto usando translate + let posicaoInicial = jogo.offsetWidth - 21; + cactoASDiv.style.transform = `translate(${posicaoInicial}px, ${-45}px) rotate(180deg) scaleX(-1)`; + cactoASDiv.style.position = 'absolute'; + cactoASDiv.appendChild(cactoASImg); + jogo.appendChild(cactoASDiv); + + return { element: cactoASDiv, position: posicaoInicial }; +} + +function moverCactusAS() { + let cactosAS = []; + let ultimoTempo = 0; + + function criarCactosAS() { + if (!jogoAtivoAS) return; + let tempoAtual = Date.now(); + if (tempoAtual - ultimoTempo >= intervaloCactosAS) { + let cactoAS = criarCactusAS(); + cactosAS.push(cactoAS); + ultimoTempo = tempoAtual; + } + requestAnimationFrame(criarCactosAS); + } + + function animarAS() { + if (jogoAtivoAS) { + for (let index = 0; index < cactosAS.length; index++) { + let cactoAS = cactosAS[index]; + cactoAS.position -= velocidadeCactoAS; // Velocidade dos cactos + cactoAS.element.style.transform = `translate(${cactoAS.position}px, ${-45}px) rotate(180deg) scaleX(-1)`; + if (cactoAS.position <= 0) { + jogo.removeChild(cactoAS.element); + cactosAS.splice(index, 1); + index--; + pontuacaoAS++; + pontosAS.style.color = 'red'; + pontosAS.innerText = `PONTUAÇÃO (Agente Simples): ${pontuacaoAS}`; + + if (pontuacaoAS % 10 === 0) { + velocidadeCactoAS += 0.5; // Aumenta a velocidade dos cactos a cada 10 pontos + intervaloCactosAS = Math.max(200, intervaloCactosAS - 50); // Diminui o intervalo de criação dos cactos, até um mínimo de 200ms + } + } + if (colisaoAS(dinoAS, cactoAS.element)) { + clearInterval(timerAS); + jogoAtivoAS = false; + pontosAS.innerText = `PERDEU! + Você fez ${pontuacaoAS} pontos, parabéns! + Aperte Enter para reiniciar.`; + pontosAS.style.color = 'red'; + pontosAS.style.backgroundColor = 'black'; + window.addEventListener("keydown", (e) => {if (e.code == 'Enter' && !jogoAtivoAS) {reiniciarJogoAS();}}); + break; + } + } + requestAnimationFrame(animarAS); + } + } + criarCactosAS(); + animarAS(); +} + +function colisaoAS(dinoAS, cactoAS) { + let dinoASRect = dinoAS.getBoundingClientRect(); + let cactoASRect = cactoAS.getBoundingClientRect(); + + return !( + dinoASRect.top > cactoASRect.bottom || + dinoASRect.bottom -3 < cactoASRect.top || + dinoASRect.right -10 < cactoASRect.left || + dinoASRect.left +10 > cactoASRect.right + ); +} + +function limparTelaAS() { + // Remove apenas os elementos relacionados aos cactos + let elementosCactosAS = jogo.querySelectorAll('.cactoAS'); + elementosCactosAS.forEach(cactoAS => jogo.removeChild(cactoAS)); + pontuacaoAS = 0; +} + +function reiniciarJogoAS() { + limparTelaAS(); + jogoAtivoAS = true; + velocidadeCactoAS = 3; // Reseta a velocidade dos cactos + intervaloCactosAS = 1000; // Reseta o intervalo de criação dos cactos + moverCactusAS(); + timerAS = 0; + pontosAS.innerText = `PONTUAÇÃO (Agente Simples): 0`; + pontosAS.style.color = 'red'; + pontosAS.style.backgroundColor = 'transparent'; + + // Posiciona o dinossauro no início do jogo + dinoASPosY = jogo.offsetHeight - dinoAS.clientHeight; + dinoASPosX = 0; + + // Atualiza a posição do dinossauro + dinoAS.style.transform = `translateY(0px) rotate(180deg) scaleX(-1)`; + + window.addEventListener("keydown", (e) => {if (e.code == 'Enter' && !jogoAtivoAS) {reiniciarJogoAS();}}); +} + +function iniciarAgenteAS(sensor) { + agente_timerAS = setInterval(() => { + if(sensor()) { + acionadorAS(); + } + if (!jogoAtivoAS) { + clearInterval(agente_timerAS); + } + }, 50); +} + +// Agente Reativo Simples +function agenteSimplesAS() { + iniciarAgenteAS(sensorASAS); +} + +// Agente Reativo Baseado em Modelo +function agenteModeloAS() { + iniciarAgenteAS(sensorAMAS); +} + +function sensorASAS() { + let dinoASRect = dinoAS.getBoundingClientRect(); + let cactoAS = document.getElementsByClassName('cactoAS')[0]; + let cactoASRect = cactoAS.getBoundingClientRect(); + + return (dinoASRect.right + 20) >= cactoASRect.left; +} + +function sensorAMAS(){ + let dinoASRect = dinoAS.getBoundingClientRect(); + let cactoAS = document.getElementsByClassName('cactoAS')[0]; + let cactoASRect = cactoAS.getBoundingClientRect(); + let estado = velocidadeCactoAS; + let modelo = (estado - 3) * 12; + + return (dinoASRect.right + 20 + modelo) >= cactoASRect.left; +} + +function acionadorAS(){ + window.dispatchEvent(new KeyboardEvent('keydown', {code: 'ArrowDown'})); +} + +// Eventos +window.addEventListener("keydown", (e) => { + if (e.code == 'ArrowDown') { + pularAS(); + } +}); + +window.addEventListener("keydown", (e) => {if (e.code == 'Enter' && !jogoAtivoAS) { + reiniciarJogoAS(); + agenteSimplesAS(); + // agenteModelo(); +}}); +})(); \ No newline at end of file