
Tetris (e a Cobrinha) é o "Hello World" do mundo do desenvolvimento de jogos. Parece difícil estragá-lo, mas o autor deste repositório se esforçou muito. Vamos analisar um projeto que é apresentado como "material educacional para iniciantes". Sim, o código funciona, o projeto está completo, até tem vídeo no YouTube. Mas na prática, ensina maus hábitos.
1️⃣ Ausência de ponto de entrada
Em
main.py, o código está simplesmente jogado na raiz do arquivo. Nada de if __name__ == "__main__":. Se você tentar importar algo deste arquivo (embora por que faria isso?), o Pygame será inicializado imediatamente e uma janela será aberta.2️⃣ Problema com espaço de nomes
Em
game.py, vemos algo lindo: from blocks import *. Lembre-se: toda vez que você usa
import *, você polui o espaço de nomes com lixo. Quais classes foram importadas? De onde? Ninguém sabe.3️⃣ Classe orquestra
A classe
Game é faz-tudo. Ela gerencia a lógica, calcula pontos, carrega sons, toca música e... desenha blocos. Violação do SRP (Princípio da Responsabilidade Única) evidente. A lógica do jogo não deveria saber da existência de
pygame.mixer ou de como desenhar retângulos.# Nas entranhas de Game.__init__
self.rotate_sound = pygame.mixer.Sound("Sounds/rotate.ogg")
pygame.mixer.music.load("Sounds/music.ogg")Quer trocar a biblioteca de som? Boa sorte reescrevendo todo o núcleo do jogo.
4️⃣ OOP de cabeça: Herança por... nada
Em
blocks.py, vemos o erro clássico: criar sete classes diferentes (LBlock, JBlock, etc.) que herdam de Block apenas para colocar um dicionário com coordenadas no __init__.Isso é overengineering clássico. Todas essas classes não têm comportamento único, apenas dados diferentes.
Como deveria ser: Uma única classe
Block que recebe o tipo de peça ou configuração na inicialização. Dados separados, lógica separada.5️⃣ Classe Position — para quê?
class Position:
def __init__(self, row, column):
self.row = row
self.column = columnCriar uma classe inteira para armazenar dois inteiros é redundante. Em Python, existem
namedtuple, dataclasses ou, finalmente, simples tuplas (row, col).6️⃣ Números mágicos e hardcode
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)Isso é UI "gambiarra" pura. Em vez de calcular o centro da área de pré-visualização, o autor simplesmente ajustou as coordenadas para IDs específicos de blocos. Adicione um novo bloco — e todo o layout quebra.
7️⃣ Processamento de pontuação da era dos mamutes
Em
game.py, vemos isso:def update_score(self, lines_cleared, move_down_points):
if lines_cleared == 1:
self.score += 100
elif lines_cleared == 2:
self.score += 300
# ... e assim por dianteComo deveria ser: Um simples dicionário ou lista de coeficientes faria esse código em uma linha. Cadeias de
elif para correspondências simples são um sinal claro de que o autor não sabe usar estruturas de dados.🧑⚖️ Veredito:
Como projeto de aprendizado, serve. Se você está aprendendo com tutoriais assim, lembre-se: o objetivo deles é mostrar um resultado em 20 minutos de vídeo, não ensinar a escrever código decente. Não leve esses padrões para produção.
#criticando_codigo
Comentários
0Ainda não há comentários.
Entre para participar da conversa.