Como fazer seu primeiro jogo de Pong com Python

Publicado em: 24/02/2026
Tempo de leitura: 11 minutos

Aprender como fazer seu primeiro jogo de Pong com Python é um dos marcos mais emocionantes para qualquer iniciante na programação. O Pong não é apenas um clássico dos fliperamas; ele é a base para entender como funciona a lógica de colisão, movimentação de objetos na tela e o ciclo de vida de um software interativo. Se você já domina o básico de variáveis em Python, este projeto servirá como uma ponte perfeita para o mundo do desenvolvimento de games.

Python é uma linguagem extremamente versátil e amigável para esse propósito. Para criar nosso Pong, utilizaremos o módulo Turtle, que já vem instalado por padrão no Python. Essa biblioteca permite desenhar formas e criar animações simples sem a necessidade de instalar pacotes complexos de terceiros inicialmente. Ao longo deste guia, vamos transformar linhas de código em um duelo competitivo entre dois jogadores, explorando desde a configuração da janela até a implementação de um placar dinâmico.

Por que começar pelo Pong em Python?

O desenvolvimento de jogos é uma excelente maneira de aplicar a lógica de programação com Python na prática. Quando você programa um jogo, lida com condições em tempo real. Se a bola tocar na parede, ela deve mudar de direção. Se o jogador não alcançar a bola, o adversário ganha um ponto. Esses cenários ensinam como estruturar o pensamento algorítmico de forma visual e imediata.

Além disso, ao trabalhar com gráficos simples, você não se perde em detalhes estéticos complexos e foca no que realmente importa: o motor do jogo. Este projeto ajudará você a entender como um algoritmo na programação pode controlar a física básica de um objeto virtual. É um excelente ponto de partida antes de avançar para bibliotecas mais robustas, como o Pygame.

Preparando o Ambiente de Desenvolvimento

Antes de começarmos a digitar o código, certifique-se de que você tem o Python instalado corretamente em sua máquina. Se você ainda tem dúvidas sobre esse processo, confira nosso guia sobre como instalar Python no Windows, Mac ou Linux. Para este tutorial, qualquer editor de texto simples serve, mas recomendamos o VS Code ou o PyCharm pela facilidade de depuração.

Não precisamos instalar nenhuma biblioteca externa via terminal. O módulo Turtle é uma “built-in library”, o que significa que ele faz parte do núcleo do Python. Isso evita erros de instalação comuns que iniciantes costumam enfrentar. Com o ambiente pronto, o primeiro passo é criar a janela onde o jogo acontecerá.

1. Criando a Janela do Jogo

A janela é o nosso “palco”. Precisamos definir suas dimensões, a cor de fundo e um título para que o usuário saiba o que está jogando. Usaremos o comando tracer(0) para desativar as atualizações automáticas da tela, o que torna a animação muito mais suave e evita o efeito de “piscar”.

Python
import turtle

# Configuração da janela
janela = turtle.Screen()
janela.title("Pong Clássico - Tutorial Academify")
janela.bgcolor("black")
janela.setup(width=800, height=600)
janela.tracer(0)

2. Criando os Jogadores e a Bola

Em um jogo de Pong, temos três objetos principais: a raquete da esquerda, a raquete da direita e a bola. Todos esses objetos serão criados usando a classe Turtle(). Vamos definir suas cores, formatos e as coordenadas iniciais. No Python, a origem (0, 0) fica exatamente no centro da tela.

Python
# Raquete Esquerda (Paddle A)
paddle_a = turtle.Turtle()
paddle_a.speed(0)
paddle_a.shape("square")
paddle_a.color("white")
paddle_a.shapesize(stretch_wid=5, stretch_len=1)
paddle_a.penup()
paddle_a.goto(-350, 0)

# Bola
bola = turtle.Turtle()
bola.speed(0)
bola.shape("square")
bola.color("white")
bola.penup()
bola.goto(0, 0)
bola.dx = 0.2  # Movimento em X
bola.dy = 0.2  # Movimento em Y

3. Implementando a Movimentação das Raquetes

Para o jogo ser interativo, precisamos vincular teclas do teclado a funções no Python. Utilizaremos o método listen() da janela para que o programa fique atento aos comandos do usuário. Definiremos funções para subir e descer cada raquete, garantindo que o jogo seja para dois jogadores locais.

Python
def paddle_a_up():
    y = paddle_a.ycor()
    y += 20
    paddle_a.sety(y)

def paddle_a_down():
    y = paddle_a.ycor()
    y -= 20
    paddle_a.sety(y)

# Escutando o teclado
janela.listen()
janela.onkeypress(paddle_a_up, "w")
janela.onkeypress(paddle_a_down, "s")

A Lógica por trás do Jogo Pong

O coração de qualquer jogo é o seu “Game Loop”. É um loop infinito (geralmente um while True) que executa continuamente enquanto o jogo está aberto. Dentro desse loop, fazemos quatro coisas essenciais: atualizamos a tela, movemos a bola, verificamos colisões com as bordas e checamos se houve um ponto.

É importante notar que a indentação no Python é crucial aqui. Se o código do loop não estiver corretamente alinhado, as colisões podem não ser processadas a tempo ou o jogo pode simplesmente travar. De acordo com a documentação oficial da Python Software Foundation, o uso correto do método update() dentro do loop é a melhor prática para performances básicas em Turtle.

4. Lidando com Bordas e Pontuação

Quando a bola atinge o topo (y = 300) ou a base (y = -300) da janela, ela deve inverter sua direção vertical. Se ela ultrapassar o limite lateral (x > 390 ou x < -390), significa que alguém marcou um ponto. Nesse caso, a bola deve voltar para o centro e ser lançada na direção oposta para reiniciar a partida.

Python
# Exemplo de lógica de borda interna ao loop
if bola.ycor() > 290:
    bola.sety(290)
    bola.dy *= -1  # Inverte a direção

if bola.xcor() > 390:
    bola.goto(0, 0)
    bola.dx *= -1
    # Adicionar ponto ao Jogador A aqui

5. Detecção de Colisão com as Raquetes

A detecção de colisão é o que torna o jogo desafiador. Precisamos checar se a coordenada da bola coincide com a área ocupada pela raquete. Como a raquete tem uma certa altura e largura, usamos comparações matemáticas simples para verificar se a bola está “dentro” do espaço da raquete nos eixos X e Y ao mesmo tempo.

Python
# Colisão com a Raquete Direita (Paddle B)
if (bola.xcor() > 340 and bola.xcor() < 350) and \
   (bola.gety() < paddle_b.ycor() + 40 and bola.gety() > paddle_b.ycor() - 40):
    bola.setx(340)
    bola.dx *= -1

Código Completo do Projeto

Abaixo, você encontrará o script completo e funcional para o seu jogo de Pong. Você pode copiar este código, salvar em um arquivo chamado pong.py e executá-lo imediatamente. Certifique-se de que não haja outros scripts usando o teclado simultaneamente para evitar conflitos.

Python
import turtle

# Configuração da Janela
janela = turtle.Screen()
janela.title("Meu Primeiro Pong - Academify")
janela.bgcolor("black")
janela.setup(width=800, height=600)
janela.tracer(0)

# Placar
score_a = 0
score_b = 0

# Raquete A
paddle_a = turtle.Turtle()
paddle_a.speed(0)
paddle_a.shape("square")
paddle_a.color("white")
paddle_a.shapesize(stretch_wid=5, stretch_len=1)
paddle_a.penup()
paddle_a.goto(-350, 0)

# Raquete B
paddle_b = turtle.Turtle()
paddle_b.speed(0)
paddle_b.shape("square")
paddle_b.color("white")
paddle_b.shapesize(stretch_wid=5, stretch_len=1)
paddle_b.penup()
paddle_b.goto(350, 0)

