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

今天有个搞电子设计竞赛的来问我电梯的运行逻辑的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
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值