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

Python Turtle图形求助:如何用for循环实现房屋逐次缩小并调位

实现逐次缩小的3栋房屋场景(Python Turtle)

嘿,我来帮你搞定这个Turtle画房子的需求!咱们一步步来,先补全缺失的基础函数,再用循环实现房屋的缩放和位置调整。

1. 补全基础绘图函数

首先得把画房子各个部件的函数写好——正方形主体、屋顶、门、窗户:

import turtle

def housesquare(turtlename, hs):
    # 画房子的正方形主体
    turtlename.pendown()
    for _ in range(4):
        turtlename.forward(hs)
        turtlename.left(90)
    turtlename.penup()

def draw_roof(turtlename, hs):
    # 画三角形屋顶(底边和房子主体等宽)
    turtlename.pendown()
    turtlename.left(45)
    turtlename.forward(hs * (2**0.5)/2)  # 等腰直角三角形的腰长
    turtlename.right(90)
    turtlename.forward(hs * (2**0.5)/2)
    turtlename.right(135)
    turtlename.penup()

def draw_door(turtlename, hs):
    # 画门(宽度为房子的1/5,高度为1/2)
    door_width = hs / 5
    door_height = hs / 2
    turtlename.pendown()
    for _ in range(2):
        turtlename.forward(door_width)
        turtlename.left(90)
        turtlename.forward(door_height)
        turtlename.left(90)
    turtlename.penup()

def draw_window(turtlename, window_size):
    # 画窗户(正方形,带十字格)
    turtlename.pendown()
    # 画外框
    for _ in range(4):
        turtlename.forward(window_size)
        turtlename.left(90)
    # 画十字格
    turtlename.forward(window_size/2)
    turtlename.left(90)
    turtlename.forward(window_size)
    turtlename.backward(window_size/2)
    turtlename.right(90)
    turtlename.forward(window_size/2)
    turtlename.backward(window_size)
    turtlename.penup()

2. 完善你的house函数

接下来把这些部件整合到你的house函数里,计算每个部件的位置坐标:

def house(turtlename, hs):
    # 画正方形主体
    housesquare(turtlename, hs)
    
    # 画屋顶:移动到房子顶部中点
    turtlename.goto(turtlename.xcor() + hs/2, turtlename.ycor() + hs)
    draw_roof(turtlename, hs)
    
    # 画门:移动到房子底部中间位置
    turtlename.goto(turtlename.xcor() + hs/2 - hs/10, turtlename.ycor() - hs)
    draw_door(turtlename, hs)
    
    # 画左侧窗户:位置在主体左上方
    window_size = hs / 4
    turtlename.goto(turtlename.xcor() + hs/10, turtlename.ycor() + hs/4)
    draw_window(turtlename, window_size)
    
    # 画右侧窗户:位置在主体右上方
    turtlename.goto(turtlename.xcor() + hs - hs/5 - window_size, turtlename.ycor())
    draw_window(turtlename, window_size)

3. 用循环生成3栋逐次缩小的房子

最后用for...in range()循环,每次调整房屋尺寸(比如乘以0.8的缩放因子)和位置(每次往右平移,避免重叠):

if __name__ == "__main__":
    # 创建海龟对象
    t = turtle.Turtle()
    t.speed(2)  # 调整绘图速度,1最慢,10最快,0瞬间完成
    
    # 初始房屋尺寸和起始位置
    initial_size = 150
    start_x = -200
    start_y = 0
    scale_factor = 0.8  # 每次缩小的比例
    
    # 循环画3栋房子
    for i in range(3):
        current_size = initial_size * (scale_factor ** i)
        t.penup()
        # 计算当前房子的起始位置:每次往右平移,避免重叠
        t.goto(start_x + i * (initial_size * 0.6), start_y - i * (initial_size * 0.2))
        house(t, current_size)
    
    # 隐藏海龟,保持窗口显示
    t.hideturtle()
    turtle.done()

关键说明

  • 缩放逻辑:通过scale_factor控制每次房屋缩小的比例,这里用了initial_size * (scale_factor ** i),第1栋是初始尺寸,第2栋是初始尺寸×0.8,第3栋是初始尺寸×0.8²。
  • 位置调整:每次循环把房子往右平移initial_size * 0.6,同时稍微往下移一点,让布局更自然,避免重叠。
  • 坐标计算:所有部件的位置都是基于房子主体的起始坐标计算的,确保每个部件都对应到正确的位置。

内容的提问来源于stack exchange,提问作者Techincal Hacks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:39:26