2016-04-21 18 views
0

Pythonの私の下のループは、顧客のリストを通過すると、リストから顧客を取り除いたように見えますが、他の顧客のために繰り返されるのではなく、whileループの始めに戻ります。誰かが私が間違っていることを見てもらえますか?全体のコードは以下の通りです。Forループを使用したシンプルなエレベータープログラムPython。ループがリストのすべての項目を更新しないのはなぜですか?

author = 'Alan Doonan' 

import random 
import time 


class Building:                               # defines class building 
    number_of_floors = 0                            # sets number_of_floors variable to 0 
    customer_list = []                             # creates an empty array for customer_list 
    elevator = 0                              # sets elevator variable to 0 

    def __init__(self, floors, customers):                        # initialize Building 
     self.number_of_floors = floors                         # assigns floors entered to number_of_floors 
     for customerID in range(1, customers + 1):                      # assigns number of customers entered to customer_list in order 
      new = Customer(customerID,self.number_of_floors)                   # creates an instance called new of Customer class for number of customers entered in input 
      self.customer_list.append(new)                        # appends new instance of customer to customer_list 
     self.customer_list.sort(key = lambda x: x.current_floor)                  # sorts customer_list by current_floor customer is on            # prints 
     self.elevator = Elevator(floors,self.customer_list)                    # creates instance of elevator with inputted floors and assigns customer_list to register_list                   # prints 
     self.run()                              # runs run method below 

    def run(self):                              # method to operate the elevator 
     print('++++++++++++++++++++++++++ELEVATOR IS NOW STARTING+++++++++++++++')              # prints 
     print('There are %d customers in the building' % (len(self.customer_list)))              # prints 
     number_of_customers = len(self.customer_list)                     # assigns current number of customers to number_of_customers variable 
     self.output()                             # runs output method below 

    def output(self): 
     for customer in self.customer_list:                         #prints lists of customers in building and their details 
      print("Customer",customer.customerID,"is on floor",customer.current_floor,"and wants to go to",customer.destination_floor) 

     #ELEVATOR MOVING UP LOOP 
     while (self.elevator.current_floor < self.elevator.number_of_floors): 
      self.elevator.current_floor +=1 
      print('ELEVATOR MOVING UP') 
      print(len(self.customer_list),'Customers in lift.') 
      print('++++++++++++++++++++++++++++++++++++++++++++++++++++') 
      print('FLOOR',self.elevator.current_floor) 

      for customer in self.customer_list:                        # Loop for each instance of Custumer in customer_list 
       if (self.elevator.current_floor == customer.current_floor) & customer.customer_direction == 1: 
        customer.in_elevator = True 
        print('Customer',customer.customerID,'has entered the lift') 
       if (self.elevator.current_floor == customer.destination_floor) & (customer.in_elevator == True) & customer.customer_direction ==1: 
        customer.in_elevator = False 
        self.customer_list.remove(customer) 
        print(customer.customerID,'has reached their destination') 


     #ELEVATOR MOVING DOWN LOOP 
     while (self.elevator.current_floor <= self.number_of_floors) & (self.elevator.current_floor > 1): 
      self.elevator.current_floor -= 1 
      print(len(self.customer_list),'Customers in lift.') 
      print('ELEVATOR MOVING DOWN') 
      print('++++++++++++++++++++++++++++++++++++++++++++++++++++') 
      print('FLOOR',self.elevator.current_floor) 

      for customer in self.customer_list: 
       if (customer.in_elevator == True): 
        customer.current_floor = self.elevator.current_floor 
       if (self.elevator.current_floor == customer.destination_floor) & (customer.in_elevator == True) & (customer.customer_direction == -1): 
        customer.in_elevator = False 
        self.customer_list.remove(customer) 
        print('Customer',customer.customerID,'has reached their destination') 

     print('There are',len(self.customer_list),'trapped in the elevator')               #prints 
     print('There are',len(Elevator.register_list),'people left on the register') 
     print('Elevator run is done!!!')                        #prints 

     print('CUSTOMERS STUCK IN LIFT ARE BELOW') 
     for stuck in self.customer_list: 
      print('Cust. ID:',stuck.customerID,'Dest. Floor:',stuck.destination_floor,'Curr. Floor:',stuck.current_floor,'In Elevator',stuck.in_elevator,'Direction',stuck.customer_direction) 


