Skip to content

Instantly share code, notes, and snippets.

@chroju
Last active June 13, 2021 23:55
Show Gist options
  • Save chroju/2a5659053d8b5d39aa013ce491bf5b8d to your computer and use it in GitHub Desktop.
Save chroju/2a5659053d8b5d39aa013ce491bf5b8d to your computer and use it in GitHub Desktop.
Elevator Saga
{
init: function(elevators, floors) {
var floorUpStatus = Array(floors.length);
floorUpStatus.fill(false);
var floorDownStatus = Array(floors.length);
floorDownStatus.fill(false);
elevators.forEach(function(elevator, i, array) {
elevator.on("idle", function() {
console.log("### on idle")
switch (getIndicator(elevator)) {
case "up":
setIndicator(elevator, "idle");
for (let i = floors.length-1; i >= 0; i--) {
if (floorDownStatus[i]) {
setIndicator(elevator, "down");
elevator.goToFloor(i);
console.log(i + "F の下ボタンを迎えに行きます")
return;
}
}
if (getIndicator(elevator) === "idle") {
for (let i = 0; i < floors.length; i++) {
if (floorUpStatus[i]) {
setIndicator(elevator, "up");
elevator.goToFloor(i);
console.log(i + "F の上ボタンを迎えに行きます")
return;
}
}
}
console.log("ひまになりました")
break;
case "down":
setIndicator(elevator, "idle");
for (let i = 0; i < floors.length; i++) {
if (floorUpStatus[i]) {
setIndicator(elevator, "up");
elevator.goToFloor(i);
console.log(i + "F の上ボタンを迎えに行きます")
return;
}
}
if (getIndicator(elevator) === "idle") {
for (let i = floors.length; i >= 0; i--) {
if (floorDownStatus[i]) {
setIndicator(elevator, "down");
elevator.goToFloor(i);
console.log(i + "F の下ボタンを迎えに行きます")
return;
}
}
}
console.log("ひまになりました")
break;
default:
setIndicator(elevator, "idle");
console.log("ひまになりました")
}
});
elevator.on("floor_button_pressed", function(floorNum) {
queue = elevator.destinationQueue;
queue.push(floorNum);
decideQueues(elevator, queue);
});
elevator.on("passing_floor", function(floorNum, direction) {
if (getIndicator(elevator) === "up" && floorUpStatus[floorNum] && direction === "up") {
floorUpStatus[floorNum] = false;
elevator.goToFloor(floorNum, true);
} else if (getIndicator(elevator) === "down" && floorDownStatus[floorNum] && direction === "down") {
floorDownStatus[floorNum] = false;
elevator.goToFloor(floorNum, true);
}
});
elevator.on("stopped_at_floor", function(floorNum) {
if (getIndicator(elevator) === "up" && floorUpStatus[floorNum]) {
floorUpStatus[floorNum] = false;
} else if (getIndicator(elevator) === "down" && floorDownStatus[floorNum]) {
floorDownStatus[floorNum] = false;
}
});
});
floors.forEach(floor => {
floor.on("up_button_pressed", function() {
floorUpStatus[floor.floorNum()] = true;
for(let i = 0; i < elevators.length; i++) {
if (getIndicator(elevators[i]) === "up" && elevators[i].destinationDirection() === "up" && elevators[i].currentFloor() < floor.floorNum()) {
return;
}
}
for(let i = 0; i < elevators.length; i++) {
if (getIndicator(elevators[i]) === "up" && elevators[i].destinationDirection() === "down" && elevators[i].currentFloor() > floor.floorNum()) {
elevators[i].destinationQueue = [floor.floorNum()];
elevators[i].checkDestinationQueue;
return;
}
}
for(let i = 0; i < elevators.length; i++) {
if (getIndicator(elevators[i]) === "idle") {
console.log(floor.floorNum() + "F の上ボタンを迎えに行きます")
setIndicator(elevators[i], "up");
elevators[i].goToFloor(floor.floorNum());
return;
}
}
});
floor.on("down_button_pressed", function() {
floorDownStatus[floor.floorNum()] = true;
for(let i = 0; i < elevators.length; i++) {
if (getIndicator(elevators[i]) === "down" && elevators[i].destinationDirection() === "down" && elevators[i].currentFloor() > floor.floorNum()) {
return;
}
}
for(let i = 0; i < elevators.length; i++) {
if (getIndicator(elevators[i]) === "down" && elevators[i].destinationDirection() === "up" && elevators[i].currentFloor() < floor.floorNum()) {
elevators[i].destinationQueue = [floor.floorNum()];
elevators[i].checkDestinationQueue;
return;
}
}
for(let i = 0; i < elevators.length; i++) {
if (getIndicator(elevators[i]) === "idle") {
console.log(floor.floorNum() + "F の下ボタンを迎えに行きます")
setIndicator(elevators[i], "down");
elevators[i].goToFloor(floor.floorNum());
return;
}
}
});
});
function decideQueues(elevator, queue) {
if (queue.length === 0) {
queue = [floorNum];
} else if (getIndicator(elevator) === "up") {
queue.sort(function(a, b) {
return a - b;
});
} else if (getIndicator(elevator) === "down") {
queue.sort(function(a, b) {
return b - a;
});
}
console.log(getIndicator(elevator) + " へまいります")
elevator.destinationQueue = queue;
elevator.checkDestinationQueue();
}
function getIndicator(elevator) {
if (elevator.goingUpIndicator() && !elevator.goingDownIndicator()) {
return "up";
} else if (elevator.goingDownIndicator() && !elevator.goingUpIndicator()) {
return "down";
} else {
return "idle";
}
}
function setIndicator(elevator, direction) {
switch(direction) {
case "up":
elevator.goingUpIndicator(true);
elevator.goingDownIndicator(false);
break;
case "down":
elevator.goingUpIndicator(false);
elevator.goingDownIndicator(true);
break;
case "idle":
elevator.goingUpIndicator(false);
elevator.goingDownIndicator(false);
}
}
},
update: function(dt, elevators, floors) {
// We normally don't need to do anything here
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment