📄 cbus.cpp
字号:
#include "stdafx.h"
#include "Bus.h"
#include "CBus.h"
#include "BusDlg.h"
int g_stime,g_etime;//模拟过程起始时间
int g_ctime; //当前时间
int g_runbus; //运行的汽车数量
CCriticalSection g_cirtical;
class CBusDlg;
CBustype g_bustype[BUSTYPES]={
CBustype("W",6,40),
CBustype("Y",2,21)};
int g_dir[DIRS][CITYS]={
0,22,46,67,129,150,174,
0,24,45,107,128,152,174};////各个站点距起点的距离,双方向
HICON g_icon[2];
CBustype::CBustype(string nametype,double velocity,int limit)////CBustype类的构造函数
{
m_typename=nametype;
m_velocity=velocity;
m_limit=limit;
}
CPassenger::CPassenger(int atime,int add)////CPassenger类的构造函数
{
m_atime=atime;
m_add=add;
}
////CBss 类的构造函数
CBus::CBus(int no,int type,CStation *from,CStation *to,int stime,int dir,int x,int y)
{
m_no=no;
m_type=type;
m_from=from;
m_to=to;
m_stime=stime;
m_dir=dir;
m_x=x;
m_y=y;
}
class cmp
{
public:
bool operator()(CBus *b1,CBus *b2)
{
return b1->m_stime<b2->m_stime;
}
};
void CBus::Move()///汽车移动函数
{
double dis=0;
int d=(int)(g_bustype[m_type].m_velocity*3);
for(int i=1;i<CITYS;)
{
DrawT(10,10,10,10,g_ctime,1);
dis+=g_bustype[m_type].m_velocity;
if(m_dir==TOBJ)
DrawI(m_x,m_y,m_x,m_y+d,m_type);
else if(m_dir==TOXA)
DrawI(m_x,m_y,m_x,m_y-d,m_type);
Sleep(1000);
if(m_dir==TOBJ)
DrawT(m_x+40,m_y+15,m_x+40,m_y+15+d,m_passenger.size());
else if(m_dir==TOXA)
DrawT(m_x+40,m_y-5,m_x+40,m_y-5-d,m_passenger.size());
if(fabs(dis-g_dir[m_dir][i])<=8)
{
int off=0;
vector<CPassenger>::iterator it;
for(it=m_passenger.begin();it<m_passenger.end();)
{
if(it->m_add==i)
{
m_passenger.erase(it);
off++;
continue;
}
it++;
}
i++;
if(off>0)
{
Sleep(2000);
if(m_dir==TOBJ)
DrawT(m_x+40,m_y+15,m_x+40,m_y+15+d,m_passenger.size());
else if(m_dir==TOXA)
DrawT(m_x+40,m_y-5,m_x+40,m_y-5-d,m_passenger.size());
}
}
if(m_dir==TOBJ)
m_y+=d;
else if(m_dir==TOXA)
m_y-=d;
}
DrawI(m_x,m_y,m_x,m_y,-1);
if(m_dir==TOBJ)
{
DrawT(m_x+40,m_y+15,m_x+40,m_y+15," ");
m_dir=TOXA;
if(m_type==TYPE_W)
m_x+=320;
else
m_x+=160;
m_y=550;
}
else if(m_dir==TOXA)
{
DrawT(m_x+40,m_y-5,m_x+40,m_y-5," ");
m_dir=TOBJ;
if(m_type==TYPE_W)
m_x-=320;
else
m_x-=160;
m_y=30;
}
m_to->Arrive(this);
}
void CStation::Init(CString name, int x,int y,
int stime[BUSTYPES],int etime[BUSTYPES],int interval[BUSTYPES],
double p[CITYS])
{
m_name=name;
m_x=x;
m_y=y;
memcpy(m_stime,stime,sizeof(m_stime));
memcpy(m_ntime,stime,sizeof(m_stime));
memcpy(m_etime,etime,sizeof(m_etime));
memcpy(m_interval,interval,sizeof(m_interval));
memcpy(m_p,p,sizeof(m_p));
int i;
m_ltime=-1;
for(i=0;i<BUSTYPES;i++)
m_ltime=(m_ltime>m_etime[i])?m_ltime:m_etime[i];
}
CStation::~CStation()
{
while(!m_bus.empty())
{
delete m_bus.front();
m_bus.erase(m_bus.begin());
}
}
void CStation::AppendBus(int num,CStation *to,int type,int dir,int x,int y)
{
int i;
for(i=0;i<num;i++)
{
m_bus.push_back(new CBus(i,type,this,to,m_ntime[type],dir,x,y));//车入站
m_ntime[type]+=m_interval[type];///确定其再次发车时间
}
sort(m_bus.begin(),m_bus.end(),cmp());///将车分类
if(!m_bus.empty())
m_nstime=(*m_bus.front()).m_stime;
DrawBus();
}
void CStation::Wait()
{
DrawInfo();
if(g_ctime>g_etime) return;
int i,j;
for(i=1;i<CITYS;i++)
{
int num;
num=(int)(m_p[i]*(rand()%5)+0.5);
for(j=0;j<num;j++)
m_wait.push_back(CPassenger(g_ctime,i));
}
DrawInfo();
}
void CStation::Start()
{
DrawBus();
if(m_nstime>m_ltime) return;
if(m_nstime!=g_ctime) return;
while(!m_bus.empty() && m_nstime==g_ctime)
{
//AfxMessageBox("Start2");
CBus *bus=m_bus.front();
while(!m_wait.empty() && bus->m_passenger.size() < g_bustype[bus->m_type].m_limit)
{
bus->m_passenger.push_back(m_wait.front());
m_wait.erase(m_wait.begin());
}
//运行多线程程序
AfxBeginThread(BusMoveThread,bus);
g_runbus++;
m_bus.erase(m_bus.begin());
if(!m_bus.empty())
m_nstime=(*m_bus.front()).m_stime;
}
DrawBus();
}
void CStation::Arrive(CBus *bus)
{
swap(bus->m_from,bus->m_to);
bus->m_stime=m_ntime[bus->m_type];
m_bus.push_back(bus);
m_ntime[bus->m_type]+=m_interval[bus->m_type];
g_runbus--;
sort(m_bus.begin(),m_bus.end(),cmp());
if(!m_bus.empty())
m_nstime=(*m_bus.front()).m_stime;
DrawBus();
}
void CStation::DrawBus()
{
DrawT(10,10,10,10,g_ctime,1);
for(int i=0;i<m_bus.size();i++)
{
DrawI(m_x+i%10*40,m_y+i/10*60,m_x+i%10*40,m_y+i/10*60,m_bus[i]->m_type);
DrawT(m_x+i%10*40,m_y+i/10*60+40,m_x+i%10*40,m_y+i/10*60+40,m_bus[i]->m_stime,1);
}
for(;i<36;i++)
{
DrawI(m_x+i%10*40,m_y+i/10*60,m_x+i%10*40,m_y+i/10*60,-1);
DrawT(m_x+i%10*40,m_y+i/10*60+40,m_x+i%10*40,m_y+i/10*60+40," ");
}
}
void CStation::DrawInfo()
{
CString str;
str.Format("---乘客数:%d 客车数:%d ",m_wait.size(),m_bus.size());
DrawT(m_x,m_y-30,m_x,m_y-30,m_name+str);
}
CStation g_xa,g_bj;
UINT MainThread(LPVOID lparam)////主线程
{
srand( (unsigned)time(NULL));
g_stime=g_ctime=TIME2INT(7,30);
g_etime=TIME2INT(17,59);
g_runbus=0;
int stime[BUSTYPES]={TIME2INT(8,30),TIME2INT(8,0)};
int etime[BUSTYPES]={TIME2INT(17,30),TIME2INT(18,0)};
int interval[BUSTYPES]={60,20};
double p[CITYS]={0.0,0.1,0.1,0.1,0.2,0.2,0.3};
g_xa.Init("西安",400,40,stime,etime,interval,p);
g_bj.Init("宝鸡",400,350,stime,etime,interval,p);
g_xa.AppendBus(5,&g_bj,TYPE_W,TOBJ,10,30);
g_xa.AppendBus(12,&g_bj,TYPE_Y,TOBJ,90,30);
g_bj.AppendBus(4,&g_xa,TYPE_W,TOXA,330,550);
g_bj.AppendBus(15,&g_xa,TYPE_Y,TOXA,250,550);
for(;g_ctime<g_etime||!g_runbus;)
{
g_ctime++;
DrawT(10,10,10,10,g_ctime,1);
g_xa.DrawInfo();
g_bj.DrawInfo();
g_xa.Wait();
g_bj.Wait();
g_xa.Start();
g_bj.Start();
Sleep(1000);
}
return 0;
}
UINT BusMoveThread(LPVOID lparam)/////Bus线程
{
CBus *bus;
bus=(CBus *)lparam;
bus->Move();/////调用Move函数
return 0;
}
void DrawI(int ox,int oy,int nx,int ny,int icon)
{
CClientDC dc(AfxGetApp()->m_pMainWnd);///设备上下文指针
dc.BitBlt(ox,oy,32,32,&(((CBusDlg *)(::AfxGetApp()->GetMainWnd()))->m_memdc),0,0,SRCCOPY);
if(icon==-1) return; //clear
dc.DrawIcon(nx,ny,g_icon[icon]);////画相应的车
}
void DrawT(int ox,int oy,int nx,int ny,CString str)
{
CClientDC dc(AfxGetApp()->m_pMainWnd);
dc.SetBkMode(OPAQUE);
dc.SetBkColor(::GetSysColor(COLOR_3DFACE));
dc.SetTextColor(::GetSysColor(COLOR_3DFACE));
dc.TextOut(ox,oy," ");
dc.SetTextColor(::GetSysColor(COLOR_BTNTEXT));
dc.TextOut(nx,ny,str);
}
void DrawT(int ox,int oy,int nx,int ny,int num,int flag)
{
CString str;
if(flag) str.Format("%02d:%02d",num/60,num%60);
else str.Format("%2d",num);
DrawT(ox,oy,nx,ny,str);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -