C#控制台模拟电梯工作原理

 更新时间:2015年06月17日 11:37:00   投稿:hebedich  
简单的模拟一下电梯的运行,电梯内部和外部楼层呼叫的优先级判断。以前学硬件的时候做这个不成问题,现在用软件来模拟对我来说比较难,要C#的图形界面。求高手赐教。

每天上下楼都是乘坐电梯的,就想电梯的工作原理是什么呢?于是自己写了个控制台程序来模拟一下电梯的工作原理!
采用面向对象的编程思想!将电梯拆解为两部分;
第一部分就是每个楼层的控制器(每个楼层都有叫梯按钮的哈,一个向上一个向下)
第二部分就电梯间了。电梯间里有楼层按钮,你想上那个楼层就可以按哪个按钮了!
技术难点:状态刷新、命令顺序、电梯运行

核心代码一:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Elevator
{
  /// <summary>
  /// 楼层类,每个楼层有向上叫梯命令和向下叫梯命令
  /// </summary>
  public class Floor
  {
    Elevator elevator;
    /// <summary>
    /// 楼层号
    /// </summary>
    private int _iFloorNo;
 
    public int IFloorNo
    {
      get { return _iFloorNo; }
      set { _iFloorNo = value; }
    }
    /// <summary>
    /// 上行需求
    /// </summary>
    private bool _boolUp = false;
    /// <summary>
    /// 下行需求
    /// </summary>
    private bool _boolDown = false;
 
    private bool _boolStop = false;
 
    public bool BoolStop
    {
      get { return _boolStop; }
      set { _boolStop = value; }
    }
 
    #region 构造函数
     
    
    public Floor(int f,Elevator e)
    {
      _iFloorNo = f;
      elevator = e;
    }
 
    public Floor(int f)
    {
      _iFloorNo = f;
    }
 
    public Floor()
    {
    }
    #endregion
 
    /// <summary>
    /// 获取本层是否停靠,是否为命令层
    /// </summary>
    /// <returns>停靠true;过false;</returns>
    public bool GetStatus()
    {
      return _boolDown || _boolUp;
    }
 
    /// <summary>
    /// 上行返回1;下行返回-1;本层为目的地返回0;
    /// </summary>
    /// <returns></returns>
    public int GetStatusFlag()
    {
      if (_boolDown)
      {
        return -1;
      }
      else if(_boolUp)
      {
        return 1;
      }
      else if(_boolStop)
      {
        return 0;
      }
      else
      {
        return -999;
      }
 
    }
 
    /// <summary>
    /// 上楼命令
    /// </summary>
    public void CommandUp()
    {
      _boolUp = true;
      elevator.GoToCommandFloor();
    }
 
    /// <summary>
    /// 下楼命令
    /// </summary>
    public void CommandDown()
    {
      _boolDown = true;
      elevator.GoToCommandFloor();
    }
 
    /// <summary>
    /// 楼层到达状态刷新
    /// </summary>
    public void Refresh()
    {
      _boolUp = false;
      _boolDown = false;
      _boolStop = false;
    }
 
 
    /// <summary>
    /// 楼层比较看楼层号
    /// </summary>
    /// <param name="floor"></param>
    /// <returns></returns>
    public int Compare(Floor floor)
    {
      int result = 1;
      if (this._iFloorNo > floor._iFloorNo)
      {
        result = 1;
      }
      else if (this._iFloorNo < floor._iFloorNo)
      {
        result = -1;
      }
      else
      {
        result = 0;
      }
      return result;
    }
  }
}

核心代码二:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace Elevator
{
  /// <summary>
  /// 电梯类,有楼层选择方法
  /// </summary>
  public class Elevator
  {
    #region 属性
 
    /// <summary>
    /// 当前楼层
    /// </summary>
    public Floor _floorCurrent ;
    /// <summary>
    /// 全部楼层
    /// </summary>
    public List<Floor> _floorAll = new List<Floor>();
 
    #endregion
 
    /// <summary>
    /// 我想在所输入参数楼层停止
    /// </summary>
    /// <param name="floor">想要停止的楼层</param>
    public void CommandStop(Floor floor)
    {
      floor.BoolStop = true;
      GoToTargetFloor();
    }
 
 
    /// <summary>
    /// 电梯向上运行,运行到floor层
    /// </summary>
    /// <param name="floor"></param>
    public void GoUp(Floor floor)
    {
      if (_floorCurrent.Compare(floor) < 0)
      {
      Thread.Sleep(300);
      Console.WriteLine("上行:" + _floorCurrent.IFloorNo);
      int index = _floorAll.IndexOf(_floorCurrent);
      _floorCurrent = _floorAll[index + 1];
      GoUp(floor);
      }
      else {
        Thread.Sleep(500);
        Reach(floor);
      }
    }
 
    /// <summary>
    /// 电梯向下运行
    /// </summary>
    public void GoDown(Floor floor)
    {
      if (_floorCurrent.Compare(floor) > 0)
      {
        Thread.Sleep(300);
        Console.WriteLine("下行:" + _floorCurrent.IFloorNo);
        int index = _floorAll.IndexOf(_floorCurrent);
        _floorCurrent = _floorAll[index - 1];
        GoDown(floor);
      }
      else {
        Thread.Sleep(500);
        Reach(floor);
      }
    }
 
    /// <summary>
    /// 前往命令层,循环列表是否有命令层
    /// </summary>
    public void GoToCommandFloor()
    {
      foreach (var item in _floorAll)
      {
        if (item.GetStatus())
        {
          if (_floorCurrent.Compare(item) < 0)
          {
            GoUp(item);
          }
          else if (_floorCurrent.Compare(item) > 0)
          {
            GoDown(item);
          }
        }
      }
    }
 
    /// <summary>
    /// 前往目标楼层
    /// </summary>
    public void GoToTargetFloor() {
 
      foreach (var item in _floorAll)
      {
        if (item.GetStatusFlag()==0)
        {
          if (_floorCurrent.Compare(item) < 0)
          {
            GoUp(item);
          }
          else if (_floorCurrent.Compare(item) > 0)
          {
            GoDown(item);
          }
        }
      }
    }
    
 
    /// <summary>
    /// 到达楼层命令
    /// </summary>
    public void Reach(Floor f)
    {
      Console.WriteLine("电梯门打开,停靠层:"+f.IFloorNo);
      f.Refresh();
    }
 
  }
}

