⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbus.cpp

📁 用VC++编程
💻 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 + -