
Tetris (y la Serpiente) es el «Hola Mundo» del desarrollo de juegos. Parecería difícil arruinarlo, pero el autor de este repositorio se esforzó mucho. Analizamos un proyecto que se presenta como «material educativo para principiantes». Sí, el código funciona, el proyecto está completo, incluso hay un video en YouTube. Pero en realidad enseñan malos hábitos.
1️⃣ Falta de punto de entrada
En
main.py el código está simplemente amontonado en la raíz del archivo. No hay ningún if __name__ == "__main__":. Si intentas importar algo de este archivo (aunque ¿para qué?), inmediatamente se inicializará Pygame y se abrirá una ventana.2️⃣ Problema con el espacio de nombres
En
game.py vemos algo hermoso: from blocks import *. Recuerda: cada vez que usas
import *, llenas el espacio de nombres con basura. ¿Qué clases llegaron? ¿De dónde? Nadie lo sabe.3️⃣ Clase orquesta
La clase
Game es un todólogo. Gestiona la lógica, cuenta puntos, carga sonidos, reproduce música y... dibuja bloques. La violación del SRP (Principio de Responsabilidad Única) es evidente. La lógica del juego no debería saber de la existencia de
pygame.mixer ni de cómo dibujar rectángulos.# En las entrañas de Game.__init__
self.rotate_sound = pygame.mixer.Sound("Sounds/rotate.ogg")
pygame.mixer.music.load("Sounds/music.ogg")¿Quieres cambiar la biblioteca de sonido? Buena suerte reescribiendo todo el núcleo del juego.
4️⃣ POO de la cabeza: Herencia para... nada
En
blocks.py vemos el error clásico: crear siete clases diferentes (LBlock, JBlock, etc.) que heredan de Block solo para escribir un diccionario con coordenadas en __init__.Esto es sobreingeniería clásica. Todas estas clases no tienen comportamiento único, solo datos diferentes.
Cómo debería ser: Una sola clase
Block que reciba el tipo de pieza o configuración al inicializarse. Datos separados, lógica separada.5️⃣ Clase Position — ¿para qué?
class Position:
def __init__(self, row, column):
self.row = row
self.column = columnCrear una clase entera para almacenar dos números enteros es redundante. En Python existen
namedtuple, dataclasses o, al final, simplemente tuplas (row, col).6️⃣ Números mágicos y código duro
if self.next_block.id == 3:
self.next_block.draw(screen, 255, 290)
elif self.next_block.id == 4:
self.next_block.draw(screen, 255, 280)Esto es una interfaz «chapucera» en estado puro. En lugar de calcular el centro del área de vista previa, el autor simplemente ajustó las coordenadas a IDs de bloques específicos. Añade un nuevo bloque y todo el diseño se desmoronará.
7️⃣ Manejo de puntuación de la era de los mamuts
En
game.py vemos esto:def update_score(self, lines_cleared, move_down_points):
if lines_cleared == 1:
self.score += 100
elif lines_cleared == 2:
self.score += 300
# ... y así sucesivamenteCómo debería ser: Un simple diccionario o lista de coeficientes haría este código en una línea. Las cadenas de
elif para correspondencias simples son una señal clara de que el autor no sabe usar estructuras de datos.🧑⚖️ Veredicto:
Como proyecto de aprendizaje, sirve. Si aprendes de tutoriales como este, recuerda: su objetivo es mostrar un resultado en 20 minutos de video, no enseñarte a escribir código decente. No lleves estos patrones a producción.
#criticando_código
Comentarios
0Aún no hay comentarios.
Inicia sesión para participar en la conversación.