Comecemos pela pirâmide normal. Uma solução possível consiste em ir imprimindo linha a linha, uma sequência de quadrados de um dado comprimento. Precisamos de saber duas coisas: (1) onde colocar a tartaruga no início de cada linha e, (2) onde recolocar a tartaruga para desenhar um quadrado dentro de cada linha. Definimos dois pontos de referência (posx e posy) e é em relação a eles que resolvemos a primeira questão. A segunda questão resolve-se depois de verificar que cada quadrado numa dada linha deve avançar na coordenada xx de um valor igual ao lado. O nosso programa vai assim funcionar de acordo com o que mostramos no desenho seguinte. Posto isto o código completo.
01.
import
turtle
02.
03.
def
quadrado(posx, posy,lado):
04.
turtle.showturtle()
05.
# posiciona
06.
turtle.penup()
07.
turtle.goto(posx, posy)
08.
turtle.pendown()
09.
# desenha
10.
for
i
in
range(
4
):
11.
turtle.forward(lado)
12.
turtle.left(
90
)
13.
turtle.hideturtle()
14.
15.
# Normal
16.
def
pir_normal(n,posx, posy,lado):
17.
for
i
in
range(
1
,n
+
1
):
18.
# desenha linha i
19.
# --- posiciona
20.
turtle.penup()
21.
turtle.goto(posx
+
(n
-
i)
*
lado
/
2
, posy
+
(n
-
i)
*
lado)
22.
turtle.pendown()
23.
# --- desenha
24.
for
j
in
range(
1
,i
+
1
):
25.
quadrado(turtle.xcor(),turtle.ycor(), lado)
26.
turtle.setx(turtle.xcor()
+
lado)
27.
turtle.hideturtle()
01.
# Invertida
02.
def
pir_invertida(n,posx, posy,lado):
03.
for
i
in
range(
1
,n
+
1
):
04.
# desenha linha i
05.
# --- posiciona
06.
turtle.penup()
07.
turtle.goto(posx
+
(n
-
i)
*
lado
/
2
,posy
-
(n
-
i)
*
lado)
08.
turtle.pendown()
09.
# --- desenha
10.
for
j
in
range(
1
,i
+
1
):
11.
quadrado(turtle.xcor(),turtle.ycor(), lado)
12.
turtle.setx(turtle.xcor()
+
lado)
13.
turtle.hideturtle()
Passemos agora ao exemplo do teste em que se pretende uma forma “voltada” para a direita. A grande diferença em relação aos dois casos anteriores, é que uma solução fácil envolve olhar para a figura como colunas de quadrados de um dado tamanho. Daí que agora o que se vai mudar dentro do segundo ciclo for é o valor da coordenada yy. O resto, cálculo das posições em cada coluna é semelhante. Vamos ao código.
01.
def
pir_direita(n,posx, posy,lado):
02.
for
i
in
range(
1
,n
+
1
):
03.
# desenha coluna i
04.
# -- posiciona
05.
turtle.penup()
06.
turtle.goto(posx
+
(n
-
i)
*
lado,posy
+
(n
-
i)
*
lado
/
2
)
07.
turtle.pendown()
08.
# -- desenha
09.
for
j
in
range(
1
,i
+
1
):
10.
quadrado(turtle.xcor(),turtle.ycor(), lado)
11.
turtle.sety(turtle.ycor()
+
lado)
12.
turtle.hideturtle()
01.
# Esquerda
02.
def
pir_esquerda(n,posx, posy,lado):
03.
for
i
in
range(
1
,n
+
1
):
04.
# desenha coluna i
05.
# posiciona
06.
turtle.penup()
07.
turtle.goto(posx
-
(n
-
i)
*
lado,posy
+
(n
-
i)
*
lado
/
2
)
08.
turtle.pendown()
09.
# desenha
10.
for
j
in
range(
1
,i
+
1
):
11.
quadrado(turtle.xcor(),turtle.ycor(), lado)
12.
turtle.sety(turtle.ycor()
+
lado)
13.
turtle.hideturtle()
Estes exemplos mostram como por vezes uma simples alteração resolve um problema diferente. As soluções propostas também são consequência do modo como olhamos para as figuras e entendemos tratar-se de uma sequência de linhas ou uma sequência de colunas. Mas não podíamos ter olhado para as figuras como sequências de “diagonais”? claro que sim. Isso interfere com a construção da solução? Um pouco. Admitamos que é o exemplo da figura voltada para a direita. Eis o resultado.
01.
# Diagonal
02.
def
pir_diagonal(n,posx, posy,lado):
03.
for
i
in
range(
1
,n
+
1
):
04.
# desenha linha i
05.
# posiciona
06.
turtle.penup()
07.
turtle.goto(posx,posy
-
i
*
lado)
08.
turtle.pendown()
09.
# desenha
10.
for
j
in
range(i,n
+
1
):
11.
quadrado(turtle.xcor(),turtle.ycor(), lado)
12.
turtle.penup()
13.
turtle.goto(turtle.xcor()
+
lado,turtle.ycor()
-
lado
/
2
)
14.
turtle.pendown()
15.
turtle.hideturtle()
01.
# Com cores
02.
def
pir_diagonal_cores(n,posx, posy,lado,cores):
03.
for
i
in
range(
1
,n
+
1
):
04.
# desenha linha i
05.
# posiciona
06.
turtle.penup()
07.
turtle.goto(posx,posy
-
i
*
lado)
08.
turtle.pendown()
09.
# desenha
10.
turtle.fillcolor(cores[i
%
len(cores)])
11.
for
j
in
range(i,n
+
1
):
12.
turtle.begin_fill()
13.
quadrado(turtle.xcor(),turtle.ycor(), lado)
14.
turtle.end_fill()
15.
turtle.penup()
16.
turtle.goto(turtle.xcor()
+
lado,turtle.ycor()
-
lado
/
2
)
17.
turtle.pendown()
18.
turtle.hideturtle()
1.
# minimalista
2.
def
pir_minimalista(n, lado):
3.
for
i
in
range(n):
4.
for
j
in
range(n
-
i):
5.
quadrado(i
*
lado,j
*
lado
+
i
*
(lado
/
2
),lado)
E agora vamos descansar...