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
相关产品推荐
相关产品推荐

