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

如何实现同一行内不同尺寸的房屋对象互不重叠?

街道无重叠房屋排列实现方案

需求

在同一行上排列指定数量的不同尺寸房屋,保证所有房屋互不重叠,形成完整街道。

你提供的原始代码(已添加中文注释)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:15:42