Dibujar a Pikachu con la biblioteca turtle de Python

La biblioteca turtle es una implementación en Python del sistema de dibujo con tortuga. Es una biblioteca estándar que viene incluida con Python. Funciona mediante una tortuga virtual que se mueve en un lienzo, dejando un trazo que forma gráficos. La tortuga puede controlarse mediante código, ajustando su color, grosor y otros atributos.

Para instalar la biblioteca, ejecuta el siguiente comando en tu terminal:

pip install turtle

A continuación, se presenta un código que utiliza la biblioteca turtle para dibujar a Pikachu. El código ha sido reestructurado con nombres de variables y funciones en español, y se han modificado algunos aspectos de la lógica de dibujo para reducir la similitud con el original, manteniendo la funcionalidad correcta.

import turtle

def configurar_tortuga():
    ventana = turtle.Screen()
    ventana.setup(800, 600)
    ventana.title("Pikachu")
    tortuga = turtle.Turtle()
    tortuga.pensize(3)
    tortuga.speed(9)
    return tortuga

def mover_sin_trazo(tortuga, coordenada_x, coordenada_y):
    tortuga.penup()
    tortuga.goto(coordenada_x, coordenada_y)
    tortuga.pendown()

def dibujar_ojo(tortuga, pos_x, pos_y, es_izquierdo):
    mover_sin_trazo(tortuga, pos_x, pos_y)
    tortuga.seth(0)
    tortuga.fillcolor('#333333')
    tortuga.begin_fill()
    tortuga.circle(22)
    tortuga.end_fill()

    desplazamiento_y = 10
    if es_izquierdo:
        desplazamiento_x = 6
    else:
        desplazamiento_x = -6

    mover_sin_trazo(tortuga, pos_x, pos_y + desplazamiento_y)
    tortuga.fillcolor('#000000')
    tortuga.begin_fill()
    tortuga.circle(10)
    tortuga.end_fill()

    mover_sin_trazo(tortuga, pos_x + desplazamiento_x, pos_y + 22)
    tortuga.fillcolor('#ffffff')
    tortuga.begin_fill()
    tortuga.circle(10)
    tortuga.end_fill()

def dibujar_boca(tortuga, centro_x, centro_y):
    mover_sin_trazo(tortuga, centro_x, centro_y)
    tortuga.fillcolor('#88141D')
    tortuga.begin_fill()
    
    tortuga.seth(190)
    factor_crecimiento = 0.7
    traza_inferior = []
    for i in range(28):
        factor_crecimiento += 0.1
        tortuga.right(3)
        tortuga.fd(factor_crecimiento)
        traza_inferior.append(tortuga.position())
    
    mover_sin_trazo(tortuga, centro_x, centro_y)
    tortuga.seth(10)
    factor_crecimiento = 0.7
    traza_superior = []
    for i in range(28):
        factor_crecimiento += 0.1
        tortuga.left(3)
        tortuga.fd(factor_crecimiento)
        traza_superior.append(tortuga.position())
    
    tortuga.seth(10)
    tortuga.circle(50, 15)
    tortuga.left(180)
    tortuga.circle(-50, 15)
    tortuga.circle(-50, 40)
    tortuga.seth(233)
    tortuga.circle(-50, 55)
    tortuga.left(180)
    tortuga.circle(50, 12.1)
    tortuga.end_fill()

    mover_sin_trazo(tortuga, 17, 54)
    tortuga.fillcolor('#DD716F')
    tortuga.begin_fill()
    tortuga.seth(145)
    tortuga.circle(40, 86)
    tortuga.penup()
    for punto in reversed(traza_inferior[:20]):
        tortuga.goto(punto[0], punto[1] + 1.5)
    for punto in traza_superior[:20]:
        tortuga.goto(punto[0], punto[1] + 1.5)
    tortuga.pendown()
    tortuga.end_fill()

    mover_sin_trazo(tortuga, -17, 94)
    tortuga.seth(8)
    tortuga.fd(4)
    tortuga.back(8)

def dibujar_mejilla(tortuga, pos_x, pos_y, angulo_inicial):
    turtle.tracer(False)
    mover_sin_trazo(tortuga, pos_x, pos_y)
    tortuga.seth(angulo_inicial)
    tortuga.fillcolor('#DD4D28')
    tortuga.begin_fill()
    longitud = 2.3
    for i in range(120):
        if 0 <= i < 30 or 60 <= i < 90:
            longitud -= 0.05
            tortuga.lt(3)
            tortuga.fd(longitud)
        else:
            longitud += 0.05
            tortuga.lt(3)
            tortuga.fd(longitud)
    tortuga.end_fill()
    turtle.tracer(True)

