Last active
June 13, 2021 23:55
-
-
Save chroju/2a5659053d8b5d39aa013ce491bf5b8d to your computer and use it in GitHub Desktop.
Elevator Saga
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
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