📄 elevator.cpp
字号:
# include "elevator.h"
/# include <iostream.h>
# include <iomanip.h>
# include <conio.h>
elevator::elevator()
{
elevNumber=-1;
timeToAction=ELEVWAIT;
floorNumber=0;
stopped=true;
dir=NODIRECTION;
passengers=0;
for (int i=0;i<MAXFLOORS;i++)
buttons[i]=false;
}
bool elevator::buttonUp(void)
{
for (int i=floorNumber+1;i<MAXFLOORS;i++)
if (buttons[i]) return true;
return false;
}
bool elevator::buttonDown(void)
{
for (int i=0;i<floorNumber;i++)
if (buttons[i]) return true;
return false;
}
void elevator::showElevator(void)
{
textcolor(BROWN);
gotoxy(13+elevNumber*7,1);
switch (floorNumber)
{
case 0: cprintf("1 "); break;
case 1: cprintf("2 "); break;
case 2: cprintf("3 "); break;
case 3: cprintf("4 "); break;
case 4: cprintf("5 "); break;
case 5: cprintf("6 "); break;
case 6: cprintf("7 "); break;
case 7: cprintf("8 "); break;
case 8: cprintf("9 "); break;
case 9: cprintf("10"); break;
}
Draw_window ((10+elevNumber*7),(20-floorNumber*2),(16+elevNumber*7),(22-floorNumber*2));
gotoxy((11+elevNumber*7),(21-floorNumber*2));
cout<<setw(3)<<passengers<<" ";
if (dir==UP) {textcolor(RED); cprintf("U");}
if (dir==DOWN) { textcolor(MAGENTA); cprintf("D");}
if (dir==NODIRECTION) { textcolor(GREEN); cprintf("-");}
textcolor(WHITE);
}
void elevator::SetDirection(floorSet &floors)
{
if (buttonUp())
dir=UP;
else
if (buttonDown())
dir=DOWN;
else
if (floors.signalUp(floorNumber))
dir=UP;
else
if (floors.signalDown(floorNumber))
dir=DOWN;
else
if (dir!=DOWN||floorNumber==0)
dir=NODIRECTION;
}
bool elevator::elevStopping(floorSet &floors)
{
if (buttons[floorNumber])
return true;
else
if (floors.signalSameDir(dir,floorNumber))
return true;
else
if (floorNumber==0)
return true;
else
if (floorNumber==MAXFLOORS-1)
return true;
else
if (dir==NODIRECTION&&floors.getnp(floorNumber)!=0)
{
dir=DOWN;
return true;
}
else
return false;
}
void elevator::action(floorSet &floors,perSet &persons)
{
int pdest;
int newdir;
if (stopped)
{
passengers-=persons.discharge(elevNumber,floorNumber);
if (dir==0&&passengers<CAPACITY)
{
if (persons.loadAny(elevNumber,floorNumber,pdest))
{
passengers++;
timeToAction++;
buttons[pdest]=true;
if (pdest>floorNumber)
dir=UP;
else
dir=DOWN;
}
}
if (dir!=0&&passengers<CAPACITY)
{
if (persons.loadOne(elevNumber,floorNumber,dir,pdest))
{
passengers++;
timeToAction++;
buttons[pdest]=true;
if (passengers>=CAPACITY) timeToAction=0;
}
}
if (timeToAction--<=0)
{
if (dir==0)
SetDirection(floors);
if (dir==0&&floorNumber>0)
dir=DOWN;
if (dir==0)
timeToAction=ELEVWAIT;
else
{
floors.reSetButton(dir,floorNumber);
stopped=false;
timeToAction=TRAVELTIME;
}
}
}
else
if (timeToAction--<=0)
{
if (dir==UP)
floorNumber++;
else
floorNumber--;
SetDirection(floors);
if (elevStopping(floors))
{
floors.reSetButton(dir,floorNumber);
stopped=true;
timeToAction=ELEVWAIT;
buttons[floorNumber]=false;
}
else
timeToAction=TRAVELTIME;
}
}
elevSet::elevSet()
{
for (int i=0;i<MAXELEVS;i++)
ea[i].SetelevNumber(i);
}
void elevSet::showElevators(void)
{
for (int k=2;k<=22;k++)
{
gotoxy(10,k);
clreol();
}
for (int i=0;i<MAXELEVS;i++)
ea[i].showElevator();
}
void elevSet::action(floorSet &floors,perSet &persons)
{
for (int i=0;i<MAXELEVS;i++)
ea[i].action(floors,persons);
}
int elevSet::avgRiding(void)
{
int total=0;
for (int i=0;i<MAXELEVS;i++)
total+=ea[i].getPassengers();
return total/MAXELEVS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -