Este tutorial adapta pedagógicamente el Día 19. Las secciones 📝 Ejercicio original del curso provienen de los archivos del curso. Los retos 🟢🟡🟠🔴, el proyecto extra y el proyecto integrador son creaciones de esta adaptación. Las correcciones al material original aparecen como 🛠️ Nota técnica.
Nota sobre las verificaciones: los ejemplos que no dibujan se probaron ejecutándolos con Python 3.14. Por ejemplo, la calculadora de orden superior y una simulación de 100 000 carreras sin ventana gráfica. Las firmas de los métodos de Turtle (
onkey,textinput,setup) se consultaron en el propio módulo. Los programas con ventana se revisaron siguiendo la lógica del código y la documentación oficial (se abre en otra pestaña). Ejecútalos en tu computador para ver el resultado.
Tabla de contenidos
- Antes de empezar
- Detectores de eventos y funciones de orden superior
- Reto: la aplicación Etch-A-Sketch
- Estado e instancias de un objeto
- El sistema de coordenadas de Turtle
- 🚀 Proyecto del día: la carrera de tortugas
- 🌟 Proyecto extra: Pizarra Interactiva de Geometría
- 🏆 Proyecto integrador del Día 19: la Feria de Carreras del Colegio
- 🧩 Comprueba lo aprendido
- 🤖 Programar con apoyo de IA
- 🛠️ Correcciones técnicas al material original
- 📋 Matriz de trazabilidad
- 📦 Evidencias de aprendizaje del Día 19
0. Antes de empezar
(Fuentes: 139 - Day 19 Goals- what we will make by the end of the day.md, 145 - Expand on the Solutions.md)
Hasta ahora, nuestros programas de Turtle hacían siempre lo mismo: dibujaban y terminaban. Hoy el programa va a reaccionar a lo que hace el usuario, por ejemplo cuando presiona una tecla. Además, aprenderemos a manejar muchas tortugas a la vez, cada una con su propio comportamiento.
Construiremos dos proyectos:
- Etch-A-Sketch: el juguete de dibujo en el que se mueve un lápiz con dos perillas. Aquí lo controlaremos con el teclado.
- Carrera de tortugas: el usuario apuesta por un color y seis tortugas avanzan al azar hasta la meta.
Mensaje de cierre del curso: el código de las soluciones es deliberadamente sencillo, porque debe explicarse en una o dos horas. No cubre todos los casos especiales ni todas las ideas posibles. Una vez que lo entiendas, amplíalo: investiga, prueba, mejóralo. A veces descubrirás que necesitas conocimientos que llegarán más adelante, y está bien volver al proyecto después.
Prerequisito general: clases, objetos, atributos y métodos (Días 16 y 17), Turtle y la documentación (Día 18), funciones con parámetros y
return(Días 8 y 10), listas e índices (Día 4), buclesforywhile(Días 5 y 6) yrandom(Día 4).
1. Detectores de eventos y funciones de orden superior
(Fuente: 140 - Python Higher Order Functions & Event Listeners.md)
🎯 Objetivo de aprendizaje
- Hacer que un programa de Turtle responda a una tecla con
listen()yonkey(). - Explicar qué es una función de orden superior y por qué una función se pasa sin paréntesis.
🧠 ¿Qué aprenderemos?
Detectores de eventos (event listeners), funciones como argumentos y argumentos de palabra clave.
📖 Explicación conceptual
¿Qué es un evento? Es algo que ocurre mientras el programa está abierto: presionar una tecla, hacer clic, mover el ratón. Un detector de eventos es código que "se queda escuchando" y, cuando el evento ocurre, ejecuta una función.
Piensa en el timbre de tu casa: nadie está mirando la puerta todo el tiempo. Cuando alguien toca, el timbre avisa y alguien reacciona. Así funcionan los eventos.
La documentación de Turtle tiene una sección completa llamada eventos de la pantalla. Los dos métodos clave son:
| Método | Qué hace |
|---|---|
screen.listen() |
La pantalla empieza a escuchar el teclado. Sin esta línea, las teclas no hacen nada |
screen.onkey(fun, key) |
Vincula una tecla con una función. fun debe ser una función sin argumentos y key es una tecla ("a") o un nombre de tecla ("space", "Up", "Down"…) |
🔎 Ejemplo explicado
from turtle import Turtle, Screen
tim = Turtle()
screen = Screen()
def move_forwards():
tim.forward(10)
screen.listen()
screen.onkey(key="space", fun=move_forwards) # sin paréntesis después de move_forwards
screen.exitonclick()¿Cómo se ejecuta?
- Se crean la tortuga y la pantalla.
- Se define
move_forwards, pero todavía no se ejecuta. listen()activa la escucha.onkeyguarda la función para usarla después. No la ejecuta.- Cada vez que pulsas la barra espaciadora, Turtle llama a
move_forwards()ytimavanza 10 pasos.
🛠️ Nota técnica (verificada en la documentación del módulo):
onkeyse activa al soltar la tecla (key-release). Si quieres que la acción ocurra al presionarla, existeonkeypress. Volveremos a esto en el Día 22.
La regla de oro de hoy: cuando una función se pasa como argumento, se escribe sin paréntesis. Los paréntesis la ejecutan en ese mismo momento; sin ellos, solo entregamos "la receta" para que otro la ejecute cuando corresponda.
Consejo del curso: en métodos que no escribiste tú, como onkey, usa argumentos de palabra clave (key=, fun=). Así quien lea el código entiende qué es cada valor, sobre todo cuando el orden no tiene un significado evidente. (Verificado: la firma real es onkey(fun, key), así que con palabras clave puedes escribirlos en cualquier orden.)
Funciones de orden superior
Una función de orden superior es una función que recibe otra función como entrada (o la devuelve) y trabaja con ella. onkey es una. El curso lo muestra con la calculadora del Día 10:
def add(n1, n2):
return n1 + n2
def subtract(n1, n2):
return n1 - n2
def multiply(n1, n2):
return n1 * n2
def divide(n1, n2):
return n1 / n2
def calculator(n1, n2, func):
return func(n1, n2) # aquí sí van los paréntesis: se llama a la función recibida
result = calculator(2, 3, add) # add se pasa sin paréntesis
print(result) # 5Si cambias add por multiply, obtienes 6. Con divide, obtienes 0.6666666666666666 (verificado).
🛠️ Nota técnica (verificada): en la lección se dice que la división da
0"porque se redondea a un número entero". En Python 3,/siempre devuelve unfloat(Día 2):2 / 3da0.666…. Solo la división entera//daría0.
No todos los lenguajes permiten pasar funciones como si fueran datos. En Python es muy común y resulta especialmente útil para responder a eventos.
⚠️ Errores frecuentes
| Error | Qué ocurre | Por qué | Cómo solucionarlo |
|---|---|---|---|
screen.onkey(move_forwards(), "space") |
La tortuga avanza una vez al iniciar y la tecla no hace nada | Los paréntesis ejecutan la función y a onkey le llega su resultado (None) |
Quita los paréntesis |
Olvidar screen.listen() |
Presionas las teclas y no pasa nada | La pantalla no está escuchando | Llama listen() antes o después de los onkey, pero antes de exitonclick() |
Escribir "up" en lugar de "Up" |
La flecha no responde | Los nombres de teclas distinguen mayúsculas (vienen de Tk) | Usa "Up", "Down", "Left", "Right" |
Definir una función con parámetros para onkey |
TypeError al presionar la tecla |
onkey llama a la función sin argumentos |
Crea una función sin parámetros por cada acción |
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1: vincula la tecla
"r"a una función que cambie el color detima rojo y"b"a una que lo cambie a azul. - 🟡 Reto 2: escribe
aplicar_dos_veces(func, x)que devuelvafunc(func(x)). Pruébala con una funciónduplicar(n). ¿Qué devuelveaplicar_dos_veces(duplicar, 5)? - 🟠 Reto 3: crea un diccionario
operaciones = {"+": add, "-": subtract, ...}(¡las funciones pueden ser valores de un diccionario!) y úsalo para que el usuario escriba el símbolo y el programa calcule. - 🔴 Reto 4: busca en la documentación
screen.onscreenclick(fun). ¿Cuántos argumentos recibe la función que le pasas? Escribe un programa en el que la tortuga vaya al punto donde haces clic.
2. Reto: la aplicación Etch-A-Sketch
(Fuente: 141 - Challenge- Make an Etch-A-Sketch App.md)
📝 Ejercicio original del curso
Enunciado: crear un programa de dibujo en el que:
| Tecla | Acción |
|---|---|
W |
Avanzar |
S |
Retroceder |
A |
Girar a la izquierda (sentido antihorario) |
D |
Girar a la derecha (sentido horario) |
C |
Borrar todo el dibujo y devolver la tortuga al centro |
Objetivo: practicar los detectores de eventos y buscar en la documentación los métodos necesarios.
Resultado esperado: combinando W con A o D se pueden dibujar líneas y curvas.
🔍 Antes de programar
- Como
onkeysolo acepta funciones sin argumentos, ¿cuántas funciones necesitas? - ¿Qué método borra los dibujos? En la documentación hay dos
clear: uno de la tortuga y otro de la pantalla. ¿Cuál necesitas? - ¿Qué método lleva la tortuga al centro?
- Al volver al centro, ¿dejará un rastro? ¿Cómo lo evitas?
Cómo lo resuelve el curso
- Cuatro funciones de movimiento:
move_forwards,move_backwards,turn_leftyturn_right, cada una vinculada a su tecla. - Dos formas válidas de girar:
- Leer el rumbo actual y sumarle 10:
tim.setheading(tim.heading() + 10). Como 0° es el Este y 90° el Norte, sumar gira a la izquierda y restar gira a la derecha. - Usar directamente
tim.left(10)otim.right(10). El curso aclara que ambas funcionan y la elección es tuya.
- Leer el rumbo actual y sumarle 10:
- Borrar:
tim.clear()borra solo los dibujos de esa tortuga. En cambio,screen.clear()borra todo, incluida la tortuga. - Volver al centro:
tim.home(). El curso descubre que la tortuga dibuja su camino de regreso, así que la solución espenup(),home()ypendown().
🛠️ Nota técnica (verificada en la documentación del módulo):
screen.clear()no solo borra las tortugas: también elimina todos los vínculos de teclas y deja la pantalla en su estado inicial. Si lo usaras en el Etch-A-Sketch, las teclas dejarían de funcionar. Otra alternativa válida estim.reset(), que borra el dibujo y devuelve la tortuga al centro de una vez.
Reflexión del curso: no te castigues si no encontraste home o clear. Leer la documentación es cuestión de práctica y paciencia. El ciclo del desarrollo es: agrega algo, ejecuta, revisa si hace lo que quieres y, si no, arréglalo. "Siempre aprendo más cuando cometo más errores."
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1 — Aplicación: agrega las teclas
"plus"(+) y"minus"(-) para cambiar el grosor del lápiz conpensize. - 🟡 Reto 2 — Ampliación: agrega la tecla
"space"para subir o bajar el lápiz alternadamente. (Pista:tim.isdown()devuelveTruesi el lápiz está abajo.) - 🟠 Reto 3 — Desafío: evita que la tortuga salga de la ventana: antes de avanzar, calcula si su nueva posición quedaría fuera y, en ese caso, no la muevas.
- 🔴 Reto 4 — Pensamiento computacional: diseña un "modo espejo": una segunda tortuga dibuja de forma simétrica respecto al eje Y. ¿Qué debe pasarle a su rumbo cuando la primera gira a la izquierda?
3. Estado e instancias de un objeto
(Fuente: 142 - Object State and Instances.md)
🎯 Objetivo de aprendizaje
- Diferenciar clase, objeto, instancia y estado.
- Crear varias instancias de una misma clase que actúan de forma independiente.
📖 Explicación conceptual
La clase Turtle es un plano: define qué tiene una tortuga (atributos) y qué puede hacer (métodos). Con ese plano podemos construir tantos objetos como necesitemos: timmy, tommy, jenny…
from turtle import Turtle
timmy = Turtle()
tommy = Turtle()
timmy.color("green")
tommy.color("purple")
timmy.forward(100) # timmy se mueve; tommy sigue quieto- Instancia: cada objeto creado es una instancia (un ejemplo) de la clase. Tú y tu compañero son dos "instancias" de ser humano: comparten la misma estructura, pero cada uno es independiente.
- Estado: son los valores de los atributos y lo que está haciendo el objeto en un momento dado. El estado del color de
timmyes verde y el detommyes morado. En este momentotimmyse está moviendo ytommyestá quieto.
Relación con el Día 16: allí creamos objetos a partir de clases. Hoy la novedad es trabajar con muchas instancias a la vez, normalmente guardadas en una lista.
⚠️ Errores frecuentes
| Error | Qué ocurre | Solución |
|---|---|---|
| Crear las tortugas en un bucle con el mismo nombre de variable y sin guardarlas | Solo puedes controlar la última; las demás quedan "perdidas" en la pantalla | Agrégalas a una lista con append |
Escribir tommy = timmy creyendo que es una copia |
Hay una sola tortuga con dos nombres; lo que haces con uno le pasa al "otro" | Crea otra instancia con Turtle() |
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1: crea 3 tortugas de colores distintos y haz que cada una dibuje un polígono diferente (Día 18).
- 🟡 Reto 2: prueba
tommy = timmyy luegotommy.color("red"). ¿De qué color quedatimmy? Explica por qué. - 🟠 Reto 3: guarda 5 tortugas en una lista y haz que todas giren 72° y avancen 100 con un solo bucle.
- 🔴 Reto 4: con tus palabras, explica la diferencia entre el estado de una tortuga y su clase. Da un ejemplo de tu vida escolar (por ejemplo, la clase "Estudiante" y el estado de cada estudiante durante una jornada).
4. El sistema de coordenadas de Turtle
(Fuente: 143 - Understanding the Turtle Coordinate System.md)
🎯 Objetivo de aprendizaje
- Configurar el tamaño de la ventana y pedir datos al usuario con
textinput. - Ubicar objetos en la pantalla con
goto(x, y)usando el plano cartesiano.
📖 Explicación conceptual
Tamaño de la ventana. Con screen.setup(width=500, height=400) la ventana mide 500 píxeles de ancho y 400 de alto. El curso recomienda de nuevo los argumentos de palabra clave: setup(500, 400) obliga al lector a adivinar cuál es el ancho.
Pedir datos en una ventana emergente:
user_bet = screen.textinput(title="Haz tu apuesta", prompt="¿Qué tortuga ganará la carrera? Escribe un color: ")Funciona como input(): devuelve un string. Si necesitas un número, existe numinput.
El plano cartesiano de Turtle. La ventana es como un plano cartesiano de matemáticas, con el origen (0, 0) en el centro:
y = +200
|
x = -250 ----------+---------- x = +250
| (0, 0)
y = -200Con una ventana de 500 × 400:
- El eje X va de −250 (borde izquierdo) a +250 (borde derecho): la mitad del ancho hacia cada lado.
- El eje Y va de −200 (abajo) a +200 (arriba).
Pregunta del curso: ¿cuáles son las coordenadas de un punto ubicado a mitad de camino del borde derecho y a mitad de camino del borde superior? Respuesta: (125, 100), porque la mitad de 250 es 125 y la mitad de 200 es 100.
Otros detalles de la lección:
goto(-250, -100)deja la tortuga justo en el borde, casi invisible. El curso usax = -230para que se vea.- Se puede crear la tortuga con su forma desde el inicio:
Turtle(shape="turtle"). penup()para que las tortugas no dibujen al moverse.
📝 Ejercicio original del curso: seis tortugas en la línea de salida
Enunciado: crear seis tortugas, una por cada color de colors = ["red", "orange", "yellow", "green", "blue", "purple"], y ubicarlas en la línea de salida, espaciadas de forma uniforme en el eje Y.
🔍 Antes de programar
- ¿Qué coordenada debe ser igual para todas las tortugas y cuál debe cambiar? ¿Por qué?
- ¿Cómo relacionas la tortuga número
icon su color y su posición?
Solución del curso (en palabras): un for turtle_index in range(0, 6): que crea cada tortuga, le asigna colors[turtle_index] y la envía a goto(x=-230, y=y_positions[turtle_index]), con y_positions = [-70, -40, -10, 20, 50, 80] (empieza en −70 y sube de 30 en 30).
Alternativa de esta adaptación: en lugar de escribir la lista de posiciones a mano, puedes calcularla:
y = -70 + turtle_index * 30. Así, si cambias el número de tortugas, no tienes que reescribir la lista. Ambas formas son válidas; la calculada escala mejor.
⚠️ Errores frecuentes
| Error | Qué ocurre | Solución |
|---|---|---|
Confundir X con Y en goto |
Las tortugas quedan en columna vertical o fuera de la pantalla | Recuerda: goto(x, y) → X es horizontal. Usa palabras clave |
| Usar la mitad del ancho exacta | La tortuga queda en el borde y no se ve | Deja un margen (por ejemplo, 20 píxeles) |
Olvidar que textinput puede devolver None |
Si el usuario pulsa Cancelar, el programa falla más adelante | Verifica if user_bet: antes de usarlo |
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1: cambia la ventana a 800 × 600 y ubica las tortugas en la nueva línea de salida. ¿Qué valores cambiaste?
- 🟡 Reto 2: dibuja con una tortuga auxiliar la línea de meta vertical en
x = 230. - 🟠 Reto 3: calcula las posiciones Y para que cualquier número de tortugas quede centrado verticalmente. Prueba con 3, 6 y 9.
- 🔴 Reto 4: escribe una función
esta_dentro(x, y, ancho, alto)que devuelvaTruesi el punto está dentro de la ventana. Pruébala con 5 puntos antes de usarla en Turtle.
5. 🚀 Proyecto del día: la carrera de tortugas
(Fuentes: 143 - Understanding the Turtle Coordinate System.md, 144 - Aaaand, we're off to the races!.md)
Problema
Seis tortugas de colores compiten en una carrera. El usuario apuesta por un color, las tortugas avanzan una distancia aleatoria en cada turno y la primera que cruza la meta gana. El programa informa si el usuario ganó o perdió.
Contexto
Es el tipo de juego que podría animar una feria del colegio: un juego de azar sencillo en el que nadie tiene ventaja… o eso creemos (lo comprobaremos en la sección de depuración).
Objetivo
Construir el juego usando varias instancias de Turtle, cada una con su propio estado.
Requisitos funcionales
- Ventana de 500 × 400.
- Ventana emergente para la apuesta.
- Seis tortugas de colores alineadas en la línea de salida.
- Avances aleatorios entre 0 y 10 en cada turno.
- Detectar a la ganadora y mostrar en la consola si el usuario ganó o perdió, y el color de la ganadora.
Restricciones técnicas
textinput, goto, listas de objetos, random.randint, while con una variable de control y pencolor().
Planificación
| Pregunta | Respuesta esperada |
|---|---|
| Entradas | El color apostado |
| Procesos | Crear tortugas, moverlas al azar, revisar si alguna cruzó la meta |
| Salidas | Mensaje de victoria o derrota con el color ganador |
| Partes | Configuración → Tortugas → Bucle de carrera → Fin de la carrera |
Construcción paso a paso
Versión 1 — Configuración: setup, textinput e imprimir la apuesta para comprobarla.
Versión 2 — Salida: el bucle del Tema 4 con las seis tortugas en la línea de salida.
Versión 3 — Guardar las instancias. El curso observa que ya no tiene sentido llamar tim a todas las tortugas: refactoriza el nombre a new_turtle y agrega cada una a una lista all_turtles = [].
Versión 4 — Movimiento:
is_race_on = False
if user_bet: # solo empieza cuando hay una apuesta
is_race_on = True
while is_race_on:
for turtle in all_turtles:
rand_distance = random.randint(0, 10) # randint incluye el 0 y el 10
turtle.forward(rand_distance)La variable is_race_on evita que la carrera empiece mientras el usuario todavía está decidiendo.
Versión 5 — Condición de parada. El borde derecho está en x = 250, pero hay que detectar la llegada antes, en 230, teniendo en cuenta el tamaño de la tortuga. Dentro del for:
- Si
turtle.xcor() > 230: se termina la carrera (is_race_on = False). - El color se obtiene con
turtle.pencolor(). El curso descubre queturtle.color()devuelve dos valores (el color del lápiz y el de relleno) y por eso imprime algo como('yellow', 'yellow'). - Se compara
winning_color == user_bety se imprime "Has ganado" o "Has perdido" junto con el color de la ganadora.
🛠️ Nota técnica (verificada): el curso dice que la tortuga mide 40 × 40 píxeles y por eso resta 20 al borde. Según la definición de formas del módulo, la forma
"turtle"mide unos 18 × 24 píxeles y las formas"square"y"classic"unos 20 × 20. El margen de 20 (230 = 250 − 20) sigue siendo razonable, pero la razón exacta es "la mitad del tamaño de la forma, más un poco de margen".
Pruebas
| Caso | Resultado esperado |
|---|---|
Apostar red y que gane la roja |
"Has ganado" y el color red |
Apostar red y que gane otra |
"Has perdido" y el color ganador |
| Pulsar Cancelar | La carrera no empieza y el programa no falla |
Apostar Red (con mayúscula) |
⚠️ Siempre dice "perdido", aunque gane la roja. ¿Por qué? Corrígelo con .lower() |
🧪 Prueba y depuración: ¿la carrera es justa?
En el código del curso, cuando una tortuga cruza la meta, is_race_on pasa a False, pero el for sigue recorriendo el resto de tortugas en esa misma vuelta. Además, las tortugas siempre se mueven en el mismo orden.
Se simularon 100 000 carreras sin ventana gráfica, con los mismos valores del curso (salida en −230, meta en 230, pasos de 0 a 10). Resultados verificados:
- En aproximadamente el 10,5 % de las carreras, dos o más tortugas cruzan la meta en la misma vuelta y el programa anuncia más de un ganador.
- Incluso deteniendo el recorrido en la primera que cruza, el orden de la lista da ventaja: la primera tortuga ganó cerca del 18,6 % de las carreras y la última cerca del 14,9 %. En una carrera justa, cada una ganaría alrededor del 16,7 %.
Actividad:
- Explica por qué la primera tortuga de la lista tiene ventaja.
- Corrige el error de los varios ganadores (pista:
break, o revisar la meta después de mover a todas). - Propón una forma de hacer la carrera justa. (Ideas: desordenar la lista en cada vuelta con
random.shuffle, o mover a todas primero y, si hay empate, elegir al que avanzó más o declarar empate.) - Si tienes tiempo, escribe tu propia simulación sin Turtle para comprobar tu solución.
⭐ Extensión del proyecto
- Mostrar el ganador en la ventana con
turtle.write()en lugar de la consola. - Validar que el color apostado exista en la lista y volver a preguntar si no.
- Jugar varias rondas y llevar la cuenta de aciertos.
6. 🌟 Proyecto extra: Pizarra Interactiva de Geometría
Situación
La profesora de Matemáticas necesita una pizarra digital sencilla para explicar el plano cartesiano: al hacer clic, se marca el punto y se muestran sus coordenadas.
Requisitos
- Ventana de 600 × 600 con los ejes X e Y dibujados por una tortuga auxiliar.
- Al hacer clic en la pantalla (
screen.onscreenclick), una tortuga va al punto, dibuja undoty escribe sus coordenadas conwrite. - Teclas:
"l": activa o desactiva el modo "unir puntos con líneas"."c": borra los puntos sin borrar los ejes. (Pista: por eso conviene usar dos instancias distintas.)"1","2","3": cambian el color del marcador.
- Muestra en la consola el cuadrante del último punto (I, II, III, IV o sobre un eje).
Decisiones que debes tomar
onscreenclickpasa dos argumentos a tu función. ¿Cuáles?- ¿Dónde guardas si el modo "unir puntos" está activo? Justifica tu elección.
Reflexión
¿En qué se parecen onkey y onscreenclick? ¿Por qué ambos son funciones de orden superior?
7. 🏆 Proyecto integrador del Día 19: la Feria de Carreras del Colegio
Proyecto integrador creado para esta adaptación. Integra eventos, funciones de orden superior, múltiples instancias, coordenadas, clases propias (Días 16 y 17) y validación de datos.
Situación problema
Para la feria institucional, el curso organizará un puesto de carreras virtuales. Cada jugador empieza con 100 puntos y apuesta en cada ronda. El puesto debe ser justo y fácil de configurar.
Pregunta orientadora
¿Cómo usar múltiples instancias con estado propio para construir un juego justo, configurable y verificable?
Requerimientos
- Una clase
Corredorque contenga una tortuga (atributo) y guarde su nombre, color y número de victorias. - Una clase
Carreraque reciba la lista de corredores, los ubique en la salida calculando las posiciones según el tamaño de la ventana y ejecute la carrera sin ventajas por el orden de la lista. - El jugador apuesta un color y una cantidad de puntos con
textinputynuminput. Valida que el color exista y que la apuesta no supere los puntos disponibles. - Si gana, recibe el doble de lo apostado; si pierde, lo pierde.
- Al final de cada ronda se muestra en la ventana el ganador y los puntos del jugador.
- El juego termina cuando el jugador se queda sin puntos o escribe
"salir". - Constantes en mayúsculas para el tamaño de la ventana, la meta y el paso máximo.
Etapas de desarrollo
- Una ronda sin puntos (el proyecto del día, reorganizado en clases).
- Corrección de la ventaja por orden y de los ganadores múltiples.
- Sistema de puntos y validaciones.
- Varias rondas y mensaje final.
Entregables
- El código en al menos dos archivos (
corredor.pyymain.py). - Una simulación sin ventana de 10 000 carreras que demuestre que tu carrera es justa (porcentaje de victorias de cada color).
- Capturas de una partida completa.
Casos de prueba
| Caso | Esperado |
|---|---|
| Apostar 150 con 100 puntos | Mensaje de error y nueva pregunta |
Apostar a "rosado" |
Mensaje "color no disponible" |
| Ganar una apuesta de 20 | Los puntos pasan de 100 a 120 |
| Quedarse en 0 puntos | Fin del juego |
Criterios técnicos
- Cambiar el número de corredores solo requiere modificar la lista de colores.
- Nunca se anuncian dos ganadores.
- En la simulación, ningún color supera el 18 % ni queda por debajo del 15,5 % con 6 corredores.
Posibles extensiones
Corredores con "habilidad" distinta (paso máximo diferente) y cálculo de cuotas de apuesta proporcionales a la probabilidad de ganar.
8. 🧩 Comprueba lo aprendido
Conceptuales
- ¿Qué es un detector de eventos? Da un ejemplo fuera de la programación.
- ¿Qué diferencia hay entre
move_forwardsymove_forwards()? - ¿Qué es el estado de un objeto? ¿Cambia con el tiempo?
Análisis de código
def saludar():
return "hola"
def ejecutar(f):
return f().upper()
print(ejecutar(saludar))¿Cuál es la función de orden superior? ¿Qué imprime?
Predicción
Ventana de 600 × 400. ¿En qué lugar aparece la tortuga después de goto(-300, 200)? ¿Y después de goto(0, -250)?
Depuración
screen.listen()
screen.onkey(turn_left(), "a")
def turn_left():
tim.left(10)Encuentra dos problemas.
Modificación
En la carrera, cambia el paso aleatorio a randint(1, 5). ¿La carrera dura más o menos? ¿Cambia quién tiene ventaja?
Creación
Crea un programa con tres tortugas controladas por teclas distintas (por ejemplo, W, I y la flecha arriba). La primera que llegue a y = 180 gana. Es un juego para tres personas en el mismo teclado.
9. 🤖 Programar con apoyo de IA
Hoy el curso insiste en dos ideas: leer la documentación y no quedarse con la solución mínima. Una IA puede ayudarte a ampliar tus proyectos, pero debes verificar lo que propone.
Actividad: auditar una carrera generada por IA.
- Pide a una IA el código de una carrera de tortugas con apuestas.
- Revisa con la documentación oficial (se abre en otra pestaña) cada método de Turtle que use. ¿Usa
onkey,textinputosetupcon los parámetros correctos? - Pregúntale si su carrera es justa. Luego compruébalo tú: escribe una simulación sin ventana como la de la sección 5. ¿La respuesta de la IA coincide con tus datos?
- Anota en tu cuaderno una afirmación de la IA que resultó falsa o incompleta y cómo lo descubriste.
10. 🛠️ Correcciones técnicas al material original
| Archivo | Afirmación o comportamiento del curso | Observación | Tratamiento |
|---|---|---|---|
140 |
calculator(2, 3, divide) da 0 "porque se redondea a un entero" |
En Python 3, 2 / 3 da 0.666…; solo // daría 0 (verificado) |
Nota técnica del Tema 1 |
144 |
La tortuga es un objeto de 40 × 40 píxeles | La forma "turtle" mide unos 18 × 24 y las formas "square"/"classic" unos 20 × 20 (revisado en el módulo) |
Nota técnica del proyecto |
144 |
La carrera termina con la primera tortuga que cruza | El for continúa y en ~10,5 % de las carreras se anuncian varios ganadores; el orden de la lista da ventaja a las primeras (simulación de 100 000 carreras) |
Sección 🧪 del proyecto |
144 |
Comparación winning_color == user_bet |
Falla si el usuario escribe con mayúsculas ("Red") |
Casos de prueba del proyecto |
141 |
Dos métodos clear |
screen.clear() además elimina los vínculos de teclas (documentación del módulo) |
Nota técnica del Tema 2 |
11. 📋 Matriz de trazabilidad
| Contenido original | Archivo de origen | Concepto desarrollado | Ejercicio original | Reto adicional | Proyecto relacionado |
|---|---|---|---|---|---|
| Objetivos del día | 139 |
Sección 0 | — | — | Secciones 2 y 5 |
Eventos, listen, onkey, orden superior, calculadora |
140 |
Tema 1 | Tortuga que avanza con la barra espaciadora | Retos 1–4 del Tema 1 | Secciones 6 y 7 |
| Etch-A-Sketch | 141 |
Tema 2 | W, S, A, D y C | Retos 1–4 del Tema 2 | Sección 6 |
| Estado e instancias | 142 |
Tema 3 | — | Retos 1–4 del Tema 3 | Secciones 5 y 7 |
setup, textinput, coordenadas, goto |
143 |
Tema 4 | Seis tortugas en la salida | Retos 1–4 del Tema 4 | Secciones 5, 6 y 7 |
Movimiento aleatorio, meta, pencolor |
144 |
Sección 5 | Carrera completa | Depuración de la justicia de la carrera | Sección 7 |
| Ampliar las soluciones | 145 |
Sección 0 | — | Extensiones del proyecto | Secciones 5 y 7 |
| (No existe en el curso original) | — | — | — | Pizarra Interactiva de Geometría | Sección 6 |
| (No existe en el curso original) | — | — | — | Feria de Carreras del Colegio | Sección 7 |
12. 📦 Evidencias de aprendizaje del Día 19
- Etch-A-Sketch funcionando, con captura de un dibujo propio.
- Carrera de tortugas con la corrección de los ganadores múltiples y una explicación escrita de por qué la versión original no era justa.
- Un diagrama del plano cartesiano de una ventana de 500 × 400 con 4 puntos ubicados y sus coordenadas.
- Proyecto extra (Pizarra de Geometría) o integrador (Feria de Carreras) con su simulación.
- Cuaderno de errores: la función pasada con paréntesis, el
listen()olvidado,"up"en minúscula,screen.clear()que borra los vínculos de teclas y la apuesta con mayúsculas.