📄 elevator.java
字号:
package Control;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import Data.StateData;
public class Elevator implements Runnable {
private boolean[] floorToStop = new boolean[11];
public boolean needOpen = false;//用于同层要求的标记值---刘畅
public int nextStop = 0;// 下一站
private int topStop = 1;// 需停留的最高楼层
private int bottomStop = 10;// 需停留的最低楼层
private boolean endTurn = false;// 是否在此方向的终点回头
public boolean running = false;
public int direction = 0;
public int number;
public boolean immediateOpen = false;
public boolean immediateClose = false;
public boolean stop = false;
//public static boolean outerTaskSet[][] = new boolean[10][2];
//静态数据
public static int numberOfRunningElevators = 0;
public static OuterTaskQueue outerTaskQueue = new OuterTaskQueue();
public static StateData data = new StateData();
public static double gateOpeningTime = 1;
public static double gateOpenTime = 3;
public static double timePerFloor = 1;
public static int oneSecond = 1000;
public static File record = new File("Record.txt");
public static FileWriter recordWriter;
public static void writeRecord(String str){
try {
recordWriter = new FileWriter(record,true);
recordWriter.append(str);
recordWriter.close();
} catch (IOException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
}
public void closeGate() {
writeRecord("The door of elevator " + number + "closed\n");
data.elevator[number].direction = -2;
int op = (int) (data.elevator[number].openedPercent * 100);
for (int i = op;data.elevator[number].openedPercent > 0 && !immediateOpen; i--) {
try {
Thread.sleep((int) (gateOpeningTime * oneSecond / 100));
} catch (Exception e) {
}
data.elevator[number].openedPercent -= 0.01;
}
if(immediateOpen){
immediateOpen = false;
openGate();
if(!immediateClose){
try {
Thread.sleep((int) (gateOpenTime * oneSecond));
} catch (Exception e) {
}
}
immediateClose = false;
closeGate();
}
data.elevator[number].direction = direction;
}
public void openGate() {
writeRecord("The door of elevator " + number + "opened\n");
data.elevator[number].direction = 2;
int op = (int) (data.elevator[number].openedPercent * 100);
for (int i = op; data.elevator[number].openedPercent < 1; i++) {
try {
Thread.sleep((int) (gateOpeningTime * oneSecond / 100));
} catch (Exception e) {
}
data.elevator[number].openedPercent += 0.01;
}
}
public void findNextStop() {
if (direction > 0) {
for (int i = data.elevator[number].floor; i <= 10; i++) {
if (floorToStop[i]){
nextStop = i;
break;
}
}
} else if(direction < 0){
for (int i = data.elevator[number].floor; i >= 1; i--) {
if (floorToStop[i]){
nextStop = i;
break;
}
}
}
}
public void addStop(int stopFloor) {
floorToStop[stopFloor] = true;
if (direction == 0){
if (stopFloor > data.elevator[number].floor)
direction = 1;
if (stopFloor < data.elevator[number].floor)
direction = -1;
}
if ((stopFloor - data.elevator[number].floor) * direction < 0)
endTurn = true;
if (stopFloor > topStop)
topStop = stopFloor;
if (stopFloor < bottomStop)
bottomStop = stopFloor;
}
private void getOuterTask() {
if (outerTaskQueue.number > 0){
OuterTask task = outerTaskQueue.dequeue();
addStop(task.floor);
if ((task.floor - data.elevator[number].floor) * task.direction < 0)
endTurn = true;
}
}
public void run() {
while (running) {
try {
Thread.sleep((int) (timePerFloor * oneSecond));
} catch (Exception e) {
}
data.elevator[number].direction = direction;
//判断是否因为同层请求而要开门
if(needOpen) {
needOpen = false;
openGate();
if(!immediateClose){
try {
Thread.sleep((int) (gateOpenTime * oneSecond));
} catch (Exception e) {
}
}
closeGate();
}
if (stop || direction == 0){
if(immediateOpen){
immediateOpen = false;
openGate();
if(!immediateClose){
try {
Thread.sleep((int) (gateOpenTime * oneSecond));
} catch (Exception e) {
}
}
immediateClose = false;
closeGate();
}
continue;
}
if (nextStop != 0) // 当前有任务
{
if (data.elevator[number].floor == nextStop) {
floorToStop[data.elevator[number].floor] = false;
findNextStop();
data.elevator[number].light[data.elevator[number].floor] = 0;
if (direction >= 0)
data.floor.upLight[data.elevator[number].floor] = 0;
if (direction <= 0)
data.floor.downLight[data.elevator[number].floor] = 0;
if (direction == 0){
bottomStop = 10;
topStop = 1;
}
if (data.elevator[number].floor == bottomStop
&& data.elevator[number].direction == -1) {
bottomStop = 10;
if (endTurn) {
direction = 1;
findNextStop();
endTurn = false;
} else {
nextStop = 0;
direction = 0;
}
} else if (data.elevator[number].floor == topStop
&& direction == 1) {
topStop = 1;
if (endTurn) {
direction = -1;
findNextStop();
endTurn = false;
} else {
nextStop = 0;
direction = 0;
}
} else if(data.elevator[number].floor == topStop || data.elevator[number].floor == bottomStop){
nextStop = 0;
direction = 0;
}
data.elevator[number].direction = direction;
openGate();
if(!immediateClose){
try {
Thread.sleep((int) (gateOpenTime * oneSecond));
} catch (Exception e) {
}
}
immediateClose = false;
closeGate();
if(immediateOpen){
immediateOpen = false;
openGate();
if(!immediateClose){
try {
Thread.sleep((int) (gateOpenTime * oneSecond));
} catch (Exception e) {
}
}
closeGate();
}
data.elevator[number].direction = direction;
}
findNextStop();
data.elevator[number].direction = direction;
if(data.elevator[number].floor == 10 && data.elevator[number].direction == 1){
data.elevator[number].direction = 0;
direction = 0;
}
if(data.elevator[number].floor == 1 && data.elevator[number].direction == -1){
data.elevator[number].direction = 0;
direction = 0;
}
if(data.elevator[number].direction != 2 && data.elevator[number].direction != -2){
data.elevator[number].floor += direction;
}
writeRecord("Elevator " + number + " moved to floor " +data.elevator[number].floor +"\n");
} else {
getOuterTask();
findNextStop();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -