Este tutorial adapta pedagógicamente el Día 23. 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 el material disponible: la carpeta del Día 23 contiene los archivos
170,172y175a180. No están los archivos171,173y174(la numeración salta). Por los títulos de las soluciones, deberían corresponder a la descarga del código inicial y a los pasos 1 y 2. Este tutorial no inventa su contenido: lo que se dice del código inicial sale de la lección172.
Nota sobre las verificaciones: los cálculos de probabilidad y de colisiones se hicieron con Python 3.14. 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: el proyecto final y cómo abordarlo
- El código inicial
- Paso 3: el jugador
- Paso 4: los autos y la probabilidad
- Paso 5: la colisión con un auto
- Paso 6: cruzar la meta y subir de nivel
- Paso 7: el marcador y el GAME OVER
- 🚀 Proyecto del día: Turtle Crossing completo
- 🌟 Proyecto extra: el Guardián del Páramo
- 🏆 Proyecto integrador del bloque Turtle (Días 18 a 23): Mi Propio Juego Arcade
- 🧩 Comprueba lo aprendido
- 🤖 Programar con apoyo de IA
- 🛠️ Correcciones técnicas al material original
- 📋 Matriz de trazabilidad
- 📦 Evidencias de aprendizaje del Día 23
0. Antes de empezar: el proyecto final y cómo abordarlo
(Fuentes: 170 - Day 23 Goals- what you will make by the end of the day.md, 180 - This course is not about typing out code.md)
Hoy construiremos el segundo proyecto final del curso, parecido al juego Crossy Road: una tortuga debe cruzar una autopista de varios carriles llena de autos.
Reglas del juego:
- El jugador controla una tortuga que solo avanza hacia arriba.
- Aparecen autos al azar que cruzan la pantalla de derecha a izquierda.
- Al llegar al otro lado, la tortuga vuelve al inicio y los autos aceleran (siguiente nivel).
- Si la tortuga choca con un auto: GAME OVER.
Pone a prueba todo lo aprendido: clases, herencia, objetos, el sistema de coordenadas y el "motor de juego" de Turtle (tracer, update, bucle).
Mensaje de cierre del curso: "Este no es un curso de escribir código, es un curso de pensar". La parte difícil no es teclear: muchas veces son 10 líneas que cualquiera copia al ver la solución. Lo difícil es dividir el problema en partes, diseñar la lógica y el diagrama de flujo. Por eso el curso pide tantas veces pausar el video e intentarlo. Aprovecha cada oportunidad de pensar por tu cuenta.
💡 Recomendación para la clase: intenten cada paso antes de mirar la solución. Si se quedan atascados más de 20 minutos, miren solo la parte de la solución que necesitan y vuelvan a intentarlo.
Prerequisito general: todo el bloque de Turtle, del Día 18 al 22: herencia de
Turtle,shapesize, eventos,traceryupdate, coordenadas, marcador conclearywrite, yrandom.
1. El código inicial
(Fuente: 172 - How to use the Starter Code.md)
El curso entrega un proyecto inicial con cuatro archivos. Hay que descomprimirlo, abrir la carpeta en PyCharm y configurar un intérprete de Python 3.8 o superior.
| Archivo | Contenido inicial | Responsabilidad |
|---|---|---|
main.py |
Pantalla de 600 × 600, tracer(0) y un bucle while que actualiza la pantalla cada 0,1 s. Importa las otras tres clases |
Coordinar el juego |
player.py |
Clase Player vacía con pass y constantes: posición inicial, distancia de movimiento y línea de meta (Y = 280) |
La tortuga del jugador |
car_manager.py |
Clase CarManager vacía con pass y constantes: colores, distancia inicial de movimiento (5) e incremento por nivel (10) |
Crear y mover los autos |
scoreboard.py |
Clase Scoreboard vacía con pass y la constante FONT |
Mostrar el nivel y el GAME OVER |
¿Por qué pass? Python no acepta clases ni funciones vacías. pass las deja "vacías pero válidas" para que el editor no marque errores. Se borra al empezar a escribir la clase.
Descomposición del problema del curso:
- Mover la tortuga con una tecla.
- Crear y mover los autos.
- Detectar la colisión con un auto.
- Detectar cuándo la tortuga llega al otro lado.
- Crear el marcador con el nivel y el GAME OVER.
Los archivos de solución del curso se llaman "Paso 3" a "Paso 7" porque los pasos 1 y 2 corresponden a las lecciones que no están en la carpeta (probablemente, descargar el código y elegir la dificultad).
🔍 Antes de programar (actividad de diseño)
Antes de abrir cualquier archivo, responde en papel:
- Entradas: ¿qué hace el usuario?
- Objetos: ¿qué objetos hay en pantalla? ¿Cuántos de cada uno?
- Estado: ¿qué datos cambian durante el juego (nivel, velocidad, posiciones)?
- Condiciones de fin: ¿cuándo termina el juego?
- Dibuja la pantalla con las coordenadas de: la salida de la tortuga, la meta, la zona donde aparecen los autos y el marcador.
2. Paso 3: el jugador
(Fuente: 175 - Solution to Step 3 - Create the Player Behaviour.md)
📝 Ejercicio original del curso
Enunciado: la tortuga aparece abajo en el centro, mirando al Norte, y avanza una distancia fija cada vez que se pulsa ↑.
Solución del curso (en palabras):
class Player(Turtle):consuper().__init__().shape("turtle"),penup(),goto(STARTING_POSITION)(una tupla) ysetheading(90).- Método
go_up():self.forward(MOVE_DISTANCE). Como la tortuga mira al Norte, avanzar es subir. - En
main.py:screen.listen()yscreen.onkey(player.go_up, "Up"), sin paréntesis (Día 19).
Buena práctica que destaca el curso: usar la constante MOVE_DISTANCE permite cambiar el juego desde la parte superior del archivo, sin buscar dentro del código.
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1: agrega la tecla ↓ para retroceder, pero sin salir por debajo de la posición inicial.
- 🟡 Reto 2: permite moverse a los lados con ← y →, sin salir de la ventana.
- 🟠 Reto 3: cuenta cuántos pasos da el jugador en total y muéstralo al terminar el juego.
- 🔴 Reto 4: ¿qué pasa si el jugador mantiene presionada ↑? Recuerda lo aprendido sobre
onkeyyonkeypressen el Día 22 y decide cuál es más justo para este juego.
3. Paso 4: los autos y la probabilidad
(Fuente: 176 - Solution to Step 4 - Create the Car Behaviour.md)
📝 Ejercicio original del curso
Enunciado: crear autos de 20 × 40 píxeles, de colores aleatorios, que aparezcan en el borde derecho a una altura aleatoria y se muevan hacia la izquierda a velocidad constante.
🔍 Antes de programar
- ¿
CarManageres un auto o maneja muchos autos? ¿Debe heredar deTurtle? - ¿Cómo estiras un cuadrado de 20 × 20 para que mida 40 de largo?
- ¿Entre qué valores de Y deben aparecer los autos para dejar espacio libre a la salida y a la llegada?
Solución del curso, paso a paso
CarManagerno hereda deTurtle: tiene una listaself.all_cars = [](composición, como la serpiente del Día 21).create_car()crea un auto nuevo:Turtle("square"),penup()ycolor(random.choice(COLORS)).shapesize(stretch_wid=1, stretch_len=2)→ 20 de alto × 40 de largo.random_y = random.randint(-250, 250): deja espacio libre arriba y abajo.goto(300, random_y)yself.all_cars.append(new_car).
move_cars()recorre la lista y hacecar.backward(STARTING_MOVE_DISTANCE). Los autos miran al Este, así que retroceder los lleva a la izquierda.- En el bucle del juego:
car_manager.create_car()ycar_manager.move_cars().
Los errores que el propio curso encuentra:
- El método se llamaba
create_cars(plural), pero crea un solo auto: se renombra acreate_car. Los nombres deben decir la verdad. - Primero estiró el ancho en lugar del largo y aparecieron "formas raras". Se corrigió a
stretch_wid=1, stretch_len=2. - Demasiados autos: se creaba uno cada 0,1 s y era imposible cruzar.
📖 La solución de la probabilidad: "lanzar un dado"
def create_car(self):
random_chance = random.randint(1, 6)
if random_chance == 1:
# ... crear el auto ...En cada vuelta del bucle se "lanza un dado" y solo se crea un auto si sale 1.
🛠️ Nota técnica: en la lección se dice que esto "garantiza" un auto cada seis vueltas y luego se aclara que hay probabilidad de por medio. La forma precisa de decirlo es: la probabilidad de crear un auto en cada vuelta es 1/6, así que en promedio aparece un auto cada 6 vueltas (unos 0,6 segundos). Puede haber dos autos seguidos o 20 vueltas sin ninguno.
Frase del curso para recordar: "Hay un millón de formas diferentes de resolver este problema. Mientras funcione, la forma que elijas será la mejor."
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1: cambia el "dado" a 1 entre 3 y a 1 entre 10. ¿Cómo cambia la dificultad?
- 🟡 Reto 2: en lugar de alturas aleatorias libres, crea carriles fijos (por ejemplo, cada 40 píxeles) y elige uno al azar.
- 🟠 Reto 3: haz que la probabilidad de aparición aumente con el nivel.
- 🔴 Reto 4: simula sin ventana 10 000 vueltas del bucle con
random.randint(1, 6)y cuenta cuántos autos se crean. ¿Se acerca a 10 000 / 6? ¿Cuál fue la racha más larga sin autos?
4. Paso 5: la colisión con un auto
(Fuente: 177 - Solution to Step 5 - Detect when the Turtle collides with a Car -squish-.md)
📝 Ejercicio original del curso
Enunciado: detener el juego cuando la tortuga choca con un auto.
Solución del curso:
for car in car_manager.all_cars:
if car.distance(player) < 20:
game_is_on = FalseAdemás, screen.exitonclick() al final para que la ventana no se cierre y se pueda ver el choque.
🛠️ Nota técnica (análisis de esta adaptación): es el mismo problema del Día 22.
distance < 20es un círculo de radio 20 alrededor del centro del auto, pero el auto es un rectángulo de 40 × 20. Si la tortuga toca la punta delantera o trasera del auto, la distancia entre centros puede ser de 20 a 30 píxeles: la tortuga parece chocar, pero el juego no lo detecta. Además, la tortuga avanza de a varios píxeles por pulsación. Una detección más fiel compara los ejes por separado: la diferencia en X menor que la mitad del largo del auto más la mitad de la tortuga, y lo mismo en Y.
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1: imprime en la consola la distancia exacta en el momento del choque. Juega 5 partidas y anota los valores.
- 🟡 Reto 2: implementa la detección rectangular como método
Player.choca_con(car). - 🟠 Reto 3: agrega 3 vidas: al chocar, la tortuga vuelve al inicio y pierde una vida.
- 🔴 Reto 4: después de chocar, la tortuga es invulnerable durante 2 segundos y parpadea (alterna
showturtleyhideturtle). ¿Cómo mides el tiempo dentro del bucle?
5. Paso 6: cruzar la meta y subir de nivel
(Fuente: 178 - Solution to Step 6 - Detect when the Player has reached the other side.md)
📝 Ejercicio original del curso
Enunciado: cuando la tortuga llega arriba (Y > 280), vuelve al inicio y los autos se mueven más rápido.
Solución del curso:
- En
Player, un método que devuelve un booleano:
def is_at_finish_line(self):
if self.ycor() > FINISH_LINE_Y:
return True
else:
return False- En
Player, el métodogo_to_start(). El curso nota quegoto(STARTING_POSITION)aparece dos veces (en__init__y aquí) y lo reemplaza en__init__porself.go_to_start(): evitar código repetido. - En
CarManager: un atributoself.car_speed = STARTING_MOVE_DISTANCE, que ahora se usa enmove_cars(), y un métodolevel_up()que haceself.car_speed += MOVE_INCREMENT. - En
main.py: siplayer.is_at_finish_line(), entoncesplayer.go_to_start()ycar_manager.level_up().
Mejora de legibilidad (alternativa válida): una comparación ya es un booleano, así que
is_at_finish_linepuede escribirse en una línea:return self.ycor() > FINISH_LINE_Y. Las dos versiones funcionan igual; la segunda es más corta y la usan mucho los programadores con experiencia.
¿Por qué la velocidad es un atributo y no la constante? La constante es el valor inicial. El atributo es el estado actual, que cambia durante el juego (Día 19).
Retos adicionales (creados para esta adaptación)
- 🟢 Reto 1: cambia
MOVE_INCREMENTa 3. Juega hasta el nivel 5. ¿Es mejor la progresión? - 🟡 Reto 2: en lugar de sumar, multiplica la velocidad por 1,3 en cada nivel. Calcula en una tabla la velocidad de los niveles 1 a 8 con los dos métodos.
- 🟠 Reto 3: al subir de nivel, elimina los autos que ya salieron de la pantalla.
- 🔴 Reto 4: diseña una fórmula de dificultad que combine velocidad y frecuencia de aparición, y justifica por qué el juego sigue siendo posible de ganar en el nivel 10.
6. Paso 7: el marcador y el GAME OVER
(Fuente: 179 - Solution to Step 7 - Add the Scoreboard and Game Over sequence.md)
📝 Ejercicio original del curso
Enunciado: mostrar el nivel en la esquina superior izquierda y "GAME OVER" en el centro al chocar.
Solución del curso (mismo patrón de los Días 21 y 22):
Scoreboard(Turtle)conself.level = 1,hideturtle()ypenup().update_scoreboard():clear(),goto(-280, 250)aproximadamente (el curso ajustó la altura probando) ywrite(f"Level: {self.level}", align="left", font=FONT).increase_level(): suma 1 y llamaupdate_scoreboard().game_over():goto(0, 0)y escribe "GAME OVER" centrado sin borrar, para que se siga viendo el nivel alcanzado.
Recordatorio del orden: penup → goto → write. Si mueves la tortuga después de escribir, el texto no se mueve.
Invitación del curso: si este proyecto te costó, vuelve a construir la serpiente y el Turtle Crossing desde cero, mirando solo cómo funciona el juego. "A partir de aquí, las cosas se volverán más complejas."
7. 🚀 Proyecto del día: Turtle Crossing completo
(Fuentes: 170 a 179)
Problema
Integrar los pasos 3 a 7 en un juego completo y probado.
Contexto
Es tu proyecto final del bloque de Turtle. Al terminarlo, habrás construido tres juegos (Serpiente, Pong y Turtle Crossing) con la misma estructura: clases que heredan de Turtle, un administrador de objetos y un bucle de juego.
Requisitos funcionales
- Tortuga que avanza con ↑.
- Autos aleatorios de colores que cruzan de derecha a izquierda.
- GAME OVER al chocar.
- Al cruzar: vuelve al inicio, los autos aceleran y el nivel sube.
- El nivel siempre visible.
Restricciones técnicas
Usar el código inicial con sus cuatro archivos; Player y Scoreboard heredan de Turtle; CarManager usa composición.
Planificación: diagrama de flujo del bucle del juego
┌─► update() y sleep(0.1)
│ │
│ ¿sale 1 en el dado? ── sí ──► crear auto
│ │
│ mover todos los autos
│ │
│ ¿algún auto choca con la tortuga? ── sí ──► GAME OVER ──► fin
│ │ no
│ ¿la tortuga cruzó la meta? ── sí ──► volver al inicio, acelerar autos, subir nivel
│ │
└────────┘Este es el "diagrama de flujo" del que habla el curso en el mensaje de cierre: piensa la lógica antes de escribirla.
Pruebas
| Caso | Resultado esperado |
|---|---|
| Iniciar el juego | Tortuga abajo mirando al Norte; nivel 1 visible |
| Pulsar ↑ varias veces sin autos cerca | Avanza hasta la meta, vuelve al inicio y el nivel pasa a 2 |
| Nivel 2 | Los autos son visiblemente más rápidos |
| Esperar quieto a que pase un auto | GAME OVER en el centro; el nivel sigue visible |
| Tocar la punta de un auto | Anota si se detecta (nota técnica del Tema 4) |
🧪 Prueba y depuración: el juego que se vuelve lento
En la versión del curso, los autos que salen por la izquierda nunca se eliminan de all_cars. Hagamos la cuenta:
- En cada vuelta, la probabilidad de crear un auto es 1/6.
- Si alguien juega 5 minutos, a 10 vueltas por segundo, son unas 3000 vueltas → unos 500 autos en la lista.
- En cada vuelta,
move_cars()mueve los 500, aunque casi todos ya estén fuera de la pantalla y nadie los vea. Y el choque se revisa con los 500.
Actividad:
- Agrega un
print(len(car_manager.all_cars))al bucle y juega 2 minutos. Anota cómo crece el número. - Corrige el problema: cuando un auto tenga
xcor() < -320, ocúltalo conhideturtle()y sácalo de la lista. *(Cuidado: no elimines elementos de una lista mientras la recorres confor; recorre una copia conall_cars[:], el *slicing* del Día 21.)* - Vuelve a medir y compara.
⭐ Extensión del proyecto
- Autos de distintos tamaños (motos, buses) con
stretch_lenaleatorio. - Carriles que van en sentidos opuestos.
- Guardar el nivel récord (¡lo aprenderemos mañana, Día 24!).
- Personalizar colores y formas, y compartir una captura, como propone el curso.
8. 🌟 Proyecto extra: el Guardián del Páramo
Situación
Los páramos colombianos son "fábricas de agua". En este juego, un frailejón (el jugador) se mueve de izquierda a derecha en la parte baja de la pantalla para atrapar gotas de agua que caen, y debe esquivar la basura que cae también.
Requisitos
Frailejon(Turtle): se mueve con ← y → sin salir de la ventana.- Una superclase
Objeto(Turtle)y dos subclases:Gota(Objeto)yBasura(Objeto), con la probabilidad de aparición como constante de cada clase. - Un
CieloManager(composición) que crea objetos en la parte superior con un "dado", los mueve hacia abajo y elimina los que salen de la pantalla. - Atrapar una gota: +1 litro. Tocar basura: −1 vida (3 vidas).
- Cada 10 litros, sube el nivel y los objetos caen más rápido.
- Marcador con litros, vidas y nivel. GAME OVER con el total de litros "protegidos".
Decisiones que debes tomar
- ¿Qué parte del Turtle Crossing puedes reutilizar casi sin cambios?
- ¿Cómo haces que la dificultad crezca de forma justa?
Reflexión
Escribe dos líneas sobre qué aprendiste del páramo investigando para tu juego.
9. 🏆 Proyecto integrador del bloque Turtle (Días 18 a 23): Mi Propio Juego Arcade
Proyecto integrador creado para esta adaptación. Cierra el bloque de Turtle: dibujo y documentación (Día 18), eventos e instancias (Día 19), animación (Día 20), herencia y slicing (Día 21), rebotes (Día 22) y diseño de un proyecto completo (Día 23).
Situación problema
Para la feria de tecnología del colegio, cada estudiante presentará un juego arcade original, diseñado y programado desde cero con Turtle.
Pregunta orientadora
¿Cómo diseñar un juego propio aplicando las mismas estructuras de la serpiente, Pong y Turtle Crossing, pero con una idea nueva?
Requerimientos
- Documento de diseño (antes de programar, máximo una página): idea, reglas, controles, condiciones de victoria y derrota, y un boceto de la pantalla con coordenadas.
- Al menos 3 clases propias, de las cuales al menos 2 heredan de
Turtley 1 usa composición (un administrador de objetos). - Al menos una jerarquía de herencia de dos niveles (por ejemplo,
Enemigo→EnemigoRapido) con un método sobrescrito que usesuper(). - Bucle de juego con
tracer(0),update()ysleep. - Control por teclado con funciones pasadas como argumentos.
- Al menos un rebote o un cambio de dirección por colisión.
- Niveles de dificultad y objetos que se eliminan al salir de la pantalla.
- Marcador con
clear()y GAME OVER. - Constantes en mayúsculas para todos los valores configurables.
Etapas de desarrollo
| Etapa | Entregable parcial |
|---|---|
| 1. Diseño | Documento de diseño revisado por un compañero |
| 2. Descomposición | Lista de pasos (como los 7 de la serpiente o los 8 de Pong) |
| 3. Versión mínima jugable | Jugador + un tipo de objeto + fin del juego |
| 4. Versión completa | Todos los requerimientos |
| 5. Pruebas | Tabla de casos de prueba |
| 6. Presentación | Demostración en la feria |
Entregables
- Código completo en varios archivos.
- Documento de diseño y diagrama de clases.
- Tabla de al menos 10 casos de prueba con los resultados.
- Registro de errores: al menos 5 errores que encontraste y cómo los resolviste.
- Video corto o capturas de una partida.
Casos de prueba mínimos
| Caso | Esperado |
|---|---|
| Jugar 3 minutos | El juego no se vuelve más lento (los objetos se eliminan) |
| Tocar el borde de un objeto | La colisión se detecta de forma coherente con lo que se ve |
| Perder | Aparece GAME OVER y el puntaje sigue visible |
| Cambiar una constante de dificultad | El juego cambia sin modificar ningún método |
Criterios técnicos
main.pysolo coordina: crea objetos, vincula teclas y ejecuta el bucle.- No hay código copiado y pegado entre clases.
- Otro estudiante puede entender el juego leyendo el documento de diseño y los docstrings.
Posibles extensiones
Sonido, pantalla de inicio, dos jugadores o un récord guardado en archivo (Día 24).
10. 🧩 Comprueba lo aprendido
Conceptuales
- ¿Por qué
CarManagerno hereda deTurtleyPlayersí? - ¿Qué diferencia hay entre la constante
STARTING_MOVE_DISTANCEy el atributocar_speed? - ¿Qué significa que "la probabilidad de crear un auto es 1/6"?
Análisis de código
def is_at_finish_line(self):
return self.ycor() > FINISH_LINE_Y¿Qué tipo de dato devuelve? ¿Por qué no necesita if?
Predicción
car_speed empieza en 5 y aumenta en 10 por nivel. ¿Cuál es la velocidad en el nivel 4? ¿Y si en lugar de sumar 10 se multiplicara por 1,5?
Depuración
def move_cars(self):
for car in self.all_cars:
car.backward(STARTING_MOVE_DISTANCE)
def level_up(self):
self.car_speed += MOVE_INCREMENTEl jugador sube de nivel, pero los autos no aceleran. ¿Por qué?
Modificación
Haz que los autos aparezcan por la izquierda y se muevan hacia la derecha. ¿Qué tres cosas cambias?
Creación
Escribe CarManager.cars_on_screen() que devuelva cuántos autos están dentro de la ventana (entre −300 y 300 en X).
11. 🤖 Programar con apoyo de IA
El curso insiste en que pensar es lo importante, no teclear. Si una IA escribe el código, ¿quién hizo el pensamiento?
Actividad: la IA como revisora, no como autora.
- Construye tú el juego completo.
- Después, pega tu
car_manager.pyen una IA y pídele que revise si hay problemas de rendimiento. ¿Detecta que los autos nunca se eliminan? - Pídele que revise tu detección de colisiones. ¿Menciona el problema del círculo frente al rectángulo?
- Compara sus sugerencias con lo que descubriste en la sección 🧪. ¿Encontró algo que tú no? ¿Dijo algo incorrecto?
- Escribe en tu registro qué cambios aceptaste y por qué.
12. 🛠️ Correcciones técnicas al material original
| Archivo | Afirmación o comportamiento del curso | Observación | Tratamiento |
|---|---|---|---|
| (carpeta) | Lecciones 171, 173 y 174 |
No están en la carpeta suministrada; no se inventó su contenido | Nota inicial y Tema 1 |
176 |
El dado "garantiza" un auto cada seis vueltas | Es una probabilidad de 1/6 por vuelta: en promedio, uno cada 6 | Nota técnica del Tema 3 |
176 |
Los autos se crean y se mueven | Nunca se eliminan: la lista crece sin límite (≈500 autos en 5 minutos) y el juego puede volverse lento | Sección 🧪 del proyecto |
177 |
car.distance(player) < 20 detecta el choque |
Círculo frente a rectángulo de 40 × 20: los choques con las puntas del auto pueden no detectarse | Nota técnica del Tema 4 |
178 |
is_at_finish_line con if/else |
Funciona; return self.ycor() > FINISH_LINE_Y es equivalente y más conciso |
Tema 5 |
13. 📋 Matriz de trazabilidad
| Contenido original | Archivo de origen | Concepto desarrollado | Ejercicio original | Reto adicional | Proyecto relacionado |
|---|---|---|---|---|---|
| Objetivos, reglas del juego | 170 |
Sección 0 | — | — | Sección 7 |
Código inicial, pass, constantes, Python 3.8+ |
172 |
Tema 1 | Abrir y revisar el proyecto | Actividad de diseño | Secciones 7 y 9 |
| (Lecciones 171, 173 y 174: no están en la carpeta) | — | — | — | — | — |
Player: forma, rumbo, go_up |
175 |
Tema 2 | Paso 3 | Retos 1–4 del Tema 2 | Secciones 7 y 8 |
CarManager, shapesize, probabilidad 1/6 |
176 |
Tema 3 | Paso 4 | Retos 1–4 del Tema 3 | Secciones 7, 8 y 9 |
Colisión con distance |
177 |
Tema 4 | Paso 5 | Retos 1–4 del Tema 4 | Secciones 7 y 9 |
Meta, go_to_start, level_up |
178 |
Tema 5 | Paso 6 | Retos 1–4 del Tema 5 | Secciones 7, 8 y 9 |
Scoreboard: nivel y GAME OVER |
179 |
Tema 6 | Paso 7 | — | Secciones 7, 8 y 9 |
| El curso trata de pensar, no de teclear | 180 |
Sección 0 | — | Diagrama de flujo | Secciones 7 y 11 |
| (No existe en el curso original) | — | — | — | Guardián del Páramo | Sección 8 |
| (No existe en el curso original) | — | — | — | Mi Propio Juego Arcade | Sección 9 |
14. 📦 Evidencias de aprendizaje del Día 23
- La actividad de diseño en papel (antes de programar) y el diagrama de flujo del bucle.
- Turtle Crossing completo, con captura del GAME OVER mostrando tu nivel máximo.
- La medición de
len(all_cars)antes y después de corregir la eliminación de autos. - Proyecto extra (Guardián del Páramo) o integrador (Mi Propio Juego Arcade) con su documento de diseño.
- Cuaderno de errores: estiramiento invertido en
shapesize, demasiados autos, nombres de métodos que no dicen la verdad (create_cars), el atributo de velocidad que no se usa enmove_carsy la lista que crece sin límite.