Прежде чем мы решим проблему вертикального флага, давайте вернемся к вашему горизонтальному флагу. Ваш код создает ложное впечатление, что он может изменять размер флага по мере необходимости:
flag_height = 250
flag_width = 475
Но слишком много встроенных чисел, чтобы это произошло:
start_x = -237
start_y = 125
star_size = 10
square_height = 133
square_width = 185
gap_between_stars = 30
gap_between_lines = stripe_height + 6
y = 112
x = -222
y = 100
x = -206
Итак, давайте перепишем ваш код для рисования горизонтального флага без всех этих встроенных чисел:
from turtle import Screen, Turtle
# Based on https://en.wikipedia.org/wiki/Flag_of_the_United_States
FLAG_HOIST = 250
FLAG_FLY = FLAG_HOIST * 1.9
STRIPE_WIDTH = FLAG_HOIST/13
CANTON_HOIST = STRIPE_WIDTH * 7
CANTON_FLY = 2 * FLAG_FLY / 5
STAR_DIAMETER = 4 * STRIPE_WIDTH / 5
VERTICAL_STAR_GAP = -CANTON_HOIST/5
HORIZONTAL_STAR_GAP = CANTON_FLY/6
START_X = -FLAG_FLY/2
START_Y = FLAG_HOIST/2
def draw_fill_rectangle(x, y, width, height, color):
turtle.color(color)
turtle.goto(x, y)
turtle.begin_fill()
for _ in range(2):
turtle.forward(width)
turtle.right(90)
turtle.forward(height)
turtle.right(90)
turtle.end_fill()
def draw_star(x, y, color, length):
turtle.color(color)
turtle.goto(x, y)
turtle.setheading(0)
turtle.pendown()
turtle.begin_fill()
for _ in range(5):
turtle.forward(length)
turtle.right(144)
turtle.end_fill()
turtle.penup()
def draw_stripes():
y = START_Y
for _ in range(6):
for color in ['red', 'white']:
draw_fill_rectangle(START_X, y, FLAG_FLY, STRIPE_WIDTH, color)
y -= STRIPE_WIDTH
draw_fill_rectangle(START_X, y, FLAG_FLY, STRIPE_WIDTH, 'red')
def draw_square():
draw_fill_rectangle(START_X, START_Y, CANTON_FLY, CANTON_HOIST, 'navy')
def draw_six_stars_rows():
y = START_Y + VERTICAL_STAR_GAP/2
# create 5 rows of stars
for _ in range(5):
x = START_X + (HORIZONTAL_STAR_GAP/2 - STAR_DIAMETER/2)
# create 6 stars in each row
for _ in range(6):
draw_star(x, y, 'white', abs(STAR_DIAMETER))
x += HORIZONTAL_STAR_GAP
y += VERTICAL_STAR_GAP
def draw_five_stars_rows():
y = START_Y + VERTICAL_STAR_GAP
# create 4 rows of stars
for _ in range(4):
x = START_X + (HORIZONTAL_STAR_GAP - STAR_DIAMETER/2)
# create 5 stars in each row
for _ in range(5):
draw_star(x, y, 'white', abs(STAR_DIAMETER))
x += HORIZONTAL_STAR_GAP
y += VERTICAL_STAR_GAP
screen = Screen()
turtle = Turtle()
turtle.hideturtle()
turtle.speed('fastest')
turtle.setheading(0)
turtle.penup()
# draw 13 stripes
draw_stripes()
# draw squares to hold stars
draw_square()
# draw 30 stars, 6 * 5
draw_six_stars_rows()
# draw 20 stars, 5 * 4. total 50 stars representing 50 states of USA
draw_five_stars_rows()
screen.exitonclick()
Теперь, когда мы абстрагировали код, поворот флага по вертикали вопрос об изменении заголовка по умолчанию на 0 градусов на 270 градусов, переключении знака на несколько наших констант и обращении x и y в наших goto()
вызовах:
13c13
< STAR_DIAMETER = 4 * STRIPE_WIDTH / 5
---
> STAR_DIAMETER = -4 * STRIPE_WIDTH / 5
16c16
< HORIZONTAL_STAR_GAP = CANTON_FLY/6
---
> HORIZONTAL_STAR_GAP = -CANTON_FLY/6
18c18
< START_X = -FLAG_FLY/2
---
> START_X = FLAG_FLY/2
23c23
< turtle.goto(x, y)
---
> turtle.goto(y, x)
36,37c36,37
< turtle.goto(x, y)
< turtle.setheading(0)
---
> turtle.goto(y, x)
> turtle.setheading(270)
91c91
< turtle.setheading(0)
---
> turtle.setheading(270)