Boa tarde! Compartilho minha solução.
<!DOCTYPE html>
<html lang="pt_BR">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
div {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border: 3px double brown;
padding: 25px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.6);
}
div h1,
h3 {
margin-bottom: 5px;
color: brown;
}
canvas {
background-color: lightgray;
}
</style>
<title>Lógica de Programação II</title>
</head>
<body>
<div>
<h1>05 - Nosso primeiro jogo</h1>
<h3>07 - Implemente seu primeiro jogo</h3>
<canvas width="600" height="400"></canvas>
</div>
<script>
// Declaração das constantes.
const canvas = document.querySelector("canvas");
const context = canvas.getContext("2d");
// Declaração das variáveis.
var radiusCircle = 10;
var coordTargetX = generateCoordinates(600);
var coordTargetY = generateCoordinates(400);
// Função responsável por devolver os valores das coordenadas do canvas.
function coordinates(e) {
return [e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop];
}
// Função responsável por desenhar os círculos do alvo.
function drawCircle(x, y, radius, color) {
context.fillStyle = color;
context.beginPath();
context.arc(x, y, radius, 0, 2 * Math.PI);
context.fill();
}
// Função responsável por limpar a tela.
function clearCanvas() {
context.clearRect(0, 0, 600, 400);
}
// Função responsável por desenhar o alvo.
function drawTarget(x, y) {
clearCanvas();
drawCircle(x, y, radiusCircle + 20, "red"); // maior círculo
drawCircle(x, y, radiusCircle + 10, "white"); // círculo do meio
drawCircle(x, y, radiusCircle, "red"); // menor circulo
}
// Função responsável por informar que o alvo foi atingido.
function shoot(e) {
let [x, y] = coordinates(e);
let [minX, minY, maxX, maxY] = [x - radiusCircle, y - radiusCircle, x + radiusCircle, y + radiusCircle];
let [targetX, targetY] = [coordTargetX, coordTargetY]
if (minX <= targetX && targetX <= maxX && minY <= targetY && targetY <= maxY) {
alert("Você ACERTOU!!!");
}
}
// Função responsável por gerar novas coordenadas.
function generateCoordinates(limit) {
return Math.floor(Math.random() * limit);
}
// Função responsável por atualizar a posição do alvo.
function updateTarget() {
coordTargetX = generateCoordinates(600);
coordTargetY = generateCoordinates(400);
drawTarget(coordTargetX, coordTargetY);
}
canvas.onclick = shoot;
drawTarget(coordTargetX, coordTargetY);
setInterval(updateTarget, 1000);
</script>
</body>
</html>