# Bola
bola = turtle.Turtle()
bola.speed(0)
bola.shape("square")
bola.color("white")
bola.penup()
bola.goto(0, 0)
bola.dx = 0.15
bola.dy = 0.15

# Pen (Escrita do Placar)
pen = turtle.Turtle()
pen.speed(0)
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)
pen.write("Jogador A: 0  Jogador B: 0", align="center", font=("Courier", 24, "normal"))

# Funções de movimento
def paddle_a_up():
    y = paddle_a.ycor()
    if y < 250:
        y += 20
        paddle_a.sety(y)

def paddle_a_down():
    y = paddle_a.ycor()
    if y > -240:
        y -= 20
        paddle_a.sety(y)

def paddle_b_up():
    y = paddle_b.ycor()
    if y < 250:
        y += 20
        paddle_b.sety(y)

def paddle_b_down():
    y = paddle_b.ycor()
    if y > -240:
        y -= 20
        paddle_b.sety(y)

# Teclado
janela.listen()
janela.onkeypress(paddle_a_up, "w")
janela.onkeypress(paddle_a_down, "s")
janela.onkeypress(paddle_b_up, "Up")
janela.onkeypress(paddle_b_down, "Down")

# Main Game Loop
while True:
    janela.update()

    # Mover a bola
    bola.setx(bola.xcor() + bola.dx)
    bola.sety(bola.ycor() + bola.dy)

    # Bordas Superiores e Inferiores
    if bola.ycor() > 290:
        bola.sety(290)
        bola.dy *= -1

    if bola.ycor() < -290:
        bola.sety(-290)
        bola.dy *= -1

    # Bordas Laterais (Pontuação)
    if bola.xcor() > 390:
        bola.goto(0, 0)
        bola.dx *= -1
        score_a += 1
        pen.clear()
        pen.write("Jogador A: {}  Jogador B: {}".format(score_a, score_b), align="center", font=("Courier", 24, "normal"))

    if bola.xcor() < -390:
        bola.goto(0, 0)
        bola.dx *= -1
        score_b += 1
        pen.clear()
        pen.write("Jogador A: {}  Jogador B: {}".format(score_a, score_b), align="center", font=("Courier", 24, "normal"))

    # Colisão com Raquete A
    if (bola.xcor() < -340 and bola.xcor() > -350) and (bola.ycor() < paddle_a.ycor() + 50 and bola.ycor() > paddle_a.ycor() - 50):
        bola.setx(-340)
        bola.dx *= -1

    # Colisão com Raquete B
    if (bola.xcor() > 340 and bola.xcor() < 350) and (bola.ycor() < paddle_b.ycor() + 50 and bola.ycor() > paddle_b.ycor() - 50):
        bola.setx(340)
        bola.dx *= -1

Melhorias e Próximos Passos

Agora que você sabe como fazer seu primeiro jogo de Pong com Python, o céu é o limite para as melhorias. Você pode adicionar efeitos sonoros quando a bola atinge a raquete ou aumentar a velocidade da bola à medida que os pontos aumentam para tornar o jogo mais difícil. Aprender a manipular o tempo é essencial aqui, e você pode conferir o módulo time em Python para criar pausas dramáticas entre os rounds.

Outra ideia interessante é criar um modo “CPU”, onde a raquete da direita se move sozinha seguindo a posição da bola. Isso exigirá um pouco mais de lógica condicional usando if, elif e else no Python. Para entender melhor como os jogos clássicos eram construídos, você também pode ler sobre a história do desenvolvimento no The Strong National Museum of Play.

Se você gostou deste projeto, existem muitos outros jogos simples que você pode tentar. Recomendamos que seu próximo desafio seja o jogo da cobrinha em Python. Ele utiliza conceitos similares de Turtle, mas introduz a gestão de listas para controlar o corpo da serpente que cresce com o tempo.

Perguntas Frequentes

Por que meu jogo está rodando muito devagar?

Isso geralmente ocorre se você esqueceu o comando janela.tracer(0) e o janela.update() dentro do loop. Sem eles, o Turtle tenta desenhar cada pequeno movimento, o que consome muito processamento.

Como posso mudar a cor dos elementos?

Basta alterar o argumento dentro da função .color("white"). Você pode usar nomes comuns como “blue”, “red”, “green” ou códigos hexadecimais entre aspas.

O jogo fecha imediatamente ao abrir, o que fazer?

Adicione turtle.done() ou janela.mainloop() ao final do seu código. Isso mantém a janela aberta esperando por uma interação do usuário.

Posso jogar este jogo com um controle de videogame?

O módulo Turtle não suporta nativamente joysticks. Para isso, você precisaria migrar seu código para o Pygame, que é uma biblioteca de jogos profissional para Python.

Como adicionar som ao Pong?

Em sistemas Windows, você pode usar a biblioteca winsound. No Linux ou Mac, bibliotecas como os ou bibliotecas externas de som são mais indicadas para acionar arquivos .wav.

Por que a bola atravessa as raquetes às vezes?

Isso acontece por causa da taxa de atualização do seu loop. Se o valor de bola.dx for muito alto, a bola pode “saltar” a área de colisão da raquete entre um frame e outro.

É possível usar imagens reais para a bola e raquetes?

Sim, o método janela.register_shape("imagem.gif") permite carregar arquivos GIF para serem usados como formas no seu jogo Turtle.

Onde posso hospedar meu jogo de Pong?

Você pode usar sites como o Trinket.io ou Repl.it para rodar seu código Python diretamente no navegador e compartilhar com seus amigos.

Eu cometi um erro no código, como consertar?

Verifique o terminal do Python. Ele dirá o número da linha e o tipo do erro. Fique atento para o erro de sintaxe em Python, que é o mais comum ao esquecer dois pontos (:) ou parênteses.

Como criar uma raquete controlada pelo computador?

Adicione um bloco de if para comparar a posição y da bola com a raquete B. Se a bola estiver acima da raquete, mova a raquete para cima.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Projetos
    Foto do Leandro Hirt

    Como criar um servidor HTTP simples em Python em 5 minutos

    Você já se perguntou como os desenvolvedores testam suas criações web de forma rápida sem precisar configurar servidores complexos como

    Ler mais

    Tempo de leitura: 9 minutos
    19/02/2026
    Projetos
    Foto do Leandro Hirt

    Criando jogos com Pygame para iniciantes

    Aprender como começar a jornada de criando jogos com Pygame para iniciantes é um dos marcos mais empolgantes na vida

    Ler mais

    Tempo de leitura: 10 minutos
    10/02/2026
    Projetos
    Foto do Leandro Hirt

    Chatbot com OpenAI API usando Python

    A inteligência artificial transformou a maneira como interagimos com a tecnologia, e criar o seu próprio Chatbot com OpenAI API

    Ler mais

    Tempo de leitura: 10 minutos
    09/02/2026
    Projetos
    Foto do Leandro Hirt

    Barra de progresso com tqdm no Python

    Se você já ficou na dúvida se um script Python ainda está em execução, a Barra de progresso com tqdm

    Ler mais

    Tempo de leitura: 5 minutos
    08/02/2026
    Projetos
    Foto do Leandro Hirt

    Criando um Quiz Interativo no Terminal com Python

    Se você quer Criando um Quiz Interativo no Terminal com Python de forma simples e divertida, este guia passo a

    Ler mais

    Tempo de leitura: 6 minutos
    07/02/2026
    Projetos
    Foto do Leandro Hirt

    Jogo da Forca em Python para iniciantes

    O Jogo da Forca em Python é uma ótima maneira de praticar lógica de programação, manipulação de strings e controle

    Ler mais

    Tempo de leitura: 6 minutos
    07/02/2026