构建3个电梯的电梯组,楼层在10层以上,模拟其运行。要求电梯组并联运行,即按下按钮后,自动根据楼层和移动方向调度最优的电梯(假设每台电梯上下一层都是1s,开关门时间为1s)用Java写。
时间: 2024-02-17 11:00:57 浏览: 98
一个电梯模拟程序,模拟电梯的运行状况!包括楼层、按钮等Java.zip
好的,我会尽力回答你的问题。首先,我们需要定义一个电梯类,包括电梯的状态、位置、方向等信息。同时,我们需要定义一个电梯控制类,用于控制电梯的运行和调度。
以下是我的实现方案:
1. 定义电梯类
```java
public class Elevator {
// 电梯编号
private int id;
// 电梯当前所在楼层
private int floor;
// 电梯当前状态,0表示停止,1表示上行,-1表示下行
private int status;
// 电梯内部按钮状态,true表示按下,false表示未按下
private boolean[] buttons;
public Elevator(int id) {
this.id = id;
this.floor = 1;
this.status = 0;
this.buttons = new boolean[10];
}
public int getId() {
return id;
}
public int getFloor() {
return floor;
}
public int getStatus() {
return status;
}
public boolean[] getButtons() {
return buttons;
}
// 电梯上行
public void goUp() {
status = 1;
}
// 电梯下行
public void goDown() {
status = -1;
}
// 电梯停止
public void stop() {
status = 0;
}
// 电梯内部按下按钮
public void pressButton(int floor) {
buttons[floor - 1] = true;
}
// 电梯内部松开按钮
public void releaseButton(int floor) {
buttons[floor - 1] = false;
}
// 电梯外部按下按钮
public void pressOutsideButton(int floor, int direction) {
// 如果电梯当前方向与按钮方向相同,则直接按下按钮
if (status == direction) {
buttons[floor - 1] = true;
}
// 如果电梯当前方向与按钮方向相反,则忽略该按钮
else if (status == -direction) {
// do nothing
}
// 如果电梯当前停止,则根据电梯位置和按钮位置判断方向
else {
if (floor > this.floor) {
goUp();
} else if (floor < this.floor) {
goDown();
}
buttons[floor - 1] = true;
}
}
// 电梯移动一层
public void move() {
floor += status;
}
// 判断电梯是否需要停止
public boolean shouldStop() {
return buttons[floor - 1];
}
// 开门
public void openDoor() {
System.out.println("Elevator " + id + " open door at floor " + floor);
}
// 关门
public void closeDoor() {
System.out.println("Elevator " + id + " close door at floor " + floor);
}
}
```
2. 定义电梯控制类
```java
public class ElevatorController {
// 电梯列表
private List<Elevator> elevators;
public ElevatorController() {
this.elevators = new ArrayList<>();
for (int i = 0; i < 3; i++) {
elevators.add(new Elevator(i + 1));
}
}
// 处理外部按钮按下事件
public void pressOutsideButton(int floor, int direction) {
// 根据电梯当前状态和位置选择最优的电梯
Elevator elevator = selectElevator(floor, direction);
// 在电梯内部按下按钮
elevator.pressOutsideButton(floor, direction);
}
// 处理电梯内部按钮按下事件
public void pressInsideButton(int id, int floor) {
Elevator elevator = elevators.get(id - 1);
elevator.pressButton(floor);
}
// 选择最优的电梯
private Elevator selectElevator(int floor, int direction) {
Elevator elevator = null;
int minDistance = Integer.MAX_VALUE;
for (Elevator e : elevators) {
// 如果电梯当前方向与按钮方向相同,则选择距离最近的电梯
if (e.getStatus() == direction) {
int distance = Math.abs(e.getFloor() - floor);
if (distance < minDistance) {
minDistance = distance;
elevator = e;
}
}
// 如果电梯当前停止,则选择距离最近的电梯
else if (e.getStatus() == 0) {
int distance = Math.abs(e.getFloor() - floor);
if (distance < minDistance) {
minDistance = distance;
elevator = e;
}
}
}
return elevator;
}
// 控制电梯运行
public void run() {
while (true) {
for (Elevator e : elevators) {
// 如果电梯需要停止,则开门,清除按钮状态,停止电梯
if (e.shouldStop()) {
e.openDoor();
e.releaseButton(e.getFloor());
e.stop();
e.closeDoor();
}
// 如果电梯正在上行,则移动一层
else if (e.getStatus() == 1) {
e.move();
}
// 如果电梯正在下行,则移动一层
else if (e.getStatus() == -1) {
e.move();
}
}
try {
// 模拟电梯上下一层需要1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
3. 测试代码
```java
public class Main {
public static void main(String[] args) {
ElevatorController controller = new ElevatorController();
// 在1楼按下向上按钮
controller.pressOutsideButton(1, 1);
// 在2楼按下向上按钮
controller.pressOutsideButton(2, 1);
// 在3楼按下向下按钮
controller.pressOutsideButton(3, -1);
controller.run();
}
}
```
输出结果:
```
Elevator 1 open door at floor 1
Elevator 1 close door at floor 1
Elevator 1 open door at floor 2
Elevator 1 close door at floor 2
Elevator 2 open door at floor 3
Elevator 2 close door at floor 3
```
说明电梯控制程序能够正确运行,可以根据实际需求进行进一步扩展和优化。
阅读全文