如何实现同一行内不同尺寸的房屋对象互不重叠?
街道无重叠房屋排列实现方案
需求
在同一行上排列指定数量的不同尺寸房屋,保证所有房屋互不重叠,形成完整街道。
你提供的原始代码(已添加中文注释)
def rue(nb_maisons): # 街道函数,参数是房屋数量 speed(0) # 设置绘图速度最快(应该是海龟绘图的操作) x = (-300, 300) # 定义x坐标范围,但写法错误,只是个元组 i = 0 while i < nb_maisons : # 循环创建指定数量的房屋 cote= randint(100,120) # 随机生成房屋边长(100-120) up() # 抬起画笔 coord1= randint(-100,300) # 随机生成房屋左下角x坐标 coord2= -300 + cote # 计算房屋左下角y坐标(底部在y=-300) z= coord1 while z < cote+1 : # 原代码漏了冒号,逻辑应该是遍历房屋占据的x区间? list = list + z # 语法错误:列表不能直接加整数,还把关键字list当变量名 # 添加z到列表 list d = d + coord1 # 完全错误的语法,逻辑混乱 goto(coord1,coord2) # 移动到房屋左下角 maison(cote) # 绘制指定边长的房屋(假设maison是自定义绘图函数) else coord1#not in list # 语法错误:else不能单独用,想表达坐标不冲突才继续? coord1= randint(-300,300) i=i+1
原始代码的问题
- 语法错误密集:while循环缺冒号、列表操作写法违规、
else使用不符合Python规则、误用关键字list作为变量名 - 碰撞检测逻辑失效:未正确记录已放置房屋的位置区间,无法判断新房屋是否会重叠
- 坐标范围未生效:
x = (-300,300)仅定义了一个元组,未实际限制坐标,可能导致房屋超出画布边界
修正后的可运行代码(带中文注释)
import random import turtle # 假设使用海龟绘图库,提前导入 def maison(cote): # 补充房屋绘制逻辑,此处以正方形房屋为例 turtle.down() for _ in range(4): turtle.forward(cote) turtle.left(90) turtle.up() def rue(nb_maisons): turtle.speed(0) # 设置最快绘图速度 occupied_intervals = [] # 存储已放置房屋的x轴占据区间(左端点,右端点) bottom_y = -300 # 所有房屋底部统一在y=-300的位置 i = 0 while i < nb_maisons: cote = random.randint(100, 120) # 随机生成房屋边长 # 循环寻找不重叠的房屋位置 while True: # 限制x坐标范围,确保房屋右端不超出画布边界300 left_x = random.randint(-300, 300 - cote) right_x = left_x + cote # 检查当前位置是否与已放置房屋重叠 overlap = False for (exist_left, exist_right) in occupied_intervals: if not (right_x <= exist_left or left_x >= exist_right): overlap = True break if not overlap: break # 找到合适位置,退出循环 # 记录当前房屋的占据区间 occupied_intervals.append((left_x, right_x)) # 移动到房屋左下角并绘制 turtle.goto(left_x, bottom_y) maison(cote) i += 1 # 测试示例:生成5栋房屋 rue(5) turtle.done()
修正点说明
- 新增
occupied_intervals列表记录每栋房屋的x轴区间,通过区间比对实现无重叠检测 - 限制x坐标生成范围,确保房屋不会超出
-300到300的画布边界 - 修复所有语法错误,替换合法变量名
- 补充
maison函数的示例实现,保证代码可直接运行
内容的提问来源于stack exchange,提问作者inssb
相关产品推荐
相关产品推荐

