一个电梯运行的模拟实现

用Java写了一个类似电梯模拟器的一段代码,运行了下,还没有发现大问题,记录如下:

基本思路:

模拟电梯运行(为单一电梯,未考虑达到承载上限,最短等待时间等问题)

基本条件:

1、电梯有三种状态:静止,向上,向下。

2、每层的指示灯有三种状态:向上、向下、到达(只开门)。

3、开门上人1秒,每上或下一层用0.1秒。

伦理片 http://www.dotdy.com/

实现方案:

使用一个队列(可看做时间优先)将所有按钮事件依次入队。

当电梯静止时首先响应队头的按钮事件,并根据按钮楼层和当前楼层的位置确定移动方向; 当向上移动时,将移动到所有亮灯的按钮所在楼层的最高层,当按钮方向和电梯方向一致时或该楼层内部到达按钮亮起时开门;向下移动类似。 当队列中没有按钮事件时,电梯静止。有些类似LOOK算数,但没有按钮事件时不会来回扫描。

使用主线程来控制电梯上下,需要注意同步“设置和获取电梯按钮最高层或按钮最底层数的方法”。

 

主方法用来不断循环监测:

Java代码   收藏代码
  1. while(true){  
  2.             if(!ele.getPushedFloor().isEmpty()){  
  3.                 int nextFloor = ele.getPushedFloor().peek();  
  4.                 if(nextFloor > 0){//向上的按钮  
  5.                     if(ele.getCurFloor() - nextFloor <= 0){  
  6.                         ele.liftUp();  
  7.                     }else if(ele.getCurFloor() - nextFloor > 0){  
  8.                         ele.liftDown();  
  9.                     }  
  10.                 }else{//向下的按钮  
  11.                     if(ele.getCurFloor() + nextFloor < 0){  
  12.                         ele.liftUp();  
  13.                     }else if(ele.getCurFloor() + nextFloor >= 0){  
  14.                         ele.liftDown();  
  15.                     }  
  16.                 }  
  17.             }else{  
  18.                 ele.setStat(RunningStat.INIT);  
  19.             }  
  20.             Thread.sleep(100);  
  21.         }  

 电梯上升方法:

Java代码   收藏代码
  1. public void liftUp() throws InterruptedException{  
  2.         setStat(RunningStat.UP);  
  3.         int floorIdx = curFloor;  
  4.         while(floorIdx <= this.getLiftTop()){  
  5.             curFloor = floorIdx;  
  6.             if(btnMap.get(floorIdx).isUpLightOn()){  
  7.                 openDoor(floorIdx, true);  
  8.                 btnMap.get(floorIdx).setUpLightOn(false);  
  9.             }else if(btnMap.get(floorIdx).isInnerLightOn()){  
  10.                 justOpenDoor(floorIdx);  
  11.             }  
  12.             /** 
  13.              * 模拟电梯上升 
  14.              */  
  15.             Thread.sleep(100);  
  16.             floorIdx++;  
  17.         }  
  18.         synchronized (this) {  
  19.             //需要注意,若“当前层”达到最高层需重新初始化最高层指示变量  
  20.             if(this.getLiftTop() == curFloor){  
  21.                 this.setLiftTop(bottom - 1);  
  22.             }  
  23.         }  
  24.     }  

 定义了一个User线程,模拟用户按下按钮

Java代码   收藏代码
  1. class User implements Runnable{  
  2.         @Override  
  3.         public void run() {  
  4.             int i = 0;  
  5.             while(i < 10){  
  6.                 i++;  
  7.                 int floor = RandomUtils.nextInt(top) + 1;  
  8.                 Button btn = ele.getButton(floor);  
  9.                 try {  
  10.                     if(floor == ele.top){  
  11.                         btn.push(floor, BtnDirec.DOWN);  
  12.                     }else if(floor % 2 == 0 || floor == ele.bottom){  
  13.                         btn.push(floor, BtnDirec.UP);  
  14.                     }else{  
  15.                         btn.push(floor, BtnDirec.DOWN);  
  16.                     }  
  17.                     Thread.sleep(500);  
  18.                 } catch (Exception e) {  
  19.                     e.printStackTrace();  
  20.                 }  
  21.             }  
  22.         }  
  23.     }  

 影音先锋电影 http://www.iskdy.com/