class Elevator: 
    number_of_floors = 0                        # the number of floors 
    register_list = []                         # the list of customers in the elevator 
    current_floor = 0                         # the current floor of the elevator 
    up = 1                            # moves the elevator up 
    down = -1                           # moves the elevator down 

    def __init__(self, number_of_floors, register_list): 
     self.number_of_floors = number_of_floors 
     self.register_list = register_list 

    def move(self):                          # method to move the elevator by 1 floor 
     pass; 

    def register_customer(self, customers):                    # customer goes into elevator 
     for reg in customers: 
      self.register_list.append(reg) 



    def cancel_customer(self, customers):                    # customer goes out of the elevator 
     pass; 


class Customer: 
    current_floor = 0                         # the current floor of the elevator 
    destination_floor = 0                        # the destination floor of the elevator 
    customerID = 0                          # the customers ID 
    in_elevator = False                         # denotes whether customer is in the elevator 
    finished = False                         # denotes whether customer has reached the destination floor 
    customer_direction = 0 

    def __init__(self, customerID, floors):                    # initilize Customer class 
     self.customerID = customerID                     # assigns self.customerID to customerID 
     self.current_floor = random.randint(1, floors)                 # assigns self.current_floor to random int between 1 and floors entered 
     self.destination_floor = random.randint(1, floors)                # assigns seslf.destination_floor to random int between 1 and floors entered 
     while self.destination_floor == self.current_floor: 
      self.destination_floor = random.randint(1, floors) 
     if self.current_floor < self.destination_floor: 
      self.customer_direction = 1 
     else: 
      self.customer_direction = -1 

def header():                           # elevator animation at beginning of program 
    print("       ELEVATOR OPENING      ") 
    time.sleep(.2) 
    print("+++++++++++++++++++++++++++++||+++++++++++++++++++++++++++++++++++") 
    time.sleep(.2) 
    print("+++++++++++++++++++++++++|  |++++++++++++++++++++++++++++++++") 
    time.sleep(.2) 
    print("++++++++++++++++|        |+++++++++++++++++++") 
    time.sleep(.2) 
    print("++++++|             |+++++++++") 
    time.sleep(.2) 
    print("                 ") 
    time.sleep(.2) 
    print("       ELEVATOR CLOSING      ") 
    time.sleep(.2) 
    print("++++++|             |+++++++++") 
    time.sleep(.2) 
    print("++++++++++++++++|        |+++++++++++++++++++") 
    time.sleep(.2) 
    print("+++++++++++++++++++++++++|  |++++++++++++++++++++++++++++++++") 
    time.sleep(.2) 
    print("+++++++++++++++++++++++++++++||+++++++++++++++++++++++++++++++++++") 


def main():                            # main method 
    try:                            # try/except for user input menu 
     floors = int(input('Enter the number of floors: '))                # enter floors and assign to floors 
     customers = int(input('Enter number of customers: '))               # enter customers and assign to customers 
     building = Building(floors, customers) # instance of building created with inputs of floors and customers  # create instance of Building class (building) 
    except ValueError: 
     print('YOU DIDNT ENTER A NUMBER. START AGAIN.') 
     main() 


if __name__ == "__main__": 
    # header() 
    main() 

LINK TO FILE ON GITHUB

答えて

0

より多くの範囲を設けることなく、あなたの質問に答えるのは難しいです。より具体的にしてください。より正確な質問がなければ、私は確かに言うことはできませんので、あなたにこれを信じさせる入力と出力の例を挙げてください。ただし、同じ情報を印刷し続けるため、whileループの始めから開始しているように見える場合は、クラスの宣言方法と関係があります。クラス変数とインスタンス変数の両方としてcustomerIDがオーバーロードされています。詳細については、ドキュメントを参照してください。 https://docs.python.org/2/tutorial/classes.html#class-objects 基本的には、インスタンス変数でもある顧客内のクラス変数を取り除き、コメントの下にあるセクションをリファクタリングします。#ELEVATOR LOOPを移動し、それらを統合するループを下ります。ここでは不必要なコードです。次に、質問している質問を洗練して、より明確になるようにします。

関連する問題