Skip to content

Instantly share code, notes, and snippets.

@kevin-brown
Created January 25, 2015 02:24
Show Gist options
  • Save kevin-brown/15371214aae59dc8ab23 to your computer and use it in GitHub Desktop.
Save kevin-brown/15371214aae59dc8ab23 to your computer and use it in GitHub Desktop.
{
init: function(elevators, floors) {
function randomElevator(elevators) {
return elevators[Math.floor(Math.random() * elevators.length)];
};
function bestElevator(floorNum) {
var bestElevator = elevators[0];
var emptyElevators = [];
for (var e = 0; e < elevators.length; e++) {
var elevator = elevators[e];
if (elevator.loadFactor() === 0) {
emptyElevators.push(elevator);
}
}
if (emptyElevators.length !== 0) {
return randomElevator(emptyElevators);
}
var nonEmptyElevators = [];
for (var e = 0; e < elevators.length; e++) {
var elevator = elevators[e];
if (elevator.loadFactor() !== 1) {
nonEmptyElevators.push(elevator);
}
}
if (nonEmptyElevators.length === 0) {
return randomElevator(elevators);
}
bestElevator = nonEmptyElevators[0];
var onRouteElevators = [];
for (var e = 0; e < nonEmptyElevators.length; e++) {
var elevator = nonEmptyElevators[e];
if (elevator.goingUp) {
if (elevator.currentFloor() < floorNum) {
onRouteElevators.push(elevator);
}
} else {
if (elevator.currentFloor() > floorNum) {
onRouteElevators.push(elevator);
}
}
}
if (onRouteElevators.length === 0) {
onRouteElevators = nonEmptyElevators;
}
bestElevator = onRouteElevators[0];
for (var e = 0; e < onRouteElevators.length; e++) {
var elevator = onRouteElevators[e];
if (bestElevator.loadFactor() > elevator.loadFactor()) {
bestElevator = elevator;
}
}
return bestElevator;
}
function elevatorToFloor(elevator, floorNum) {
if (elevator.goingUp) {
if (elevator.currentFloor() > floorNum) {
elevatorDown(elevator, floorNum);
} else {
elevatorUp(elevator, floorNum);
}
} else {
if (elevator.currentFloor() < floorNum) {
elevatorUp(elevator, floorNum);
} else {
elevatorDown(elevator, floorNum);
}
}
refreshElevatorQueue(elevator);
}
function elevatorDown(elevator, floorNum) {
if (elevator.downQueue.indexOf(floorNum) !== -1) {
return;
}
elevator.downQueue.push(floorNum);
elevator.downQueue.sort().reverse();
}
function elevatorUp(elevator, floorNum) {
if (elevator.upQueue.indexOf(floorNum) !== -1) {
return;
}
elevator.upQueue.push(floorNum);
elevator.upQueue.sort();
}
function elevatorRemoveFloor(elevator, floorNum) {
if (elevator.upQueue.indexOf(floorNum) !== -1) {
elevator.upQueue.splice(elevator.upQueue.indexOf(floorNum), 1);
}
if (elevator.downQueue.indexOf(floorNum) !== -1) {
elevator.downQueue.splice(elevator.downQueue.indexOf(floorNum), 1);
}
}
function refreshElevatorQueue (elevator) {
if (elevator.goingUp) {
elevator.destinationQueue = elevator.upQueue;
} else {
elevator.destinationQueue = elevator.downQueue;
}
elevator.checkDestinationQueue();
}
function elevatorButtonPressed(elevator) {
return function (floorNum) {
elevatorToFloor(elevator, floorNum);
};
}
function elevatorStopped(elevator) {
return function (floorNum) {
elevatorRemoveFloor(elevator, floorNum);
};
}
function elevatorIdle(elevator) {
return function () {
elevator.goingUp = !elevator.goingUp;
var homeFloor = Math.floor(floors.length / 2);
if (elevator.goingUp) {
if (elevator.currentFloor() < homeFloor) {
elevatorToFloor(elevator, homeFloor);
} else {
elevatorToFloor(elevator, floors.length - 1);
}
} else {
if (elevator.currentFloor() > homeFloor) {
elevatorToFloor(elevator, homeFloor);
} else {
elevatorToFloor(elevator, 0);
}
}
};
}
for (var e = 0; e < elevators.length; e++) {
var elevator = elevators[e];
elevator.goingUp = true;
elevator.upQueue = [];
elevator.downQueue = [];
elevator.on("floor_button_pressed", elevatorButtonPressed(elevator));
elevator.on("stopped_at_floor", elevatorStopped(elevator));
elevator.on("idle", elevatorIdle(elevator));
}
function handleFloorUp (floor) {
return function () {
var elevator = bestElevator(floor.floorNum());
elevatorToFloor(elevator, floor.floorNum());
}
}
function handleFloorDown (floor) {
return function () {
var elevator = bestElevator(floor.floorNum());
elevatorToFloor(elevator, floor.floorNum());
}
}
for (var f = 0; f < floors.length; f++) {
var floor = floors[f];
floor.on("up_button_pressed", handleFloorUp(floor));
floor.on("down_button_pressed", handleFloorDown(floor));
}
},
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