还定义了一个EleStat线程,监测电梯状态并打印的后台,日志类似:

Java代码   收藏代码
  1. The elevator started  
  2. The elevator is no moving, cur:1  
  3. 5 floor down light on  
  4. 5 ↓,  
  5. The elevator is lift up, cur:1  
  6. 5 ↓,  
  7. The elevator is lift up, cur:2  
  8. 5 ↓,  
  9. The elevator is lift up, cur:3  
  10. 5 ↓,  
  11. The elevator is lift up, cur:4  
  12. 5 ↓,  
  13. The elevator is lift up, cur:5  
  14. 10 floor up light on  
  15. 5 ↓,10 ↑,  
  16. The elevator is lift up, cur:6  
  17. 5 ↓,10 ↑,  
  18. The elevator is lift up, cur:7  
  19. 5 ↓,10 ↑,  
  20. The elevator is lift up, cur:8  
  21. 5 ↓,10 ↑,  
  22. The elevator is lift up, cur:9  
  23. opening door on floor: 10 lift to:20  
  24. 5 ↓,20 -,  
  25. The elevator is lift up, cur:10  
  26. 12 floor up light on  
  27. 5 ↓,20 -,12 ↑,  
  28. The elevator is lift up, cur:10  
  29. 5 ↓,20 -,12 ↑,  
  30. The elevator is lift up, cur:10  
  31. 5 ↓,20 -,12 ↑,  
  32. The elevator is lift up, cur:10  
  33. 5 ↓,20 -,12 ↑,  
  34. The elevator is lift up, cur:10  
  35. 5 ↓,20 -,12 ↑,  
  36. The elevator is lift up, cur:10  
  37. 13 floor down light on  
  38. 5 ↓,20 -,12 ↑,13 ↓,  
  39. The elevator is lift up, cur:10  
  40. 5 ↓,20 -,12 ↑,13 ↓,  
  41. The elevator is lift up, cur:10  
  42. 5 ↓,20 -,12 ↑,13 ↓,  
  43. The elevator is lift up, cur:10  
  44. 5 ↓,20 -,12 ↑,13 ↓,  
  45. The elevator is lift up, cur:10  
  46. 5 ↓,20 -,12 ↑,13 ↓,  
  47. The elevator is lift up, cur:10  
  48. 14 floor up light on  
  49. 5 ↓,20 -,12 ↑,13 ↓,14 ↑,  
  50. The elevator is lift up, cur:11  
  51. opening door on floor: 12 lift to:20  
  52. 5 ↓,20 -,13 ↓,14 ↑,  
  53. 。。。  

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建立一座两层楼,一部电梯的模拟程序。为简化起见,每部电梯限乘一人,电梯每天在一楼关门等待。 三、具体要求及应提交的材料 模拟程序包括一个时钟,每天从零开始。模拟程序得调度器组件随机设置每一层第一个人到来的时间,当时钟的时间等于第一个人到来的时间时,模拟程序生成一个新到的人将该人放到这一层。然后这个人按下按钮,请求电梯开门。这个人的目的地楼层不能与他上电梯的楼层相同。 如果第一个人到达第一层,则可以在按下按钮、等待电梯开门之后立即进入电梯。如果第一个人在第2层,则电梯要升到第2层去接他。电梯从1层移到2层需要5秒。 电梯到达一层时,打开电梯门上的灯,并在电梯内发出铃声,该层的按钮和电梯中表示该层的按钮复位,电梯门打开,乘客走出电梯(如果有到该层的乘客)。另一乘客(如果该层有人等待)进入电梯按下目的层按钮,电梯们关上。电梯移动前确定移动方向(两层很容易判断),为简单起见,电梯到达一层直到关门所花时间为0。 任何时间每层最多只能有一人等待,如果新到的人(不在电梯中)要到达该层时该层被占用,则一秒后才能安排新到达者。假设每隔5到20秒人们随机到达每层。 要求: 对每个类(building,floor,elevator,person,button,time)设计 一个头文件,存放类定义,建立一个程序,存放类的实现。例如floor.h,floor.cpp 输出结果用文字表示即可,如“Person1 arriveds on Floor1, Person 1 enters Elevator”等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值