Skip to content

Instantly share code, notes, and snippets.

@Mumakil
Last active January 14, 2016 06:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Mumakil/2a4c169b733a9d2c4f9d to your computer and use it in GitHub Desktop.
Save Mumakil/2a4c169b733a9d2c4f9d to your computer and use it in GitHub Desktop.
Elevator saga engine http://play.elevatorsaga.com/

Elevator Saga program

My elevator control program for the elevator saga game.

Iterations

  1. Listen to all button presses and play them back in order.
  • Beat level 1.
  1. Add going up / down indicators and drive all the way to the specific direction.
  • Beat level 3.
  1. Multiple elevators. Track idle elevators, send closest to pressed floor. Take passenger to destination.
  • Beat level 5.
{
init: function(elevators, floors) {
var idleElevators = elevators.slice();
var waitingPassengers = [];
var sendNextIdleElevator = function () {
if (idleElevators.length == 0) {
return
}
if (waitingPassengers.length == 0) {
return;
}
var closest, targetFloor;
targetFloor = waitingPassengers.shift();
closest = idleElevators.reduce(function (cur, elevator) {
if (!cur) {
return elevator;
}
if (Math.abs(cur.currentFloor() - targetFloor) < Math.abs(elevator.currentFloor() - targetFloor)) {
return cur;
} else {
return elevator;
}
});
closest.goToFloor(targetFloor);
idleElevators = idleElevators.filter(function (e) { return e != closest; });
};
elevators.forEach(function (elevator, num) {
elevator.on('floor_button_pressed', function (floorNumber) {
elevator.goToFloor(floorNumber);
if (idleElevators.indexOf(elevator) >= 0) {
idleElevators = idleElevators.filter(function (e) { return e != elevator; });
}
console.log("Elevator", num, "going to floor", floorNumber);
});
elevator.on('stopped_at_floor', function (floorNumber) {
console.log('Elevator', num ,'stopped at floor', floorNumber);
waitingPassengers = waitingPassengers.filter(function (f) { return f != floorNumber; });
});
elevator.on('idle', function() {
console.log('Elevator', num, 'idle');
idleElevators.push(elevator);
sendNextIdleElevator();
});
});
floors.forEach(function (floor) {
var floorNumber = floor.floorNum();
floor.on('up_button_pressed', function () {
console.log('Passenger at floor', floorNumber, 'wants to go up.');
if (waitingPassengers.indexOf(floorNumber) < 0) {
waitingPassengers.push(floorNumber);
}
sendNextIdleElevator();
});
floor.on('down_button_pressed', function () {
console.log('Passenger at floor', floorNumber, 'wants to go down.');
if (waitingPassengers.indexOf(floorNumber) < 0) {
waitingPassengers.push(floorNumber);
}
sendNextIdleElevator();
});
});
},
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