C#控制台模拟电梯工作原理
作者:hebedich 发布时间:2021-08-06 02:35:33
标签: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#能够有所帮助。


猜你喜欢
- Java中Static关键字的一些用法详解1. Static 修饰类属性,因为静态成员变量可以通过类名+属性名调用,非静态成员变量不能通过类
- 本文实例讲述了Java权重随机的实现方法。分享给大家供大家参考。具体分析如下:权重随机在项目中经常用到,所以我把它抽象到一个工具类中。一般实
- 在平常工作中我们经常会遇到maven引用的jar包冲突的事情,这时候我们就需要找出冲突的包,并将低版本或者缺少某些方法的jar给剔除掉。这个
- 本文实例为大家分享了Android使用GridView实现横向滚动效果的具体代码,供大家参考,具体内容如下第一次做横向滑动,看了一些列子,基
- 本文实例为大家分享了Java实现Flappy Bird游戏的具体代码,供大家参考,具体内容如下1.首先在mainActivity.xml中放
- 有了Eureka服务注册发现、Hystrix断路器、Ribbon服务调用负载均衡,以及spring cloud config 集群配置中心,
- 想要php版的朋友可以到这里下载测试 https://www.jb51.net/codes/83179.htmlimport java.io
- 不多说废话,直接进入主菜!!步骤:1.搭建SpringBoot的开发环境,略(有不会的可以私信我)。2.编写一个自定义异常,自定义异常需要继
- 访问者(Visitor)模式:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。访
- 比如,现在有一些图形,需要计算他们的面积,计算面积的方法都不一样,可以这么做声明一个抽象类//基类 abstrac
- 对于一个App的UI而言,在流畅性上的改进目标其实就是降低屏幕绘制的延迟,创建流畅和稳定的帧率以避免卡顿。在理想情况下,全部的测量、布局和绘
- 一、使用@CrossOrigin注解在controller类上加上@CrossOrigin注解,就能对这个类下面所有方法进行跨域访问了@Cr
- 一、Android系统启动Android设备从按下开机键到桌面显示画面,大致过程如下图流程:开机显示桌面、从桌面点击 App 图标到 Act
- 前言各位小伙伴大家好,我是A哥。IDEA上个较大版本的发布,要追溯到4月份了:时隔近4个月,北京时间2020-07-28深夜,Intelli
- 整理文档,搜刮出一个android 通过MediaRecorder实现简单的录音示例,稍微整理精简一下做下分享。MainActivitypa
- 一. 概述参考开源项目https://github.com/xkcoding/spring-boot-demo在系统运维中, 有时候为了避免
- 本文实例讲述了C#获取文件创建时间的方法。分享给大家供大家参考。具体如下:C#获取文件创建时间,主要用到了FileInfo的Creattio
- Spring中BeanFactory FactoryBean和ObjectFactory的三种的区别引言关于FactoryBean 和 Be
- java常量池是一个经久不衰的话题,也是面试官的最爱,题目花样百出,这次好好总结一下。理论先拙劣的表达一下jvm虚拟内存分布:程序计数器是j
- 初学线程时,总是将 run 方法和 start 方法搞混,虽然二者是完全不同的两个方法,但刚开始使用时很难分清,原因就是因为初次使用时效果貌