You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Turtle绘制美国国旗:多行星星实现及代码优化求助

解决美国国旗多行星星绘制问题及代码优化

优化后的完整代码

from turtle import *

# 国旗尺寸常量,避免魔法数字
FLAG_WIDTH = 800
FLAG_HEIGHT = 500
STRIPE_HEIGHT = FLAG_HEIGHT / 13  # 13条条纹,每条高度相等
BLUE_RECT_WIDTH = FLAG_WIDTH * 0.4375  # 蓝色区域宽度为国旗宽的0.4375倍
BLUE_RECT_HEIGHT = FLAG_HEIGHT * 7 / 13  # 覆盖7条条纹的高度
STAR_SIZE = 20
STAR_HORIZONTAL_SPACING = BLUE_RECT_WIDTH / 6  # 6颗星的横向间距
STAR_VERTICAL_SPACING = BLUE_RECT_HEIGHT / 9  # 9行星星的纵向间距

setup(FLAG_WIDTH, FLAG_HEIGHT)
shape("turtle")
speed(0)
hideturtle()  # 提前隐藏海龟,避免绘制过程中干扰视觉

# 绘制单条条纹
def draw_stripe(x, y, color_name):
    penup()
    goto(x, y)
    pendown()
    color(color_name)
    begin_fill()
    for _ in range(2):
        forward(FLAG_WIDTH)
        right(90)
        forward(STRIPE_HEIGHT)
        right(90)
    end_fill()

# 绘制7条红色条纹(对应奇数行位置)
start_x = -FLAG_WIDTH / 2
start_y = FLAG_HEIGHT / 2
for i in range(7):
    draw_stripe(start_x, start_y - i * 2 * STRIPE_HEIGHT, "red")

# 绘制蓝色矩形区域
def draw_blue_rect():
    penup()
    goto(start_x, start_y)
    pendown()
    color("blue")
    begin_fill()
    for _ in range(2):
        forward(BLUE_RECT_WIDTH)
        right(90)
        forward(BLUE_RECT_HEIGHT)
        right(90)
    end_fill()

draw_blue_rect()

# 绘制单颗星星
def draw_star(x, y):
    penup()
    goto(x, y)
    pendown()
    color("white")
    begin_fill()
    for _ in range(5):
        forward(STAR_SIZE)
        right(144)
    end_fill()

# 绘制一行星星,参数为起始坐标和星星数量
def draw_star_row(start_x, start_y, star_count):
    current_x = start_x
    for _ in range(star_count):
        draw_star(current_x, start_y)
        current_x += STAR_HORIZONTAL_SPACING

# 绘制9行交错排列的星星
star_start_x = start_x + STAR_HORIZONTAL_SPACING / 2  # 水平居中偏移
star_start_y = start_y - STAR_VERTICAL_SPACING / 2  # 垂直居中偏移
for row in range(9):
    if row % 2 == 0:
        # 偶数行绘制6颗星星
        draw_star_row(star_start_x, star_start_y - row * STAR_VERTICAL_SPACING, 6)
    else:
        # 奇数行绘制5颗星星,且水平偏移半个间距
        draw_star_row(star_start_x + STAR_HORIZONTAL_SPACING / 2, star_start_y - row * STAR_VERTICAL_SPACING, 5)

done()

多行星星实现逻辑

美国国旗蓝色区域内的星星为9行交错排列:

  • 偶数行(第0、2、4、6、8行)每行6颗星星,从初始水平偏移位置开始绘制
  • 奇数行(第1、3、5、7行)每行5颗星星,起始位置比偶数行多半个横向间距,保证交错对齐
  • 通过循环遍历9行,根据行号奇偶性切换星星数量和起始坐标,完成所有星星绘制

代码优化点

  • 常量替代魔法数字:把国旗尺寸、元素比例等定义为常量,方便后续调整和维护
  • 函数模块化拆分:将条纹、蓝色区域、单颗星星、星星行拆分为独立函数,逻辑更清晰
  • 比例化坐标计算:基于国旗总尺寸动态计算各元素位置,符合美国国旗的官方比例规范
  • 提前隐藏海龟:初始化阶段就隐藏海龟,避免绘制过程中图形干扰

内容的提问来源于stack exchange,提问作者정경원

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:20:00