电梯传奇 帮助和API文档

游戏简介

这是一款编程游戏!
你的任务是用JavaScript编写一个程序来规划电梯的运动。

目标是让人们以一种有效的方式来运输。
取决于你做得有多好,你可以在更困难的挑战中进步。
只有最优秀的项目才能完成所有的挑战。

游戏规则

在游戏视图下的输入窗口中输入您的代码,并按下开始按钮启动挑战。

你可以通过按下按钮来增加或减少时间的速度。

如果您的程序包含错误,您可以在web浏览器中使用开发工具来调试它。如果您想从代码开始,按下重置按钮。这将把代码还原为一个工作但过于简单的实现。
如果你有一个喜欢的文本编辑器,比如“txt文本”,你可以随意编辑代码并粘贴到游戏编辑器中。

您的代码自动保存在本地存储中,因此不必担心——如果您不小心关闭了浏览器,它不会消失。

基础知识

您的代码必须声明一个包含至少两个名为init和update的函数的对象。例如:

{
    init: function(elevators, floors) {
        // Do stuff with the elevators and floors, which are both arrays of objects
    },
    update: function(dt, elevators, floors) {
        // Do more stuff with the elevators and floors
        // dt is the number of game seconds that passed since the last time update was called
    }
}

在挑战中,这些功能将被游戏调用。

当挑战开始时,init将被调用,并且在挑战中不断更新。

通常,您需要把大部分代码放在init函数中,以设置事件侦听器和逻辑。

代码示例

如何控制电梯

elevator.goToFloor(1);
在完成其他任务后,告诉电梯移到第1层。请注意,如果电梯已经排队进入到地板上,这将没有效果。
if(elevator.currentFloor() > 2) { ... }
调用currentFloor获取当前电梯的楼层编号。请注意,这是一个整数,并不一定意味着电梯处于停止状态。

监听事件

有可能会监听到一些事情,比如在地板上停下来,或者按下按钮。

elevator.on("idle", function() { elevator.goToFloor(0); });
听电梯发出的“idle”事件,当任务队列被清空,电梯什么也不做。在这个例子中,我们告诉它移动到0层。
elevator.on("floor_button_pressed", function(floorNum) { ... } );
当乘客按下电梯内的按钮时,请收听“floor_button_pressed”事件。这表明乘客想要到那层楼去。
floor.on("up_button_pressed", function() { ... } );
监听“up_button_pressed”事件,当一个乘客按下了他们正在等待的地板上的按钮时发出的。这表明乘客想要到另一层楼去。

API文档

电梯对象

性质 类型 说明 举例
goToFloorfunction排队电梯去指定楼层号码。如果你把它指定为第二个参数,电梯就会直接进入到那个楼层,然后再进入其他排队的楼层。
elevator.goToFloor(3); // Do it after anything else
elevator.goToFloor(2, true); // Do it before anything else
stopfunction清除目标队列,并在电梯移动时停止。注意,你通常不需要停止电梯——它是为先进的解决方案和过境的重新调度逻辑。同时,注意电梯可能不会停在地板上,所以乘客不会下车。
elevator.stop();
currentFloorfunction获取当前电梯的楼层编号。
if(elevator.currentFloor() === 0) {
    // Do something special?
}
goingUpIndicatorfunction获取或设置上升指示器,在楼层停车时影响乘客的行为。
if(elevator.goingUpIndicator()) {
    elevator.goingDownIndicator(false);
}
goingDownIndicatorfunction获取或设置下拉指示器,当在地板上停车时,会影响乘客的行为。
if(elevator.goingDownIndicator()) {
    elevator.goingUpIndicator(false);
}
maxPassengerCountfunction获得最多可同时占据电梯的乘客数。
if(elevator.maxPassengerCount() > 5) {
    // Use this elevator for something special, because it's big
}
loadFactorfunction获取电梯的负载因素。0表示空,1表示满。随旅客重量的变化而变化,而不是精确的测量。
if(elevator.loadFactor() < 0.4) {
    // Maybe use this elevator, since it's not full yet?
}
destinationDirectionfunction 得到电梯朝向的方向。可以是"up", "down" 或 "stopped"。
destinationQueuearray当前的目标队列,意味着电梯的楼层数。如果需要,可以修改和清空。注意,您需要调用checkDestinationQueue(),以便更改立即生效。
elevator.destinationQueue = [];
elevator.checkDestinationQueue();
checkDestinationQueuefunction检查目的地队列,以获得任何新的目的地。注意,如果您显式地修改了目标队列,您只需要调用它。
elevator.checkDestinationQueue();
getPressedFloorsfunction获取当前按下的楼层数字作为数组。
if(elevator.getPressedFloors().length > 0) {
    // Maybe go to some chosen floor first?
}
事件 说明举例
idle当电梯完成所有任务并没有做任何事情时触发。
elevator.on("idle", function() { ... });
floor_button_pressed当乘客按下电梯内的按钮时触发。
elevator.on("floor_button_pressed", function(floorNum) {
    // Maybe tell the elevator to go to that floor?
})
passing_floor 在电梯会经过一层楼之前触发。现在是决定是否在那一层停下来的好时机。注意,此事件不会触发目的层。方向不是“up”就是“down”。
elevator.on("passing_floor", function(floorNum, direction) { ... });
stopped_at_floor当电梯到达地板时触发。
elevator.on("stopped_at_floor", function(floorNum) {
    // Maybe decide where to go next?
})

楼层对象

性质 类型 说明 举例
floorNumfunction得到地板物体的地板数。
if(floor.floorNum() > 3) { ... }
事件 说明 举例
up_button_pressed当有人按下了地板上的按钮时就触发了。请注意,如果乘客没有进入电梯,他们将再次按下按钮。
floor.on("up_button_pressed", function() {
    // Maybe tell an elevator to go to this floor?
})
down_button_pressed当有人按下了地板上的向下按钮时触发。请注意,如果乘客没有进入电梯,他们将再次按下按钮。
floor.on("down_button_pressed", function() {
    // Maybe tell an elevator to go to this floor?
})