刚上传了一个完全模拟我们学校图书管电梯的程序,有需要者可以下载下来看下(http://download.csdn.net/user/xiadasong007)。
(由于百度一个帖子的原因,今天被迫一下午都在忙这个程序,幸好还算是比较简单的东西,呵呵)
今天先休息一下,看下《英雄-第一季》明天再来说说代码实现的过程,来看看有什么难的?
2009.3.12
电梯控制模拟代码思路简单解析:
要模拟电梯的运行情况,自然是要画图的,基本画线画方形应该都没有问题,这样先把电梯的基本结构画出来,接着便是添加按钮,并为每个按钮添加单击消息。
电梯模拟有两点地方比较重要,第一是如何让电梯运行到我们需要的地方,第二是如何在我们随意按下多个按钮后电梯该如何运行。
注意电梯有一个特点是:一次上,一次下,中间过程中不会改变方向。
设楼层高度H;
定时器每发送一次消息,电梯走一步。
第一个要点:让电梯运行到我们需要的楼层
1:在起始时刻,电梯在1楼,比如说我们现在想去5楼,那么就需要将电梯向上移动4*H高度,但是有可能电梯在2.5楼(楼梯不是正好在2楼,比二楼高0.5*H)时有人想去4楼,这时电梯必须能改变它的目标。
2:对于电梯运行状态的变量的选取是很重要的地方,选择不好可能会引起电梯达不到我们的要求。我在这个程序中选择了2个变量,一个是电梯的步数m_iCount,一个是电梯当前所在楼层m_iCurrentFloor。m_iCount用来计数,电梯60步走一个H高度,m_iCount初始化为0,电梯走一步,m_iCount+=1,这样一旦m_iCount==60,则m_iCurrentFloor+=1(上去)或m_iCurrentFloor - =1(下来),并将m_iCount重置为0,继续计数。
这样不管电梯运行到何处,我们都能知道它的具体位置。而且只有m_iCount==60时,电梯才有机会停下了,这样便控制了电梯不会停在一些莫名其妙的地方。
3:电梯停下来时,它所在楼层的对应的按钮应该无效
4:电梯到了所需要的楼层时,可以停止定时器,过了一会后再启用它。(可以用一个新的定时器来做到,但2个定时器不能共存)
第二个要点:如何保存按钮:
1:对于电梯使用者来说,电梯要满足所有人的需求,因此电梯必须能保存每个客户点击的按钮。
2:既然要保存,用列表是不错的选择,可是那种最合适呢?想想STL中的几个容器,不必多想,首选当然是set容器,该容器能自动排序,这个功能实在是再好不过了。
3:但是,现在电梯向上运行到5楼,还有人要去1、2、4、7、9楼,前面说过,电梯一次一个方向,没有远近关系的影响,因此电梯会先去7、9楼,回来时经过4、2、1楼。
鉴于此,我们需要用两个set对象来保存需求信息。一个保存上楼的,一个保存下楼的。
4:这样,按钮发出的消息很简单,就是将它的名字保存到set对象中。
5:定时器每次响应,都会去检查set,上楼时检查set::begin(),下楼是检查set::end()-1,以此来获取最新信息,及时调整目标。
6:若电梯到达要求的楼层,则在set集中删掉该层层号即可。若删空了,则说明要转向或停止运行了,程序中m_bDown控制电梯(一次一个)方向。
其他细节问题略。
注:本程序只是为了将核心部分的内容写出来,其他附加功能一切从删
如果还有什么问题,请再说明。
2009.3.13