核心代码三:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace Elevator
{
  class Program
  {
    static void Main(string[] args)
    {
       Elevator elevator = new Elevator();
      List<Floor> lfloor = new List<Floor>();
      Floor f1 = new Floor(1, elevator);
      Floor f2 = new Floor(2, elevator);
      Floor f3 = new Floor(3, elevator);
      Floor f4 = new Floor(4, elevator);
      Floor f5 = new Floor(5, elevator);
      Floor f6 = new Floor(6, elevator);
      Floor f7 = new Floor(7, elevator);
      Floor f8 = new Floor(8, elevator);
      Floor f9 = new Floor(9, elevator);
      Floor f10 = new Floor(10, elevator);
      lfloor.Add(f1);
      lfloor.Add(f2);
      lfloor.Add(f3);
      lfloor.Add(f4);
      lfloor.Add(f5);
      lfloor.Add(f6);
      lfloor.Add(f7);
      lfloor.Add(f8);
      lfloor.Add(f9);
      lfloor.Add(f10);
      
      elevator._floorAll = lfloor;
      //设置当前楼层
      elevator._floorCurrent = f1;
      //2楼叫梯 想下楼
      f2.CommandDown();
      //目标楼层为1楼
      elevator.CommandStop(f1);
      //4楼叫梯
      f4.CommandUp();
      //目标楼层为8楼
      elevator.CommandStop(f8);
 
      Console.ReadLine();
    }
  }
}

以上所述就是本文的全部内容了,希望对大家熟练掌握C#能够有所帮助。

相关文章

  • C#实现对数组进行随机排序类实例

    C#实现对数组进行随机排序类实例

    这篇文章主要介绍了C#实现对数组进行随机排序类,实例分析了C#数组与随机数操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • 基于Unity3D实现3D照片墙效果

    基于Unity3D实现3D照片墙效果

    Unity3D不仅仅可以开发游戏,还有非常多的开发方向。本文就将用Unity3D制作出一个3D照片墙的效果,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-03-03
  • 带着问题读CLR via C#(笔记二)类型基础

    带着问题读CLR via C#(笔记二)类型基础

    A1: Object类型共包含6个方法,Equals, GetHashCode, ToString, GetType, MemberwiseClone和Finalize.
    2013-04-04
  • Unity 实现鼠标滑过UI时触发动画的操作

    Unity 实现鼠标滑过UI时触发动画的操作

    这篇文章主要介绍了Unity 实现鼠标滑过UI时触发动画的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • c# 深拷贝与浅拷贝的区别分析及实例

    c# 深拷贝与浅拷贝的区别分析及实例

    浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.
    2013-03-03
  • 基于C#编写获取硬件信息的工具类

    基于C#编写获取硬件信息的工具类

    这篇文章主要为大家详细介绍了如何利用C#编写一个获取硬件信息的简单工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-11-11
  • C#实现的图片、string相互转换类分享

    C#实现的图片、string相互转换类分享

    这篇文章主要介绍了C#实现的图片、string相互转换类分享,本文直接给出类代码,包含相互转换的方法,需要的朋友可以参考下
    2015-03-03
  • C#一个简单的定时小程序实现代码

    C#一个简单的定时小程序实现代码

    这篇文章主要介绍了C#实现一个简单的定时小程序代码,实现过程很简单,需要的朋友可以参考下
    2015-09-09
  • C# 迭代器分部类与索引器详情

    C# 迭代器分部类与索引器详情

    这篇文章主要介绍了C#迭代器分部类与索引器详情,迭代器 迭代器解决的是集合访问的问题,提供一种方法顺序访问一个集合对象中的各个元素,而不暴露对象内部标
    2022-07-07
  • C#数据结构之堆栈(Stack)实例详解

    C#数据结构之堆栈(Stack)实例详解

    这篇文章主要介绍了C#数据结构之堆栈(Stack),结合实例形式较为详细的分析了堆栈的原理与C#实现堆栈功能的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11

最新评论