ruleta visual con Canvas en JavaScript
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
Vamos a hacer una ruleta visual con Canvas en JavaScript que tenga elementos de un arreglo y que, cada vez que se detenga, elimine el elemento seleccionado para que no vuelva a salir.
Te lo voy a dejar listo para copiar y pegar en un archivo .html.
🎯 Ejercicio: Ruleta de elementos de un arreglo
Funcionamiento:
-
Un arreglo con palabras o elementos.
-
Se dibuja en un
<canvas>una ruleta con esos elementos. -
Al presionar "Girar", la ruleta gira y se detiene aleatoriamente.
-
El elemento ganador se muestra en pantalla y se elimina del arreglo.
-
Si ya no quedan elementos, muestra un mensaje.
html<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Ruleta con Canvas</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
background: #f0f0f0;
}
canvas {
background: white;
border-radius: 50%;
box-shadow: 0 0 10px rgba(0,0,0,0.3);
}
button {
margin-top: 15px;
padding: 10px 20px;
font-size: 18px;
background: #4CAF50;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
button:hover {
background: #45a049;
}
h2 {
margin-top: 20px;
color: #333;
}
</style>
</head>
<body>
<h1>🎡 Ruleta de Arreglo</h1>
<canvas id="ruleta" width="400" height="400"></canvas><br>
<button onclick="girar()">Girar</button>
<h2 id="resultado">Presiona "Girar" para comenzar</h2>
<script>
let canvas = document.getElementById("ruleta");
let ctx = canvas.getContext("2d");
// Arreglo de elementos
let elementos = ["Manzana", "Banana", "Fresa", "Sandía", "Uva", "Melón", "Mango", "Kiwi"];
// Variables de la ruleta
let anguloInicio = 0;
let girando = false;
let velocidad = 0;
let anguloSeleccionado = 0;
// Colores para los segmentos
let colores = ["#FF5733", "#33FF57", "#3357FF", "#FFC300", "#8E44AD", "#E67E22", "#16A085", "#E74C3C"];
// Función para dibujar la ruleta
function dibujarRuleta() {
let segmentos = elementos.length;
let anguloPorSegmento = 2 * Math.PI / segmentos;
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (let i = 0; i < segmentos; i++) {
let angulo = anguloInicio + i * anguloPorSegmento;
// Dibujar segmento
ctx.beginPath();
ctx.moveTo(200, 200);
ctx.arc(200, 200, 200, angulo, angulo + anguloPorSegmento);
ctx.fillStyle = colores[i % colores.length];
ctx.fill();
// Texto del segmento
ctx.save();
ctx.translate(200, 200);
ctx.rotate(angulo + anguloPorSegmento / 2);
ctx.textAlign = "right";
ctx.fillStyle = "white";
ctx.font = "18px Arial";
ctx.fillText(elementos[i], 180, 10);
ctx.restore();
}
// Flecha de selección
ctx.beginPath();
ctx.moveTo(200, 0);
ctx.lineTo(190, 20);
ctx.lineTo(210, 20);
ctx.closePath();
ctx.fillStyle = "black";
ctx.fill();
}
// Función para girar la ruleta
function girar() {
if (girando || elementos.length === 0) return;
velocidad = Math.random() * 0.3 + 0.25; // velocidad inicial
girando = true;
animar();
}
// Animación del giro
function animar() {
if (!girando) return;
anguloInicio += velocidad;
velocidad *= 0.98; // fricción
if (velocidad < 0.002) {
girando = false;
seleccionarElemento();
return;
}
dibujarRuleta();
requestAnimationFrame(animar);
}
// Seleccionar el elemento donde cae la flecha
function seleccionarElemento() {
let segmentos = elementos.length;
let anguloPorSegmento = 2 * Math.PI / segmentos;
// Calcular el índice ganador
let anguloFinal = anguloInicio % (2 * Math.PI);
let indice = Math.floor(((2 * Math.PI) - anguloFinal) / anguloPorSegmento) % segmentos;
let ganador = elementos[indice];
document.getElementById("resultado").textContent = "Ganador: " + ganador;
// Eliminar el elemento del arreglo
elementos.splice(indice, 1);
// Redibujar con los elementos restantes
dibujarRuleta();
// Si ya no hay elementos
if (elementos.length === 0) {
document.getElementById("resultado").textContent = "🎉 No quedan elementos en la ruleta 🎉";
}
}
// Dibujar ruleta inicial
dibujarRuleta();
</script>
</body>
</html>
🔹 Cómo funciona:
-
Canvas dibuja la ruleta con un segmento por cada elemento del arreglo.
-
Cada clic en "Girar" asigna una velocidad aleatoria y la va reduciendo con fricción hasta detenerse.
-
Cuando para, calcula en qué segmento está la flecha y elimina ese elemento del arreglo.
-
Vuelve a dibujar la ruleta con los elementos restantes.
Si quieres, puedo hacer una versión mejorada donde:
-
Los alumnos puedan escribir sus propios elementos para la ruleta.
-
Cambiar los colores aleatoriamente.
-
Guardar el historial de ganadores.
¿Quieres que te la prepare así más interactiva para que los niños puedan personalizar la ruleta?
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
Comentarios
Publicar un comentario