我在python中使用电梯模拟器需要帮助,但我经验不足。用户输入的客户数量应具有随机的起始楼层和目标楼层。现在,我只是在编码电梯的简单策略,即一直到顶部,然后再回到底部。当我运行代码时,程序无限循环。我不知道为什么。另外,我不确定如何对建筑物的输出方法进行编码,我想显示哪些客户拥有哪些楼层以及电梯访问了多少楼层。谢谢你的帮助。
import random
class Elevator(object):
def __init__(self, num_of_floors, register_list, direction = "up", cur_floor=1):
self.total_floors = num_of_floors
self.reg_list = register_list
self.floor = cur_floor
self.direct = direction
def move(self):
"""Moves the elevator one floor"""
if self.total_floors == self.floor:
self.direct = "down"
if self.direct == "up":
self.floor += 1
else:
self.floor -= 1
def register_customer(self, customer):
self.reg_list.append(customer)
def cancel_customer(self, customer):
self.reg_list.remove(customer)
class Building(object):
def __init__(self, num_of_floors, customer_list, elevator):
self.total_floors = num_of_floors
self.customers = customer_list
def run(self):
while elevator.floor != 0:
for customer in self.customers:
if elevator.floor == customer.on_floor:
elevator.reg_list.append(customer)
customer.indicator = 1
elif elevator.floor == customer.going_floor:
elevator.reg_list.remove(customer)
customer.indicator = 0
customer.fin = 1
elevator.move()
def output(self):
pass
class Customer(object):
def __init__(self, ID, num_of_floors, cur_floor=0, dst_floor=0, in_elevator=0, finished=0):
self.ident = ID
self.indicator = in_elevator
self.fin = finished
cur_floor = random.randint(1, num_of_floors)
self.on_floor = cur_floor
dst_floor = random.randint(1, num_of_floors)
while dst_floor == cur_floor:
dst_floor = random.randint(1, num_of_floors)
self.going_floor = dst_floor
customer_count = int(input("How many customers are in the building?: "))
floor_count = int(input("How many floors does the building have?: "))
cus_list = []
for i in range(1, customer_count+1):
cus_list.append(Customer(i, floor_count))
elevator = Elevator(floor_count, cus_list)
building = Building(floor_count, cus_list, elevator)
最佳答案
您的问题出在这里:
def run(self):
while elevator.floor != 0:
print(elevator.floor)
for customer in self.customers:
print(customer)
if elevator.floor == customer.on_floor:
elevator.reg_list.append(customer)
customer.indicator = 1
elif elevator.floor == customer.going_floor:
elevator.reg_list.remove(customer)
customer.indicator = 0
customer.fin = 1
elevator.move()
当您执行lift.reg_list.append(customer)时,您会将客户重新添加到列表中,从而增加了它的大小(self.customers也是对该相同列表的引用),因此“ for self.customers中的客户”循环永远。
让我们跟随“ cus_list”:
elevator = Elevator(floor_count, cus_list)
building = Building(floor_count, cus_list, elevator)
class Building(object):
def __init__(self, num_of_floors, customer_list, elevator):
self.total_floors = num_of_floors
self.customers = customer_list
class Elevator(object):
def __init__(self, num_of_floors, register_list, direction = "up", cur_floor=1):
self.total_floors = num_of_floors
self.reg_list = register_list # <-------- THIS IS "cus_list" reference
最后在课堂上建设:
elevator.reg_list.append(customer)
电梯是在FYI类范围之外创建的全局变量。
解决方法如下
电梯开始是空的吧?
class Elevator(object):
def __init__(self, num_of_floors, register_list, direction = "up", cur_floor=1):
self.total_floors = num_of_floors
self.reg_list = []