一道编程题。
c#电梯控制程序winform。主要是理了电梯控制清逻辑。
CheckBoxsup = new CheckBox[5];
CheckBoxsup[0] = new CheckBox();
CheckBoxsup[1] = new CheckBox();
CheckBoxsup[2] = ch2u;
CheckBoxsup[3] = ch3u;
CheckBoxsup[4] = ch4;
CheckBoxsdown = new CheckBox[5];
CheckBoxsdown[0] = new CheckBox();
CheckBoxsdown[1] = ch1;
CheckBoxsdown[2] = ch2d;
CheckBoxsdown[3] = ch3d;
CheckBoxsdown[4] = new CheckBox();
CheckBoxGoto = new CheckBox[5];
CheckBoxGoto[0] = new CheckBox();
CheckBoxGoto[1] = chkBoxfloor1;
CheckBoxGoto[2] = chkBoxfloor2;
CheckBoxGoto[3] = chkBoxfloor3;
CheckBoxGoto[4] = chkBoxfloor4;
Xfloor = 1;//当前楼层
/// <summary>
/// 打开关闭电梯门
/// </summary>
private void XOpenClose()
{
pictureBox3.Image = testA.Properties.Resources.ElevatorOpen;
pictureBox3.Update();
Thread.Sleep(500);
pictureBox3.Image = testA.Properties.Resources.ElevatorClose;
pictureBox3.Update();
Thread.Sleep(500);
}
/// <summary>
/// 判断方向逻辑
/// </summary>
private void Xwhere()
{
int sum = 0;//记录是否有任何需求按钮按下
for (int i = 1; i <= 4; i++)//轮询1-4楼三种按钮数组
{
if (CheckBoxsup[i].Checked || CheckBoxGoto[i].Checked || CheckBoxsdown[i].Checked)
//如果i楼有按钮按下
{
sum = 1;//记录,有最少1个按钮按下
if (i > Xfloor && Xflag != UpDown.Down)//如果需求楼层>当前楼层并且电梯方向是上行或停止
{
Xflag = UpDown.Up;//继续上行
break;//已确定方向,其他方向的不管,跳出循环
}
else if (i < Xfloor && Xflag != UpDown.Up)//如果需求楼层<当前楼层并且电梯方向是下行或停止
{
Xflag = UpDown.Down;//继续下行
break;//已确定方向,其他方向的再管,跳出循环
}
else//其他情况: 需求楼层与原方向相反 或 需求楼层=当前楼层(方向停) 则方向重置为停止
{
Xflag = UpDown.Stop;//设置为停止
}
}
}
if (sum == 0)//无任何按钮按下
{
Xflag = UpDown.Stop; //状态设置为停
}
}
/// <summary>
/// 电梯上下停控制
/// </summary>
/// <param name="updown"></param>
private void XUpDown(UpDown updown)
{
timer1.Stop();
if (updown == UpDown.Up)
{
// panelElevator.Location = new Point(panelElevator.Location.X, panelElevator.Location.Y - panelElevator.Height);
int y1 = panelElevator.Location.Y - panelElevator.Height;
for (int i = 0; i <= panelElevator.Height; i+=1)
{
Application.DoEvents();
panelElevator.Location = new Point(panelElevator.Location.X, panelElevator.Location.Y - 1);
// panelElevator.Update();
Thread.Sleep(10);
}
Thread.Sleep(10);
}
else if (updown == UpDown.Down)
{
// panelElevator.Location = new Point(panelElevator.Location.X, panelElevator.Location.Y + 1);
int y1 = panelElevator.Location.Y + panelElevator.Height;
for (int i = 0; i <= panelElevator.Height; i+=1)
{
Application.DoEvents();
panelElevator.Location = new Point(panelElevator.Location.X, panelElevator.Location.Y + 1);
// panelElevator.Update();
Thread.Sleep(10);
}
// panelElevator.Update();
Thread.Sleep(10);
}
else if (updown == UpDown.Stop)
{
panelElevator.Update();
}
timer1.Start();
}
/// <summary>
/// 轮询电梯
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
Xwhere(); // 判断方向
if (Xflag == UpDown.Up)
{
XUpDown(UpDown.Up);
Xfloor++;
if (CheckBoxGoto[Xfloor].Checked || CheckBoxsup[Xfloor].Checked)
{
XOpenClose();
CheckBoxGoto[Xfloor].Checked = CheckBoxsup[Xfloor].Checked = false;
}
}
if (Xflag == UpDown.Down)
{
XUpDown(UpDown.Down);
Xfloor--;
{
if (CheckBoxGoto[Xfloor].Checked || CheckBoxsdown[Xfloor].Checked)
{
XOpenClose();
CheckBoxGoto[Xfloor].Checked = CheckBoxsdown[Xfloor].Checked = false;
}
}
}
if (Xflag == UpDown.Stop)
{
if (CheckBoxsup[Xfloor].Checked || CheckBoxGoto[Xfloor].Checked || CheckBoxsdown[Xfloor].Checked)
{
XOpenClose();
CheckBoxGoto[Xfloor].Checked = CheckBoxsup[Xfloor].Checked = CheckBoxsdown[Xfloor].Checked = false;
}
}
}