码迷,mamicode.com
首页 > 其他好文 > 详细

动画模拟实现电梯的载客运行过程

时间:2015-07-28 16:05:42      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:数据结构   算法   电梯模拟   c++   

今天有个搞电子设计竞赛的来问我电梯的运行逻辑的C代码实现,我想到学数据结构那会用C/C++写过一个,不过好久自己现在也记不清了,直接就把源代码给他,让他自己看了。

想想自己马上要开始漫长艰苦的数模国赛集训,心情就不好啊技术分享

这个测序运行后结果如下:(源代码在下面,不过我把VS卸载了,今天本来想运行下那个.exe文件,结果没法运行了,说丢失MSVCP120.dll,不过有几张以前的截图)

技术分享

技术分享

技术分享

这个代码可以以动画的形式:

1.实现电梯载人的逻辑规则

2.电梯实现开关门,保证该出去的人先出完然后该进来的人再进来,排除本层人去本层的情况

3.可以初始化电梯的任何开始位置(不过正常情况下应该初始化在最底层)

4.不断的在人运完后随机产生人(就像网游刷怪一样)

5.显示电梯的运行方向及所处的楼层

6.当人在楼道等电梯的时候圆圈(用圆圈代表人)内显示是上还是下,进入电梯后显示要去的层数

7.可以调节电梯运行速度及停留时间

现在看当时的代码,不忍直视。。。

代码如下(要想编译通过,记得要在VS2013的头文件里加个EasyX的图形库):

#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<queue>
#include<vector>
#include<string.h>

using namespace std;

#define speed 30 //电梯速度调节
#define stay_time 1500//电梯停留时间调节
int tdt_a = 460, tdt_b = 550, dt_Now_Place = 0;//存储电梯某次载客完成后的信息
struct People
{
	int Now_place;//人当前所处的层数
	int Destination;//人所要去的目标层数
	int index;//用这个标号便于在优先队列中实现让人入电梯和让人出电梯的操作
	int x, y;//人在图中具体的坐标
}Peo[45];//在本程序中由于显示屏大小的限制所以最多显示45个人

struct cmp1//按起始位置从小到大排序
{
	bool operator()(People a, People b)
	{
		return a.Now_place > b.Now_place;
	}
};
struct cmp2//按目的地从小到大排列
{
	bool operator()(People a, People b)
	{
		return a.Destination > b.Destination;
	}
};
struct cmp3//按起始位置从大到小排序
{
	bool operator()(People a, People b)
	{
		return a.Now_place < b.Now_place;
	}
};
struct cmp4//按目的地从大到小排列
{
	bool operator()(People a, People b)
	{
		return a.Destination < b.Destination;
	}
};

struct Elevator
{
	int a, b;//电梯当前位置具体坐标(上下两条线的y坐标)(a<b)
	int c, d;

	int Now_place;//电梯当前所处的层数
	int Go_place;//电梯所要去的目标层数

	int Direction;//电梯方向(-1表示未定,0表示向下,1表示向上)

	int Peo_num;//电梯中的人数
	int seat[8];
	int flag;//表示电梯现在门是开的,还是关的(0表示关 1表示开)
}dt;

priority_queue<People, vector<People>, cmp1> q1;//按起始位置从小到大排序(只记录上楼的人,入电梯的时候用)
priority_queue<People, vector<People>, cmp2> q2;//按目的地从小到大排列(只记录上楼的人,出电梯的时候用)
//当情况不连续的时候使用的队列
priority_queue<People, vector<People>, cmp1> q5;//按起始位置从小到大排序(只记录上楼的人,入电梯的时候用)
priority_queue<People, vector<People>, cmp2> q6;//按目的地从小到大排列(只记录上楼的人,出电梯的时候用)

priority_queue<People, vector<People>, cmp3> q3;//按起始位置从大到小排序(只记录下楼的人,入电梯的时候用)
priority_queue<People, vector<People>, cmp4> q4;//按目的地从大到小排列(只记录下楼的人,出电梯的时候用)
//当情况不连续的时候使用的队列
priority_queue<People, vector<People>, cmp3> q7;//按起始位置从大到小排序(只记录下楼的人,入电梯的时候用)
priority_queue<People, vector<People>, cmp4> q8;//按目的地从大到小排列(只记录下楼的人,出电梯的时候用)



void Init_people()
{
	int Peo_num[5];//存储每层电梯随机产生的人数(最多9个人)
	int Peo_y[5][3] = { 535, 505, 475, 435, 405, 375, 335, 305, 275, 235, 205, 175, 135, 105, 75 };//把人所处的(圆心)y坐标存在数组里,方便一点
	int Peo_x[3] = { 330, 360, 390 };//人所处位置的x坐标(用圆表示人,即圆心坐标)
	srand((unsigned)time(NULL));//播种子

	while (!q1.empty())//队列初始化
	{
		q1.pop();
	}
	while (!q2.empty())
	{
		q2.pop();
	}
	while (!q3.empty())//队列初始化
	{
		q3.pop();
	}
	while (!q4.empty())
	{
		q4.pop();
	}
	while (!q5.empty())//队列初始化
	{
		q5.pop();
	}
	while (!q6.empty())
	{
		q6.pop();
	}
	while (!q7.empty())//队列初始化
	{
		q7.pop();
	}
	while (!q8.empty())
	{
		q8.pop();
	}

	for (int i = 0; i < 5; i++)
	{
		Peo_num[i] = rand() % 4;//随机产生0-9的数
		//有改动!!!!!!!!!!!!!!!!!
	}
	/*/////////////////////////////////////////////////
	Peo_num[0] = 0;
	Peo_num[1] = 2;
	Peo_num[2] = 1;
	Peo_num[3] = 0;
	Peo_num[4] = 0;
	//////////////////////////////////////////////////*/
	int k = 0;

	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < Peo_num[i]; j++)
		{
			Peo[k].Now_place = i;//初始化该人当下所处的位置

			while (1)//随机产生该人想去的目的地(且排除了本层人去本层的情况)
			{
				int t1 = rand() % 5;
				Peo[k].Destination = t1;
				if (t1 != i)
				{
					break;
				}
			}

			setlinecolor(GREEN);//设置圆的颜色
			circle(Peo_x[j / 3], Peo_y[i][j % 3], 15);//用画出的圆表示人
		//	TCHAR s[5];
		//	_stprintf_s(s, _T("%d"), Peo[k].Destination);        // 高版本 VC 推荐使用 _stprintf_s 函数
		//	outtextxy(Peo_x[j / 3], Peo_y[i][j % 3], s);

			if (Peo[k].Destination > Peo[k].Now_place)
			{
				TCHAR c = _T('上');
				outtextxy(Peo_x[j / 3], Peo_y[i][j % 3], c);
			}
			else
			{
				TCHAR c = _T('下');
				outtextxy(Peo_x[j / 3], Peo_y[i][j % 3], c);
			}

			Peo[k].x = Peo_x[j / 3];//记录该人在图中具体位置的坐标(便于后续操作)
			Peo[k].y = Peo_y[i][j % 3];

			//将各种情况的人入队
			if (Peo[k].Now_place >= dt.Now_place&&Peo[k].Now_place < Peo[k].Destination)
			{
				q1.push(Peo[k]);
				q2.push(Peo[k]);
			}
			if (Peo[k].Now_place >= dt.Now_place&&Peo[k].Now_place > Peo[k].Destination)
			{
				q3.push(Peo[k]);
				q4.push(Peo[k]);
			}
			if (Peo[k].Now_place < dt.Now_place&&Peo[k].Now_place < Peo[k].Destination)
			{
				q5.push(Peo[k]);
				q6.push(Peo[k]);
			}
			if (Peo[k].Now_place < dt.Now_place&&Peo[k].Now_place > Peo[k].Destination)
			{
				q7.push(Peo[k]);
				q8.push(Peo[k]);
			}
			k++;
		}
	}
}
void Background_Init()
{
	line(100, 50, 100, 550);//画电梯两侧的线
	line(300, 50, 300, 550);

	line(300, 150, 400, 150);//画楼层
	line(300, 250, 400, 250);
	line(300, 350, 400, 350);
	line(300, 450, 400, 450);
	line(300, 550, 400, 550);

	setlinecolor(YELLOW);//画矩形电梯
	rectangle(130, 460, 270, 550);

	TCHAR s[] = _T("Elevator_State");//电梯状态显示栏
	outtextxy(5, 50, s);
	TCHAR s1[] = _T("Now_place:");
	outtextxy(10, 70, s1);
	TCHAR s2[] = _T("Direction:");
	outtextxy(10, 110, s2);
	TCHAR s3[] = _T("Peo_num:");
	outtextxy(10, 150, s3);

	LOGFONT f1;
	gettextstyle(&f1);                     // 获取当前字体设置
	settextcolor(RED);
	f1.lfWeight = 900;
	f1.lfHeight = 30;                      // 设置字体高度为 48
	_tcscpy_s(f1.lfFaceName, _T("黑体"));    // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)
	f1.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
	settextstyle(&f1);                     // 设置字体样式
	outtextxy(105, 10, _T("电梯模拟系统"));


	LOGFONT f2;
	gettextstyle(&f2);                     // 获取当前字体设置
	settextcolor(WHITE);
	f2.lfWeight = 100;
	f2.lfHeight = 15;
	_tcscpy_s(f2.lfFaceName, _T("黑体"));    // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)
	f2.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
	settextstyle(&f2);                     // 设置字体样式

}
void Elevator_Init()
{
	dt.a = 460;
	dt.b = 550;
	dt.Direction = 1;//1表示方向向上,0表示方向向下
	dt.Now_place = 0;
	dt.Peo_num = 0;
	for (int i = 0; i < 8; i++)
	{
		dt.seat[i] = -1;//初始化电梯的每个位置都没人
	}
}
void Elevator_Init2()
{
	dt.a = tdt_a;
	dt.b = tdt_b;
	//	dt.Direction = 1;//1表示方向向上,0表示方向向下
	dt.Now_place = dt_Now_Place;
	//	dt.Peo_num = 0;
	for (int i = 0; i < 8; i++)
	{
		dt.seat[i] = -1;//初始化电梯的每个位置都没人
	}
}
int Concret1(People tq)//搭乘客时的具体操作函数
{
	if (dt.a > dt.c)
	{
		int t1 = dt.a;
		int t2 = dt.b;
		while (dt.a >= dt.c)
		{
			/**********************这部分代码是实现电梯和电梯内人的动画移动************************************/
			setfillcolor(BLACK);//把人消除掉
			setlinecolor(BLACK);//注意这个圆的填充是包括外框的,所以要把线的颜色也设为黑色!!!
			for (int i = 0; i < 8; i++)
			{
				if (dt.seat[i] != -1)
				{
					fillcircle(150 + i % 4 * 30, t2 - 20 - i / 4 * 40, 15);
				}
			}
			setlinecolor(GREEN);
			for (int i = 0; i < 8; i++)
			{
				if (dt.seat[i] != -1)
				{
					circle(150 + i % 4 * 30, dt.b - 20 - i / 4 * 40, 15);//通过坐标间的关系确定所画圆的坐标
					TCHAR s[5];
					_stprintf_s(s, _T("%d"), dt.seat[i]);//在圆心画出这个人所要去的楼层  
					outtextxy(150 + i % 4 * 30, dt.b - 20 - i / 4 * 40, s);
				}
			}
			setlinecolor(BLACK);
			rectangle(130, t1, 270, t2);
			setlinecolor(YELLOW);
			rectangle(130, dt.a, 270, dt.b);
			t1 = dt.a;
			t2 = dt.b;
			dt.a -= 5;
			dt.b -= 5;
			Sleep(speed);
			/****************************************************************************************************************************************/
		}
		dt.a += 5;
		dt.b += 5;
	}
	if (dt.a < dt.c)
	{
		int t1 = dt.a;
		int t2 = dt.b;
		while (dt.a <= dt.c)
		{
			setfillcolor(BLACK);//把人消除掉
			setlinecolor(BLACK);//注意这个圆的填充是包括外框的,所以要把线的颜色也设为黑色!!!
			for (int i = 0; i < 8; i++)
			{
				if (dt.seat[i] != -1)
				{
					fillcircle(150 + i % 4 * 30, t2 - 20 - i / 4 * 40, 15);
				}
			}
			setlinecolor(GREEN);
			for (int i = 0; i < 8; i++)
			{
				if (dt.seat[i] != -1)
				{
					circle(150 + i % 4 * 30, dt.b - 20 - i / 4 * 40, 15);//通过坐标间的关系确定所画圆的坐标
					TCHAR s[5];
					_stprintf_s(s, _T("%d"), dt.seat[i]);//在圆心画出这个人所要去的楼层  
					outtextxy(150 + i % 4 * 30, dt.b - 20 - i / 4 * 40, s);
				}
			}
			setlinecolor(BLACK);
			rectangle(130, t1, 270, t2);
			setlinecolor(YELLOW);
			rectangle(130, dt.a, 270, dt.b);
			t1 = dt.a;
			t2 = dt.b;
			dt.a += 5;
			dt.b += 5;
			Sleep(speed);
		}
		dt.a -= 5;
		dt.b -= 5;
	}

	TCHAR s[5];//显示电梯所处的楼层
	_stprintf_s(s, _T("%d"), dt.Now_place);
	outtextxy(10, 90, s);

	//具体的搭人代码
	if (!dt.flag)
	{
		dt.flag = 1;
		setlinecolor(BLACK);//电梯停留开门
		line(270, dt.c, 270, dt.d);
	}
	setfillcolor(BLACK);//把人消除掉
	setlinecolor(BLACK);
	fillcircle(tq.x, tq.y, 15);//是一个一个人进的
	//Sleep(1000);
	setlinecolor(GREEN);
	for (int i = 0; i < 8; i++)
	{
		if (dt.seat[i] == -1)
		{
			dt.seat[i] = tq.Destination;
			circle(150 + i % 4 * 30, dt.d - 20 - i / 4 * 40, 15);//通过坐标间的关系确定所画圆的坐标
			TCHAR s[5];
			_stprintf_s(s, _T("%d"), dt.seat[i]);//在圆心画出这个人所要去的楼层  
			outtextxy(150 + i % 4 * 30, dt.d - 20 - i / 4 * 40, s);
			break;
		}
	}
	Sleep(stay_time);
	if (dt.flag)//如果门是开的,关电梯门
	{
		dt.flag = 0;
		setlinecolor(YELLOW);
		line(270, dt.c, 270, dt.d);
	}
	return 1;
}
int Concret2()//乘客出电梯具体操作
{
	if (dt.a > dt.c)
	{
		int t1 = dt.a;
		int t2 = dt.b;
		while (dt.a >= dt.c)
		{
			/**********************这部分代码是实现电梯和电梯内人的动画移动************************************/
			setfillcolor(BLACK);//把人消除掉
			setlinecolor(BLACK);//注意这个圆的填充是包括外框的,所以要把线的颜色也设为黑色!!!
			for (int i = 0; i < 8; i++)
			{
				if (dt.seat[i] != -1)
				{
					fillcircle(150 + i % 4 * 30, t2 - 20 - i / 4 * 40, 15);
				}
			}
			setlinecolor(GREEN);//生成人
			for (int i = 0; i < 8; i++)
			{
				if (dt.seat[i] != -1)
				{
					circle(150 + i % 4 * 30, dt.b - 20 - i / 4 * 40, 15);//通过坐标间的关系确定所画圆的坐标
					TCHAR s[5];
					_stprintf_s(s, _T("%d"), dt.seat[i]);//在圆心画出这个人所要去的楼层  
					outtextxy(150 + i % 4 * 30, dt.b - 20 - i / 4 * 40, s);
				}
			}
			setlinecolor(BLACK);
			rectangle(130, t1, 270, t2);
			setlinecolor(YELLOW);
			rectangle(130, dt.a, 270, dt.b);
			t1 = dt.a;
			t2 = dt.b;
			dt.a -= 5;
			dt.b -= 5;
			Sleep(speed);
			/*******************************************************************************************************************/
		}
		dt.a += 5;
		dt.b += 5;
	}
	if (dt.a < dt.c)
	{
		int t1 = dt.a;
		int t2 = dt.b;
		while (dt.a <= dt.c)
		{
			setfillcolor(BLACK);//把人消除掉
			setlinecolor(BLACK);//注意这个圆的填充是包括外框的,所以要把线的颜色也设为黑色!!!
			for (int i = 0; i < 8; i++)
			{
				if (dt.seat[i] != -1)
				{
					fillcircle(150 + i % 4 * 30, t2 - 20 - i / 4 * 40, 15);
				}
			}
			setlinecolor(GREEN);//生成人
			for (int i = 0; i < 8; i++)
			{
				if (dt.seat[i] != -1)
				{
					circle(150 + i % 4 * 30, dt.b - 20 - i / 4 * 40, 15);//通过坐标间的关系确定所画圆的坐标
					TCHAR s[5];
					_stprintf_s(s, _T("%d"), dt.seat[i]);//在圆心画出这个人所要去的楼层  
					outtextxy(150 + i % 4 * 30, dt.b - 20 - i / 4 * 40, s);
				}
			}
			setlinecolor(BLACK);
			rectangle(130, t1, 270, t2);
			setlinecolor(YELLOW);
			rectangle(130, dt.a, 270, dt.b);
			t1 = dt.a;
			t2 = dt.b;
			dt.a += 5;
			dt.b += 5;
			Sleep(speed);
		}
		dt.a -= 5;
		dt.b -= 5;
	}

	TCHAR s[5];//显示电梯所处的楼层
	_stprintf_s(s, _T("%d"), dt.Now_place);
	outtextxy(10, 90, s);

	tdt_a = dt.a;//记录电梯某次载客完成后所处的真实坐标位置(因为这个函数是某次载客最后执行的函数)
	tdt_b = dt.b;
	dt_Now_Place = dt.Now_place;

	//具体的乘客出电梯代码
	if (!dt.flag)
	{
		dt.flag = 1;
		setlinecolor(BLACK);//电梯停留开门
		line(270, dt.c, 270, dt.d);
	}
	//Sleep(500);
	setfillcolor(BLACK);//把人消除掉
	setlinecolor(BLACK);//注意这个圆的填充是包括外框的,所以要把线的颜色也设为黑色!!!
	for (int i = 0; i < 8; i++)
	{
		if (dt.seat[i] == dt.Now_place)
		{
			fillcircle(150 + i % 4 * 30, dt.b - 20 - i / 4 * 40, 15);
			dt.seat[i] = -1;
		}
	}
	Sleep(stay_time);
	if (dt.flag)
	{
		dt.flag = 0;
		setlinecolor(YELLOW);//电梯关门
		line(270, dt.c, 270, dt.d);
	}
	return 1;
}
void Q1_Q2()
{
	while (!q2.empty() && q2.top().Destination == dt.Now_place)//出电梯(一定要用while循环确保多个人出电梯队列中元素删除干净)
	{
		People tq1 = q2.top();
		q2.pop();
		switch (tq1.Destination)
		{
		case 0:
			dt.c = 460;
			dt.d = 550;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 1:
			dt.c = 360;
			dt.d = 450;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 2:
			dt.c = 260;
			dt.d = 350;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 3:
			dt.c = 160;
			dt.d = 250;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 4:
			dt.c = 60;
			dt.d = 150;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		}
	}
	while (!q1.empty() && q1.top().Now_place == dt.Now_place)//一个一个人进电梯
	{
		People tq1 = q1.top();
		q1.pop();
		switch (dt.Now_place)
		{
		case 0:
			dt.c = 460;
			dt.d = 550;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 1:
			dt.c = 360;
			dt.d = 450;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 2:
			dt.c = 260;
			dt.d = 350;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 3:
			dt.c = 160;
			dt.d = 250;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 4:
			dt.c = 60;
			dt.d = 150;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		}
	}
}
void Q5_Q6()
{
	while (!q5.empty() && q5.top().Now_place == dt.Now_place)//一个一个人进电梯
	{
		People tq1 = q5.top();
		q5.pop();
		switch (dt.Now_place)
		{
		case 0:
			dt.c = 460;
			dt.d = 550;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 1:
			dt.c = 360;
			dt.d = 450;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 2:
			dt.c = 260;
			dt.d = 350;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 3:
			dt.c = 160;
			dt.d = 250;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 4:
			dt.c = 60;
			dt.d = 150;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		}
	}
	if (dt.flag)//如果门是开的,关电梯门
	{
		setlinecolor(YELLOW);
		line(270, dt.c, 270, dt.d);
	}
	while (!q6.empty() && q6.top().Destination == dt.Now_place)//出电梯(一定要用while循环确保多个人出电梯队列中元素删除干净)
	{
		People tq1 = q6.top();
		q6.pop();
		switch (tq1.Destination)
		{
		case 0:
			dt.c = 460;
			dt.d = 550;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 1:
			dt.c = 360;
			dt.d = 450;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 2:
			dt.c = 260;
			dt.d = 350;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 3:
			dt.c = 160;
			dt.d = 250;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 4:
			dt.c = 60;
			dt.d = 150;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		}
	}
}
void Q3_Q4()
{
	while (!q3.empty() && q3.top().Now_place == dt.Now_place)//一个一个人进电梯
	{
		People tq1 = q3.top();
		q3.pop();
		switch (dt.Now_place)
		{
		case 0:
			dt.c = 460;
			dt.d = 550;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 1:
			dt.c = 360;
			dt.d = 450;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 2:
			dt.c = 260;
			dt.d = 350;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 3:
			dt.c = 160;
			dt.d = 250;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 4:
			dt.c = 60;
			dt.d = 150;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		}
	}
	if (dt.flag)//如果门是开的,关电梯门
	{
		dt.flag = 0;
		setlinecolor(YELLOW);
		line(270, dt.c, 270, dt.d);
	}
	while (!q4.empty() && q4.top().Destination == dt.Now_place)//出电梯(一定要用while循环确保多个人出电梯队列中元素删除干净)
	{
		People tq1 = q4.top();
		q4.pop();
		switch (tq1.Destination)
		{
		case 0:
			dt.c = 460;
			dt.d = 550;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 1:
			dt.c = 360;
			dt.d = 450;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 2:
			dt.c = 260;
			dt.d = 350;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 3:
			dt.c = 160;
			dt.d = 250;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 4:
			dt.c = 60;
			dt.d = 150;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		}
	}
}
void Q7_Q8()
{
	while (!q7.empty() && q7.top().Now_place == dt.Now_place)//一个一个人进电梯
	{
		People tq1 = q7.top();
		q7.pop();
		switch (dt.Now_place)
		{
		case 0:
			dt.c = 460;
			dt.d = 550;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 1:
			dt.c = 360;
			dt.d = 450;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 2:
			dt.c = 260;
			dt.d = 350;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 3:
			dt.c = 160;
			dt.d = 250;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		case 4:
			dt.c = 60;
			dt.d = 150;
			if (Concret1(tq1))//重复性的代码一定要做成函数
			{
				break;
			}
		}
	}
	if (dt.flag)//如果门是开的,关电梯门
	{
		dt.flag = 0;
		setlinecolor(YELLOW);
		line(270, dt.c, 270, dt.d);
	}
	while (!q8.empty() && q8.top().Destination == dt.Now_place)//出电梯(一定要用while循环确保多个人出电梯队列中元素删除干净)
	{
		People tq1 = q8.top();
		q8.pop();
		switch (tq1.Destination)
		{
		case 0:
			dt.c = 460;
			dt.d = 550;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 1:
			dt.c = 360;
			dt.d = 450;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 2:
			dt.c = 260;
			dt.d = 350;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 3:
			dt.c = 160;
			dt.d = 250;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		case 4:
			dt.c = 60;
			dt.d = 150;
			if (Concret2())//重复性的代码一定要做成函数
			{
				break;
			}
		}
	}
}
void Elevator_Run_Up1()
{
	while (dt.Now_place <= 4)
	{
		TCHAR s[] = _T("UP       ");//显示出电梯的运行方向,用空格键覆盖上次的显示残留
		outtextxy(10, 130, s);

		Q1_Q2();
		dt.Now_place++;
	}
	dt.Now_place--;
}
void Elevator_Run_Up2()
{
	while (dt.Now_place <= 4)
	{
		TCHAR s[] = _T("UP       ");//显示出电梯的运行方向,用空格键覆盖上次的显示残留
		outtextxy(10, 130, s);

		Q5_Q6();
		dt.Now_place++;
	}
	dt.Now_place--;
}
void Elevator_Run_Down1()
{
	while (dt.Now_place >= 0)
	{
		TCHAR s[] = _T("DOWN      ");//显示出电梯的运行方向,用空格键覆盖上次的显示残留
		outtextxy(10, 130, s);

		Q3_Q4();
		dt.Now_place--;
	}
	dt.Now_place++;
}
void Elevator_Run_Down2()
{
	while (dt.Now_place >= 0)
	{
		TCHAR s[] = _T("DOWN      ");//显示出电梯的运行方向,用空格键覆盖上次的显示残留
		outtextxy(10, 130, s);

		Q7_Q8();
		dt.Now_place--;
	}
	dt.Now_place++;
}
int main()
{
	initgraph(400, 600);//设置输出框的大小

	Background_Init();//初始化整个背景图形

	Elevator_Init();

	char c = 1;
	while (1)
	{
		//获取按键
		//c = _getch();
		//	if (c == 113)//按Q键进行人状态的初始化刷新
		//	{
		Init_people();
		//	}
		//if (c == 27)//按ESC键终止整个程序的运行
		//{
		//	break;
		//}
		//_getch();//按任意键电梯开始运行
		Elevator_Run_Up1();
		Elevator_Run_Down1();
		Elevator_Run_Up2();
		Elevator_Run_Down2();
		Elevator_Init2();

		//	TCHAR s[] = _T("STOP        ");//显示出电梯处于停止状态,用空格键覆盖上次的显示残留
		//	outtextxy(10, 130, s);
	}
	closegraph();				// 关闭绘图屏幕
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

动画模拟实现电梯的载客运行过程

标签:数据结构   算法   电梯模拟   c++   

原文地址:http://blog.csdn.net/u014285517/article/details/47104915

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!