DEV Community

pyrtugues
pyrtugues

Posted on

Criando um dragão em Pyrtugues

Criando um dragão que segue o mouse com Pyrtugues e Pygame 🐉

Já imaginou criar um jogo usando comandos de programação em português?

Neste tutorial, vamos criar um pequeno projeto gráfico com Pyrtugues e Pygame: um dragão esmeralda que segue o mouse, com corpo sinuoso, asas roxas, chifres dourados e olhos brilhantes. ✨

A ideia é aprender programação fazendo algo visual, sem depender de imagens prontas. O dragão será desenhado usando formas geométricas, cores e coordenadas.

🐍 O que é o Pyrtugues?

O Pyrtugues é um projeto educacional de programação baseado na lógica do Python. Ele permite escrever código com comandos em português e traduzi-lo para Python.

Por exemplo:

mostrar("Olá, mundo!")
Enter fullscreen mode Exit fullscreen mode

É traduzido para:

print("Olá, mundo!")
Enter fullscreen mode Exit fullscreen mode

Isso permite aprender conceitos de programação em português enquanto você acompanha como eles aparecem no Python.

🎮 O que vamos criar?

Nosso projeto terá:

  • Um dragão verde com detalhes brilhantes.
  • Um corpo que acompanha o caminho percorrido pelo mouse.
  • Asas roxas e espinhos ao longo do corpo.
  • Olhos dourados e chifres.
  • Um céu escuro com estrelas.
  • Um controle simples para fechar a janela.

Tudo será desenhado pelo Pygame, então não precisamos baixar sprites ou imagens externas.

🛠️ Antes de começar

Este exemplo é voltado à versão Desktop do Pyrtugues, utilizando a integração com Pygame.

Você pode encontrar o código-fonte e as instruções de instalação no repositório oficial do Pyrtugues.

A disponibilidade dos recursos pode variar conforme a versão do tradutor e o ambiente. O exemplo utiliza os aliases de Pygame documentados no código do projeto.

💻 Código completo

Crie um arquivo de código no Pyrtugues Desktop e experimente o seguinte exemplo:

importar jogo

jogo.iniciar()

janela = jogo.display.criar_janela((1000, 700))
jogo.display.definir_título("Dragão Esmeralda — Pyrtugues")

relogio = jogo.tempo.relógio()

x, y = jogo.mouse.posição()

# Criamos os pontos iniciais do corpo.
rastro = []

para i em intervalo(130):
    rastro.adicionar((x - i * 3, y))

# Estrelas fixas no fundo.
estrelas = [
    (38, 45), (120, 90), (210, 55), (310, 120),
    (430, 65), (540, 100), (650, 45), (750, 115),
    (870, 70), (960, 140), (80, 220), (190, 300),
    (340, 250), (500, 190), (680, 280), (820, 220),
    (930, 350), (100, 460), (260, 520), (430, 610),
    (600, 520), (770, 600), (900, 500), (970, 610)
]

executando = verdadeiro

enquanto executando:

    # Verificamos os eventos da janela.
    para evento em jogo.eventos.obter():

        se evento.type == jogo.sair_evento:
            executando = falso

        se evento.type == jogo.tecla_pressionada_evento e evento.key == jogo.esc:
            executando = falso

    # Posição atual do mouse.
    x, y = jogo.mouse.posição()

    # Adicionamos posições ao rastro quando o mouse se move.
    antigo_x, antigo_y = rastro[0]

    dx = x - antigo_x
    dy = y - antigo_y

    se dx * dx + dy * dy >= 9:
        rastro.inserir(0, (x, y))
        rastro = rastro[:130]

    # Fundo noturno.
    janela.preencher((8, 12, 29))

    # Estrelas do cenário.
    para estrela em estrelas:
        jogo.desenho.círculo(
            janela,
            (100, 160, 210),
            estrela,
            2
        )

    # Desenhamos as asas atrás do corpo.
    asa_x, asa_y = rastro[18]

    # Asa superior: contorno e membrana.
    jogo.desenho.polígono(
        janela,
        (7, 22, 45),
        [
            (asa_x, asa_y),
            (asa_x - 14, asa_y - 19),
            (asa_x - 38, asa_y - 49),
            (asa_x - 36, asa_y - 17),
            (asa_x - 55, asa_y - 29),
            (asa_x - 38, asa_y + 2),
            (asa_x - 10, asa_y + 8)
        ]
    )

    jogo.desenho.polígono(
        janela,
        (116, 64, 184),
        [
            (asa_x - 5, asa_y - 3),
            (asa_x - 14, asa_y - 19),
            (asa_x - 34, asa_y - 39),
            (asa_x - 31, asa_y - 14),
            (asa_x - 46, asa_y - 21),
            (asa_x - 32, asa_y + 1)
        ]
    )

    # Asa inferior.
    jogo.desenho.polígono(
        janela,
        (7, 22, 45),
        [
            (asa_x, asa_y),
            (asa_x - 14, asa_y + 19),
            (asa_x - 38, asa_y + 49),
            (asa_x - 36, asa_y + 17),
            (asa_x - 55, asa_y + 29),
            (asa_x - 38, asa_y - 2),
            (asa_x - 10, asa_y - 8)
        ]
    )

    jogo.desenho.polígono(
        janela,
        (91, 49, 157),
        [
            (asa_x - 5, asa_y + 3),
            (asa_x - 14, asa_y + 19),
            (asa_x - 34, asa_y + 39),
            (asa_x - 31, asa_y + 14),
            (asa_x - 46, asa_y + 21),
            (asa_x - 32, asa_y - 1)
        ]
    )

    # Corpo sinuoso: desenhamos da cauda até a cabeça.
    # A largura aumenta conforme nos aproximamos da cabeça.
    para i em intervalo(120, 0, -1):

        corpo_x, corpo_y = rastro[i]
        proximo_x, proximo_y = rastro[i - 1]

        largura = 8 + (120 - i) // 5

        # Contorno escuro.
        jogo.desenho.linha(
            janela,
            (5, 31, 43),
            (corpo_x, corpo_y),
            (proximo_x, proximo_y),
            largura + 8
        )

        # Corpo esmeralda.
        jogo.desenho.linha(
            janela,
            (25, 170, 112),
            (corpo_x, corpo_y),
            (proximo_x, proximo_y),
            largura
        )

        # Reflexo verde-claro.
        jogo.desenho.linha(
            janela,
            (108, 255, 192),
            (corpo_x, corpo_y),
            (proximo_x, proximo_y),
            2
        )

    # Escamas brilhantes.
    para i em intervalo(10, 112, 10):

        escama_x, escama_y = rastro[i]

        jogo.desenho.círculo(
            janela,
            (153, 255, 192),
            (escama_x, escama_y - 6),
            3
        )

        jogo.desenho.círculo(
            janela,
            (231, 244, 153),
            (escama_x, escama_y - 6),
            1
        )

    # Espinhos ao longo das costas.
    para i em intervalo(20, 110, 18):

        espinho_x, espinho_y = rastro[i]

        jogo.desenho.polígono(
            janela,
            (5, 52, 54),
            [
                (espinho_x, espinho_y - 20),
                (espinho_x - 9, espinho_y - 2),
                (espinho_x + 9, espinho_y - 2)
            ]
        )

        jogo.desenho.polígono(
            janela,
            (93, 255, 165),
            [
                (espinho_x, espinho_y - 15),
                (espinho_x - 5, espinho_y - 4),
                (espinho_x + 5, espinho_y - 4)
            ]
        )

    # Pequenas partículas mágicas pelo caminho.
    para i em intervalo(8, 100, 23):

        brilho_x, brilho_y = rastro[i]

        jogo.desenho.círculo(
            janela,
            (100, 255, 230),
            (brilho_x, brilho_y + 13),
            2
        )

    # Cabeça: base escura.
    jogo.desenho.círculo(
        janela,
        (5, 28, 37),
        (x - 2, y - 1),
        24
    )

    # Formato externo da cabeça.
    jogo.desenho.polígono(
        janela,
        (5, 36, 43),
        [
            (x - 22, y - 14),
            (x - 8, y - 23),
            (x + 13, y - 18),
            (x + 24, y - 8),
            (x + 37, y - 5),
            (x + 30, y + 7),
            (x + 12, y + 10),
            (x - 10, y + 7),
            (x - 22, y + 3)
        ]
    )

    # Cor principal da cabeça.
    jogo.desenho.polígono(
        janela,
        (38, 205, 125),
        [
            (x - 17, y - 12),
            (x - 7, y - 18),
            (x + 11, y - 14),
            (x + 20, y - 7),
            (x + 31, y - 5),
            (x + 25, y + 2),
            (x + 10, y + 5),
            (x - 8, y + 4),
            (x - 17, y)
        ]
    )

    # Chifres dourados.
    jogo.desenho.polígono(
        janela,
        (239, 191, 81),
        [
            (x - 15, y - 15),
            (x - 23, y - 34),
            (x - 5, y - 20)
        ]
    )

    jogo.desenho.polígono(
        janela,
        (255, 224, 130),
        [
            (x - 13, y - 19),
            (x - 20, y - 30),
            (x - 9, y - 21)
        ]
    )

    jogo.desenho.polígono(
        janela,
        (239, 191, 81),
        [
            (x - 4, y - 17),
            (x + 2, y - 35),
            (x + 8, y - 15)
        ]
    )

    # Olho dourado e pupila.
    jogo.desenho.círculo(
        janela,
        (255, 221, 110),
        (x + 10, y - 10),
        6
    )

    jogo.desenho.círculo(
        janela,
        (12, 25, 32),
        (x + 12, y - 10),
        3
    )

    jogo.desenho.círculo(
        janela,
        (255, 255, 255),
        (x + 11, y - 12),
        1
    )

    # Narinas e boca.
    jogo.desenho.círculo(
        janela,
        (5, 52, 48),
        (x + 25, y - 5),
        2
    )

    jogo.desenho.círculo(
        janela,
        (5, 52, 48),
        (x + 30, y - 3),
        2
    )

    jogo.desenho.linha(
        janela,
        (5, 52, 48),
        (x + 12, y + 5),
        (x + 27, y + 4),
        3
    )

    # Mantém a animação fluida.
    relogio.marcar_fps(60)

    jogo.display.atualizar_tela()

jogo.sair()
Enter fullscreen mode Exit fullscreen mode

🧠 Como o dragão segue o mouse?

A parte mais importante é o rastro.

se dx * dx + dy * dy >= 9:
    rastro.inserir(0, (x, y))
    rastro = rastro[:130]
Enter fullscreen mode Exit fullscreen mode

Cada vez que o mouse se desloca o suficiente, guardamos a nova posição no começo da lista. As posições antigas continuam atrás dela.

Depois, o código desenha linhas entre esses pontos. Como o corpo é desenhado da cauda para a cabeça, podemos aumentar sua largura conforme nos aproximamos do cursor.

É isso que cria a sensação de um dragão serpentino acompanhando o movimento, em vez de uma figura estática que apenas muda de posição.

🐍 O que o Pyrtugues traduz?

O código usa aliases documentados no projeto para operações do Pygame. Por exemplo:

Pyrtugues Pygame
jogo.iniciar() pygame.init()
jogo.display.criar_janela() pygame.display.set_mode()
jogo.mouse.posição() pygame.mouse.get_pos()
jogo.desenho.círculo() pygame.draw.circle()
jogo.desenho.linha() pygame.draw.line()
jogo.display.atualizar_tela() pygame.display.flip()

O objetivo é manter a lógica de programação próxima do Python, permitindo escrever comandos em português e observar suas correspondências.

Você pode consultar os aliases e a implementação na documentação e no código do Pyrtugues.

🚀 Ideias para continuar

Agora que temos o dragão seguindo o mouse, existem várias formas de evoluir o projeto:

  • Fazer as asas baterem durante o movimento.
  • Adicionar partículas de fogo pela boca.
  • Criar obstáculos e colisões.
  • Fazer o dragão perseguir um objeto.
  • Adicionar sons e música.
  • Criar pontos e uma pontuação.

Cada melhoria pode ensinar um novo conceito, como animação, eventos, condições, colisões ou controle de tempo.

📚 Conheça o Pyrtugues

🐙 GitHub: https://github.com/pyrtugues/Pyrtugues

🌐 Site de apresentação: https://pyrtugues-apre.pages.dev/

📚 Curso: https://pyrtugues.pages.dev/

💻 Editor Web: https://pyrtugues-editor.pages.dev/

🧩 Extensão para VS Code: https://open-vsx.org/extension/pyrtugues/pyrtugues

O Pyrtugues é um projeto educacional em evolução. Consulte a documentação e a licença oficial antes de utilizar o projeto.


Programar não precisa começar com uma barreira de idioma. Você pode começar com uma ideia, transformá-la em código e aprender cada vez mais enquanto constrói.

Qual criatura você criaria com Pyrtugues? 🐉💚

python #pygame #beginners #programming

Top comments (0)