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

今天有个搞电子设计竞赛的来问我电梯的运行逻辑的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();				// 关闭绘图屏幕
}

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

时间: 2024-10-09 07:37:11

动画模拟实现电梯的载客运行过程的相关文章

Android应用运行过程(转)

源:Android应用运行过程 首先,ActivityThread从main()函数开始执行,调用prepareMainLooper()为UI线程创建一个消息队列(MessageQueue). 然后创建一个ActivityThread对象,在ActivityThread的初始化代码中会创建一个H(Handler)对象和一个ApplicationThread(Binder)对象.其中Binder负责接收远程AmS的IPC调用,接收到调用后,则通过Handler把消息发送到消息队列中,UI主线程会异

IOS学习之路- 运行过程

1. 执行Main函数(在main.m文件中) 2. 加载MainStoryborad.storyboard文件 * 创建ViewController文件 * 根据storyboard文件中描述创建ViewController中的UIView(父层) * 创建UIView内部的所有子控件 * 将创建好的所有UIView对象跟ViewController做相应的关联(IBAction,IBoutlet  ) 3. 将程序的第一个控制器内部的UIview显示到手机屏幕上. IOS学习之路- 运行过程

OC学习小结之ios运行过程详解

1)ios核心类 UIView 视图,屏幕上能看得见的东西都是视图,例如:按钮.文本标签.和表格等 UIViewController:内部默认有个视图(UIView),负责管理UIView的生命周期.装配数据到UIView上显示.处理其事件 ios采用MVC模式:model -view -controller 2)运行过程 ios运行原理 1.先执行main函数 2.main函数调用UIApplicationMain函数 创建一个UIApplication实例,这个是一个单例对象,一个ios程序

程序启动和运行过程

摘抄自:http://www.cnblogs.com/kenshincui/p/3890880.html#runProcess 程序的运行过程 在几乎所有的程序开发中程序一般都是从main函数开始运行的,那么IOS程序也不例外,在上图中我们可以看到Xcode为我们生成了一个main.m文件: // // main.m // FirstIOS // // Created by Kenshin Cui on 14-2-23. // Copyright (c) 2014年 Kenshin Cui. A

从内存中分析程序的运行过程

我觉得图形是最可以直观一种解释方法,所以先把程序运行过程的图形解析流程给大家,通过图形来一步一步的理解才是最让人清楚,直观的: 流程图懂了,好多事情也就懂了!

Windows窗口程序运行过程

现在,简单介绍下windows应用程序的大概运行过程,让刚开始接触Windows开发或者MFC开发的同学有一个大致的了解. 1.创建一个窗口首先要注册一个窗口类,初始化wndclass中的各个域,设置窗口过程函数. 2.调用RigisterClass来注册这个窗口类. 3.创建窗口.CreateWindow 4.显示窗口.ShowWindow 5.刷新窗口.UpdateWindow 5.消息循环. 这里主要讲解消息循环. 消息循环中的循环是由程序中 while(GetMessage(&msg,N

黑马程序员----整个程序的运行过程

程序的运行过程: 1.编写代码: 2.编译:把C语言代码翻译成0和1 *工具:clang编译器,(Xcode 3 gcc Xcode 4 llvm clang) *指令:cc -c 文件名.c *编译成功会自动生成一个.o目标文件 3.连接:把我们的.o目标文件和系统自带的函数库合并在一起,生成一个可执行文件 *指令:cc 文件名.o *链接成功后会自动生成一个.out可执行文件 4.运行 *指令:./a.out(./代表在当前文件夹下,a.out为生成的可执行文件) 注意: 1.cc 文件名.

appium界面运行过程(结合日志截图分析)

appium界面运行过程: 1.启动一个http服务器:127.0.0.1:47232.根据测试代码setUp()进行初始化,在http服务器上建立一个session对象3.开始调用adb,找到连接上的设备,设置设备id4.等待设备准备好响应命令5.开启logcat日志监控6.将生成的apk属性信息文件strings.json存到了设备 /data/local/tmp目录下7.读取apk安装情况8.端口映射,发给appium httpserver的内容,经过httpserver后直接发给设备 f

Perl 关于在程序运行过程中重新开启标准输入的问题

遇见问题是,如何程序运行的时候已经将标准输入使用"<"符号或者"|"符合在命令行定向为一个文件. 可是在程序的运行过程中希望从键盘得到输入内容. 因为/dev/tty为当前进程的控制台,STDIN 为当前的标准输入. 如果重定向,例如: perl script.pl <myfile.txt STDIN 被指向 myfile.txt, 但是 /dev/tty 仍然来自于控制终端.所有的Unix都是这样,不单单是指这个perl. 那么解决方案: #!/usr