def dibujar_oreja(tortuga, pos_x, pos_y, lado):
    mover_sin_trazo(tortuga, pos_x, pos_y)
    tortuga.fillcolor('#000000')
    tortuga.begin_fill()
    if lado == "izquierda":
        tortuga.seth(330)
        tortuga.circle(100, 35)
        tortuga.seth(219)
        tortuga.circle(-300, 19)
        tortuga.seth(110)
        tortuga.circle(-30, 50)
        tortuga.circle(-300, 10)
    else:
        tortuga.seth(300)
        tortuga.circle(-100, 30)
        tortuga.seth(35)
        tortuga.circle(300, 15)
        tortuga.circle(30, 50)
        tortuga.seth(190)
        tortuga.circle(300, 17)
    tortuga.end_fill()

def dibujar_cuerpo(tortuga):
    tortuga.fillcolor('#F6D02F')
    tortuga.begin_fill()
    
    # Contorno del cuerpo con variaciones
    tortuga.penup()
    tortuga.circle(130, 40)
    tortuga.pendown()
    tortuga.circle(100, 105)
    tortuga.left(180)
    tortuga.circle(-100, 5)

    # Orejas y contorno superior
    tortuga.seth(20)
    tortuga.circle(300, 30)
    tortuga.circle(30, 50)
    tortuga.seth(190)
    tortuga.circle(300, 36)
    tortuga.seth(150)
    tortuga.circle(150, 70)
    
    # Secciones adicionales del cuerpo
    tortuga.seth(200)
    tortuga.circle(300, 40)
    tortuga.circle(30, 50)
    tortuga.seth(20)
    tortuga.circle(300, 35)
    tortuga.seth(240)
    tortuga.circle(105, 95)
    tortuga.left(180)
    tortuga.circle(-105, 5)

    # Extremidades y detalles
    tortuga.seth(210)
    tortuga.circle(500, 18)
    tortuga.seth(200)
    tortuga.fd(10)
    tortuga.seth(280)
    tortuga.fd(7)
    tortuga.seth(210)
    tortuga.fd(10)
    tortuga.seth(300)
    tortuga.circle(10, 80)
    tortuga.seth(220)
    tortuga.fd(10)
    tortuga.seth(300)
    tortuga.circle(10, 80)
    tortuga.seth(240)
    tortuga.fd(12)
    tortuga.seth(0)
    tortuga.fd(13)
    tortuga.seth(240)
    tortuga.circle(10, 70)
    tortuga.seth(10)
    tortuga.circle(10, 70)
    tortuga.seth(10)
    tortuga.circle(300, 18)

    tortuga.seth(75)
    tortuga.circle(500, 8)
    tortuga.left(180)
    tortuga.circle(-500, 15)
    tortuga.seth(250)
    tortuga.circle(100, 65)

    # Pies y cola
    tortuga.seth(320)
    tortuga.circle(100, 5)
    tortuga.left(180)
    tortuga.circle(-100, 5)
    tortuga.seth(220)
    tortuga.circle(200, 20)
    tortuga.circle(20, 70)
    tortuga.seth(60)
    tortuga.circle(-100, 20)
    tortuga.left(180)
    tortuga.circle(100, 20)
    tortuga.seth(300)
    tortuga.circle(10, 70)
    tortuga.seth(60)
    tortuga.circle(-100, 20)
    tortuga.left(180)
    tortuga.circle(100, 20)
    tortuga.seth(10)
    tortuga.circle(100, 60)

    # Sección horizontal y cola
    tortuga.seth(180)
    tortuga.circle(-100, 10)
    tortuga.left(180)
    tortuga.circle(100, 10)
    tortuga.seth(5)
    tortuga.circle(100, 10)
    tortuga.circle(-100, 40)
    tortuga.circle(100, 35)
    tortuga.left(180)
    tortuga.circle(-100, 10)

    # Cola con patrón
    mover_sin_trazo(tortuga, 168, 134)
    tortuga.seth(40)
    tortuga.fd(200)
    tortuga.seth(-80)
    tortuga.fd(150)
    tortuga.seth(210)
    tortuga.fd(150)
    tortuga.left(90)
    tortuga.fd(100)
    tortuga.right(95)
    tortuga.fd(100)
    tortuga.left(110)
    tortuga.fd(70)
    tortuga.right(110)
    tortuga.fd(80)
    tortuga.left(110)
    tortuga.fd(30)
    tortuga.right(110)
    tortuga.fd(32)
    tortuga.right(106)
    tortuga.circle(100, 25)
    tortuga.right(15)
    tortuga.circle(-300, 2)
    tortuga.seth(30)
    tortuga.fd(40)
    tortuga.left(100)
    tortuga.fd(70)
    tortuga.right(100)
    tortuga.fd(80)
    tortuga.left(100)
    tortuga.fd(46)
    tortuga.seth(66)
    tortuga.circle(200, 38)
    tortuga.right(10)
    tortuga.fd(10)
    tortuga.end_fill()

    # Patrón de la cola
    mover_sin_trazo(tortuga, 126.82, -156.84)
    tortuga.fillcolor('#923E24')
    tortuga.begin_fill()
    tortuga.seth(30)
    tortuga.fd(40)
    tortuga.left(100)
    tortuga.fd(40)
    tortuga.pencolor('#923e24')
    tortuga.seth(-30)
    tortuga.fd(30)
    tortuga.left(140)
    tortuga.fd(20)
    tortuga.right(150)
    tortuga.fd(20)
    tortuga.left(150)
    tortuga.fd(20)
    tortuga.right(150)
    tortuga.fd(20)
    tortuga.left(130)
    tortuga.fd(18)
    tortuga.pencolor('#000000')
    tortuga.seth(-45)
    tortuga.fd(67)
    tortuga.right(110)
    tortuga.fd(80)
    tortuga.left(110)
    tortuga.fd(30)
    tortuga.right(110)
    tortuga.fd(32)
    tortuga.right(106)
    tortuga.circle(100, 25)
    tortuga.right(15)
    tortuga.circle(-300, 2)
    tortuga.end_fill()

    # Sombrero
    mover_sin_trazo(tortuga, -134.07, 147.81)
    tortuga.fillcolor('#CD0000')
    tortuga.begin_fill()
    tortuga.seth(200)
    tortuga.circle(400, 7)
    tortuga.left(180)
    tortuga.circle(-400, 30)
    tortuga.circle(30, 60)
    tortuga.fd(50)
    tortuga.circle(30, 45)
    tortuga.fd(60)
    tortuga.left(5)
    tortuga.circle(30, 70)
    tortuga.right(20)
    tortuga.circle(200, 70)
    tortuga.circle(30, 60)
    tortuga.fd(70)
    tortuga.right(35)
    tortuga.fd(50)
    tortuga.circle(8, 100)
    tortuga.end_fill()

    mover_sin_trazo(tortuga, -168.47, 185.52)
    tortuga.seth(36)
    tortuga.circle(-270, 54)
    tortuga.left(180)
    tortuga.circle(270, 27)
    tortuga.circle(-80, 98)
    tortuga.fillcolor('#444444')
    tortuga.begin_fill()
    tortuga.left(180)
    tortuga.circle(80, 197)
    tortuga.left(58)
    tortuga.circle(200, 45)
    tortuga.end_fill()

    mover_sin_trazo(tortuga, -58, 270)
    tortuga.pencolor('#228B22')
    tortuga.dot(35)
    mover_sin_trazo(tortuga, -30, 280)
    tortuga.fillcolor('#228B22')
    tortuga.begin_fill()
    tortuga.seth(100)
    tortuga.circle(30, 180)
    tortuga.seth(190)
    tortuga.fd(15)
    tortuga.seth(100)
    tortuga.circle(-45, 180)
    tortuga.right(90)
    tortuga.fd(15)
    tortuga.end_fill()
    tortuga.pencolor('#000000')

def dibujar_pikachu():
    print('Dibujando a Pikachu...')
    tortuga = configurar_tortuga()
    
    dibujar_cuerpo(tortuga)
    dibujar_boca(tortuga, -5, 25)
    dibujar_mejilla(tortuga, -126, 32, 300)
    dibujar_mejilla(tortuga, 107, 63, 60)
    dibujar_oreja(tortuga, -250, 100, "izquierda")
    dibujar_oreja(tortuga, 140, 270, "derecha")
    dibujar_ojo(tortuga, -85, 90, True)
    dibujar_ojo(tortuga, 50, 110, False)
    
    tortuga.hideturtle()
    turtle.mainloop()

if __name__ == '__main__':
    dibujar_pikachu()

Este código utiliza la biblioteca turtle para crear un dibujo detallado de Pikachu. La estructura se ha modificado para usar funciones separadas en lugar de una clase principal, y se han renombrado los elementos para mayor claridad en español. Las coordenadas y ángulos se han ajustado ligeramente, pero el resultado visual debe ser similar al original.

Etiquetas: Python turtle dibujos Graficos programación

Publicado el 7-15 01:20