java电梯模拟系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
第一章问题描述 (3)
第二章使用语言及涉及的知识 (3)
第三章界面设计 (3)
第四章模块设计 (7)
1.启动界面: (7)
2.管理界面(主界面): (7)
3.情境模拟界面 (7)
4.更改用户楼层: (7)
5.设置电梯信息: (8)
6.关于: (8)
第五章详细设计 (8)
1.本程序总共有15个类: (8)
2.各类之间的关系:(如下图) (8)
3.主要类的属性和主要方法图: (9)
第六章程序测试 (10)
第七章关键代码段 (15)
1.启动电梯: (15)
2.电梯载人: (22)
3.电梯到达目标层停止: (22)
4.电梯门开关: (23)
第八章程序缺点及其扩展 (24)
1.程序的缺点: (24)
2.程序扩展: (25)
第一章问题描述
电梯管理算法
某一幢楼20层,有两部互联的电梯。
基于线程思想,编写一个电梯调度程序。
要求:
a)每个电梯里面应该有一些按键:数字键,开门键,关门键等。
b)每层楼的每部电梯门口,应该有上行和下行按钮。
c)两部电梯门口的按钮是互联的,即当一个电梯的按钮按下去的时候,其他电梯的相应按钮也同时点亮,表示也按下去了。
d)调度算法是根据这两部电梯的状态,寻找离当前楼层最近的且和请求同方向的电梯予以响应。
e)所有电梯初始状态都在第一层。
每个电梯如果在它的上层或者下层没有相应请求情况下,则应该停在原地不动。
第二章使用语言及涉及的知识
使用语言:Java
涉及的知识: java基础知识,Java界面编程,Java绘图技术,Java多线程编程
第三章界面设计
程序启动界面:
程序主界面:
情境模拟界面电梯外面:
电梯里面
更改用户楼层
初始化电梯信息界面:
版本信息界面:
第四章模块设计
1.启动界面:
在程序启动时,首先启动一个闪屏,显示程序的基本信息,使用户对程序的名称及功能有个大致的印象。
2.管理界面(主界面):
管理界面主要分为两大部分,即AB电梯的按钮及显示屏,而每部电梯都包括外面版和内面板。
外面版由上下行按钮和液晶屏组成,内面板包括数字键(楼层号)和开关门键。
每部电梯还有显示用户当前所在楼层的显示板。
3.情境模拟界面
情境模拟界面采用仿真电梯界面,当用户请求上行或者下行后,电梯启动并到达用户所在楼层,打开电梯门并转换电梯内外场景;当用户进入电梯内部后可以关闭电梯门并允许用户选择要到达的楼层;当到达目标楼层后,打开电梯门,切换到电梯外关闭电梯门。
模拟完成!
4.更改用户楼层:
该界面有一个标签,一个文本框和两个按钮组成,实现更改用户所在楼层的功能。
5.设置电梯信息:
主要有一些标签和文本框组成,可以设置电梯的初始信息,包括初始用户信息。
6.关于:
显示程序的基本信息。
第五章详细设计
1.本程序总共有15个类:
2.各类之间的关系:(如下图)
Elevator类:定义了电梯的基本属性和方法;
ElevatorA:继承Elevator,表示电梯A;
ElevatorB:继承Elevator,表示电梯B;
Person:定义了用户的基本属性和方法;Note:用于传递电梯的属性值;
3.
主要类的属性和主要方法图:
第六章 程序测试
1.设置电梯信息测试:
2.更改用户楼层测试:
3.测试用户按下上行按钮:
4.测试电梯暂停载人
电梯开门电梯关门5.电梯到达目标楼层停止:
6.测试情境模拟:
仿真电梯外面
仿真电梯开门
第七章 关键代码段
1.启动电梯:
// 判断启动哪个电梯
public void startElevator(int nowFloor1, int direct1, int isTouched1, int nowFloor2, int direct2, int isTouched2, int nowFloor3, int direct3)
{
// 如果两电梯在同一楼层
if (nowFloor1 == nowFloor2 && direct3 != 0)
{
// 如果两个电梯的方向一致,启动按下按钮的那个电梯
if (direct1 == direct2)
{
if (isTouched1 == 1)
{
this .ea .isStatic = 1;
} if
(isTouched2 == 1) 仿真电梯内部
this.eb.isStatic = 1;
}
}
// 如果A上行B下行
if (direct1 == 1 && direct2 == 2)
{
// 如果人所在楼层高于A电梯所在楼层,则启动A电梯
if (nowFloor3 >= nowFloor1)
{
this.ea.setIsStatic(1);
}
// 如果人所在的楼层低于A电梯所在楼层,则启动B电梯
if (nowFloor3 <= nowFloor1)
{
this.eb.setIsStatic(1);
}
}
// 如果A下行B上行
if (direct1 == 2 && direct2 == 1)
{
// 如果人所在的楼层高于A电梯所在楼层,则启动B电梯
if (nowFloor3 >= nowFloor1)
{
this.eb.setIsStatic(1);
}
// 如果人所在的楼层低于A电梯所在楼层,则启动A电梯
if (nowFloor3 <= nowFloor1)
{
this.ea.setIsStatic(1);
}
}
}
// 如果A电梯所在楼层高于B电梯所在楼层
if (nowFloor1 > nowFloor2 && direct3 != 0)
{
// 如果AB电梯都是上行
if (direct1 == 1 && direct2 == 1)
{
// 人所在的楼层高于A电梯所在楼层
if (nowFloor3 >= nowFloor1)
{
// 启动A电梯
this.ea.setIsStatic(1);
// 人所在的楼层位于AB电梯所在楼层之间
if (nowFloor3 < nowFloor1 && nowFloor3 > nowFloor2) {
// 如果人要上行则启动B电梯
if (direct3 == 1)
{
this.eb.setIsStatic(1);
}
// 如果人要下行则启动A电梯
if (direct3 == 2)
{
this.ea.setIsStatic(1);
}
}
// 如果人所在的楼层低于B电梯则启动A电梯
if (nowFloor3 <= nowFloor2)
{
this.ea.setIsStatic(1);
}
}
// 如果AB电梯都是下行
if (direct1 == 2 && direct2 == 2)
{
// 如果人所在楼层高于A电梯所在楼层则启动B电梯
if (nowFloor3 >= nowFloor1)
{
this.eb.setIsStatic(1);
}
// 人所在的楼层位于AB电梯所在楼层之间
if (nowFloor3 < nowFloor1 && nowFloor3 > nowFloor2) {
// 如果人要上行则启动A电梯
if (direct3 == 1)
{
this.ea.setIsStatic(1);
}
// 如果人要下行则启动B电梯
if (direct3 == 2)
{
this.eb.setIsStatic(1);
}
}
// 如果人所在的楼层低于B电梯则启动B电梯
if (nowFloor3 <= nowFloor2)
{
this.eb.setIsStatic(1);
}
}
// 如果A电梯上行B电梯下行
if (direct1 == 1 && direct2 == 2)
{
// 如果人所在楼层高于A电梯所在楼层则启动A电梯
if (nowFloor3 >= nowFloor1)
{
this.ea.setIsStatic(1);
}
// 人所在的楼层位于AB电梯所在楼层之间
if (nowFloor3 < nowFloor1 && nowFloor3 > nowFloor2) {
// 如果人要上行则启动B电梯
if (direct3 == 1)
{
this.eb.setIsStatic(1);
}
// 如果人要下行则启动A电梯
if (direct3 == 2)
{
this.ea.setIsStatic(1);
}
}
// 如果人所在的楼层低于B电梯则启动B电梯
if (nowFloor3 <= nowFloor2)
{
this.eb.setIsStatic(1);
}
}
// 如果A电梯下行B电梯上行
if (direct1 == 2 && direct2 == 1)
{
// 如果人所在楼层高于A电梯所在楼层则启动B电梯
if (nowFloor3 >= nowFloor1)
{
this.eb.setIsStatic(1);
}
// 人所在的楼层位于AB电梯所在楼层之间则启动B电梯
if (nowFloor3 < nowFloor1 && nowFloor3 > nowFloor2) {
this.eb.setIsStatic(1);
}
// 如果人所在的楼层低于B电梯
if (nowFloor3 <= nowFloor2)
{
// 如果人要上行则启动A电梯
if (direct3 == 1)
{
this.ea.setIsStatic(1);
}
// 如果人要下行则启动B电梯
if (direct3 == 2)
{
this.eb.setIsStatic(1);
}
}
}
}
// 如果B电梯所在的楼层高于A电梯所在的楼层
if (nowFloor2 > nowFloor1 && direct3 != 0)
{
// 如果AB电梯都是上行
if (direct1 == 1 && direct2 == 1)
{
// 人所在的楼层高于B电梯所在楼层
if (nowFloor3 >= nowFloor2)
{
// 启动B电梯
this.eb.setIsStatic(1);
}
// 人所在的楼层位于AB电梯所在楼层之间
if (nowFloor3 < nowFloor2 && nowFloor3 > nowFloor1)
{
// 如果人要上行则启动A电梯
if (direct3 == 1)
{
this.ea.setIsStatic(1);
}
// 如果人要下行则启动B电梯
if (direct3 == 2)
{
this.eb.setIsStatic(1);
}
}
// 如果人所在的楼层低于A电梯则启动B电梯
if (nowFloor3 <= nowFloor1)
{
this.eb.setIsStatic(1);
}
}
// 如果AB电梯都是下行
if (direct1 == 2 && direct2 == 2)
{
// 如果人所在楼层高于B电梯所在楼层则启动A电梯
if (nowFloor3 >= nowFloor2)
{
this.ea.setIsStatic(1);
}
// 人所在的楼层位于AB电梯所在楼层之间
if (nowFloor3 < nowFloor2 && nowFloor3 > nowFloor1) {
// 如果人要上行则启动A电梯
if (direct3 == 1)
{
this.ea.setIsStatic(1);
}
// 如果人要下行则启动B电梯
if (direct3 == 2)
{
this.eb.setIsStatic(1);
}
}
// 如果人所在的楼层低于A电梯则启动A电梯
if (nowFloor3 <= nowFloor1)
{
this.ea.setIsStatic(1);
}
}
// 如果A电梯上行B电梯下行
if (direct1 == 1 && direct2 == 2)
{
// 如果人所在楼层高于B电梯所在楼层则启动A电梯
if (nowFloor3 >= nowFloor2)
{
this.ea.setIsStatic(1);
}
// 人所在的楼层位于AB电梯所在楼层之间
if (nowFloor3 < nowFloor2 && nowFloor3 > nowFloor1)
{
// 启动A电梯
this.ea.setIsStatic(1);
}
// 如果人所在的楼层低于A电梯
if (nowFloor3 <= nowFloor1)
{
// 如果人要上行则启动B电梯
if (direct3 == 1)
{
this.eb.setIsStatic(1);
}
// 如果人要下行则启动A电梯
if (direct3 == 2)
{
this.ea.setIsStatic(1);
}
}
}
// 如果A电梯下行B电梯上行
if (direct1 == 2 && direct2 == 1)
{
// 如果人所在楼层高于B电梯所在楼层则启动B电梯
if (nowFloor3 >= nowFloor2)
{
this.eb.setIsStatic(1);
}
// 人所在的楼层位于AB电梯所在楼层之间则启动B电梯
if (nowFloor3 < nowFloor2 && nowFloor3 > nowFloor1) {
// 如果人要上行则启动A电梯
if (direct3 == 1)
{
this.ea.setIsStatic(1);
}
// 如果人要下行则启动B电梯
if (direct3 == 2)
{
this.eb.setIsStatic(1);
}
}
// 如果人所在的楼层低于A电梯则额启动A电梯
if (nowFloor3 <= nowFloor1)
{
this.ea.setIsStatic(1);
}
}
}
}
2.电梯载人:
// 使电梯暂停
public void suspendElevator(int isStatic1, int nowFloor1, int isStatic2, int nowFloor2, int nowFloor3)
{
if (isStatic1 == 1)
{
if (nowFloor1 == nowFloor3)
{
this.ea.isStatic = 3;
this.ea.isOpendoor = 1;
}
}
if (isStatic2 == 1)
{
if (nowFloor2 == nowFloor3)
{
this.eb.isStatic = 3;
this.eb.isOpendoor = 1;
}
}
}
3.电梯到达目标层停止:
// 使电梯停止
public void stopElevator(int AnowFloor, int Adiirect, int Aaimfloor, int AisStatic, int BnowFloor, int Bdiirect, int Baimfloor, int BisStatic, int PnowFloor, int Pdirect) {
// 如果调用的是A电梯
if (AisStatic == 1)
{
if (AnowFloor == Aaimfloor && Adiirect == Pdirect)
{
this.ea.isStatic = 0;
this.ea.isOpendoor = 1;
this.person.nowFloor = this.ea.aimFloor;
}
}
// 如果调用的是B电梯
if (BisStatic == 1)
{
if (BnowFloor == Baimfloor && Bdiirect == Pdirect)
{
this.eb.isStatic = 0;
this.eb.isOpendoor = 1;
this.person.nowFloor = this.eb.aimFloor;
}
}
}
4.电梯门开关:
// 控制电梯开关门
public void controlDoor(Graphics g, int isOpendoor1, int AaimFloor, int isOpendoor2, int BaimFloor, int pdirect)
{
if (isOpendoor1 == 1)
{
controlDoor.start = 1;
if (controlDoor.time > 14)
{
g.drawImage(light2, 132, 293, 57, 18, this);
}
if (controlDoor.time > 8 && controlDoor.time < 14)
{
g.drawImage(light2, 53, 293, 57, 18, this);
}
if (controlDoor.time <= 8)
{
controlDoor.start = 0;
if (AaimFloor != 0)
{
controlDoor.start = 1;
this.ea.isStatic = 1;
}
if (AaimFloor == 0 && pdirect == 0)
{
controlDoor.start = 1;
}
}
}
if (isOpendoor2 == 1)
{
controlDoor.start = 1;
if (controlDoor.time > 14)
{
g.drawImage(light2, 482, 293, 57, 18, this);
}
if (controlDoor.time > 8 && controlDoor.time < 14)
{
g.drawImage(light2, 401, 293, 57, 18, this);
}
if (controlDoor.time <= 8)
{
controlDoor.start = 0;
if (BaimFloor != 0)
{
controlDoor.start = 1;
this.eb.isStatic = 1;
}
if (BaimFloor == 0 && pdirect == 0)
{
controlDoor.start = 1;
}
}
}
}
第八章程序缺点及其扩展
1.程序的缺点:
A.程序加载的图片较多,启动时会很慢;
B.程序主界面上的动作响应是根据鼠标的坐标,所以有时候会无响
应;
C.由于程序是单终端的,所以每次只允许载一个人(即程序不能实现多人在不同楼层进行电梯调度)
D.本程序不能限制电梯的搭载量(即判断电梯是否超载)
2.程序扩展:
A.通过网络编程实现电梯模拟程序的多终端(即允许多个用户在多个不同楼层同时进行调度电梯)。
B.实现记载电梯调度日志的记载,方便统计用户调度电梯的情况,从而优化调度算法。