30【WinForm项目】C#模拟交通信号灯|WinForm交通红绿灯

简介: 交通信号灯十字路口通行原理图。

前言

交通信号灯十字路口通行原理图。

实际上归类为四大类:

  • 南北双向直行
  • 东西双向直行
  • 一对黑色粗线的左转
  • 一对红色粗线的左转。

在这里插入图片描述
状态逻辑图如下图所示:

  • 假定通行顺序为:南北直行、南北左转、东西直行、东西左转。
  • 南北行人只在南北车流绿灯和黄灯的时候可以通行,东西人行同理。
  • 假设绿灯25s,黄灯5s,这二者决定红灯的时间。
  • 四大类方向30s切换一次,总共循环为120s。
  • 南北、东西行人通行时间一次循环内分别为30s。

在这里插入图片描述

一、运行效果

  • 点击开始:

进入120s的整个循环中,第一部分南北直行绿灯在25s后变为黄灯持续5s,然后为红灯;第二部分南北左转灯对应变为绿灯并进行倒计时,然后黄灯,红灯;第三部分就是东西直行的绿灯黄灯红灯,第四部分是东西左转的绿黄红切换。

  • 南北向、东西向行人在对应的时间切换绿灯和红灯。
  • 停止按钮,停止计数器的计时。
  • 思路:1秒的定时器计算时间,到了对应的时间阶段,触发界面的状态变化和倒计时。详情见代码。

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、界面设计

控件和命名图片中标出了同系列的第一个,其余的根据方向类推命名。

在这里插入图片描述

三、代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace TrafficLight
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int time = 0;//计时器
        const int MAX_LOOP_TIME = 120;//120s时间为一次循环

        //以下时间段分别为:南北直行绿灯25,南北直行黄灯5,南北左转绿灯25,南北左转黄灯5,东西直行绿灯25,东西直行黄灯5,东西左转绿灯25,东西左转黄灯5
        int[] PassTime={25, 30, 55, 60, 85, 90, 115, 120};
        
        //事件委托的方式触发
        public delegate void delegateTrafficLight(int tm);
        public event delegateTrafficLight EventTrafficLight;


        private void btnStart_Click(object sender, EventArgs e)
        {
            timer1.Start();

            //Thread threadLightChg = new Thread(LightChange);
            //threadLightChg.Start();
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            timer1.Stop();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //计时开始,进入循环,120s为一次循环
            if (time < MAX_LOOP_TIME - 1)  //119秒后置为0秒
            {
                time += 1;
                if (EventTrafficLight != null)
                {
                    EventTrafficLight(time);
                }
            }
            else
            {
                time = 0;
                if (EventTrafficLight != null)
                {
                    EventTrafficLight(time);
                }

                txtStoN.Clear();
                txtNtoS.Clear();
                txtWtoE.Clear();
                txtEtoW.Clear();
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.EventTrafficLight += new delegateTrafficLight(LightChange);
        }

        public void LightChange(int time)
        {
            if (time < PassTime[0])
            {
                lbStoNStraight.BackColor = Color.Green;
                lbStoNLeft.BackColor = Color.Red;

                lbNtoSStraight.BackColor = Color.Green;
                lbNtoSLeft.BackColor = Color.Red;

                lbWtoEStraight.BackColor = Color.Red;
                lbWtoELeft.BackColor = Color.Red;

                lbEtoWStraight.BackColor = Color.Red;
                lbEtoWLeft.BackColor = Color.Red;

                lbPeopleNS1.BackColor = Color.Green;
                lbPeopleNS2.BackColor = Color.Green;
                lbPeopleNS3.BackColor = Color.Green;
                lbPeopleNS4.BackColor = Color.Green;

                lbPeopleWE1.BackColor = Color.Red;
                lbPeopleWE2.BackColor = Color.Red;
                lbPeopleWE3.BackColor = Color.Red;
                lbPeopleWE4.BackColor = Color.Red;

                //倒计时
                txtStoN.Text = (PassTime[0] - time).ToString();
                txtNtoS.Text = (PassTime[0] - time).ToString();

            }
            else if (time >= PassTime[0] && time < PassTime[1])
            {
                lbStoNStraight.BackColor = Color.Yellow;
                lbStoNLeft.BackColor = Color.Red;

                lbNtoSStraight.BackColor = Color.Yellow;
                lbNtoSLeft.BackColor = Color.Red;

                lbWtoEStraight.BackColor = Color.Red;
                lbWtoELeft.BackColor = Color.Red;

                lbEtoWStraight.BackColor = Color.Red;
                lbEtoWLeft.BackColor = Color.Red;

                lbPeopleNS1.BackColor = Color.Green;
                lbPeopleNS2.BackColor = Color.Green;
                lbPeopleNS3.BackColor = Color.Green;
                lbPeopleNS4.BackColor = Color.Green;

                lbPeopleWE1.BackColor = Color.Red;
                lbPeopleWE2.BackColor = Color.Red;
                lbPeopleWE3.BackColor = Color.Red;
                lbPeopleWE4.BackColor = Color.Red;

                //倒计时
                txtStoN.Text = (PassTime[1] - time - 1).ToString();
                txtNtoS.Text = (PassTime[1] - time - 1).ToString();
            }
            else if (time >= PassTime[1] && time < PassTime[2])
            {
                lbStoNStraight.BackColor = Color.Red;
                lbStoNLeft.BackColor = Color.Green;

                lbNtoSStraight.BackColor = Color.Red;
                lbNtoSLeft.BackColor = Color.Green;

                lbWtoEStraight.BackColor = Color.Red;
                lbWtoELeft.BackColor = Color.Red;

                lbEtoWStraight.BackColor = Color.Red;
                lbEtoWLeft.BackColor = Color.Red;

                lbPeopleNS1.BackColor = Color.Red;
                lbPeopleNS2.BackColor = Color.Red;
                lbPeopleNS3.BackColor = Color.Red;
                lbPeopleNS4.BackColor = Color.Red;

                lbPeopleWE1.BackColor = Color.Red;
                lbPeopleWE2.BackColor = Color.Red;
                lbPeopleWE3.BackColor = Color.Red;
                lbPeopleWE4.BackColor = Color.Red;

                //倒计时
                txtStoN.Text = (PassTime[2] - time - 1).ToString();
                txtNtoS.Text = (PassTime[2] - time - 1).ToString();
            }
            else if (time >= PassTime[2] && time < PassTime[3])
            {
                lbStoNStraight.BackColor = Color.Red;
                lbStoNLeft.BackColor = Color.Yellow;

                lbNtoSStraight.BackColor = Color.Red;
                lbNtoSLeft.BackColor = Color.Yellow;

                lbWtoEStraight.BackColor = Color.Red;
                lbWtoELeft.BackColor = Color.Red;

                lbEtoWStraight.BackColor = Color.Red;
                lbEtoWLeft.BackColor = Color.Red;

                lbPeopleNS1.BackColor = Color.Red;
                lbPeopleNS2.BackColor = Color.Red;
                lbPeopleNS3.BackColor = Color.Red;
                lbPeopleNS4.BackColor = Color.Red;

                lbPeopleWE1.BackColor = Color.Red;
                lbPeopleWE2.BackColor = Color.Red;
                lbPeopleWE3.BackColor = Color.Red;
                lbPeopleWE4.BackColor = Color.Red;

                //倒计时
                txtStoN.Text = (PassTime[3] - time - 1).ToString();
                txtNtoS.Text = (PassTime[3] - time - 1).ToString();
            }
            else if (time >= PassTime[3] && time < PassTime[4])
            {
                lbStoNStraight.BackColor = Color.Red;
                lbStoNLeft.BackColor = Color.Red;

                lbNtoSStraight.BackColor = Color.Red;
                lbNtoSLeft.BackColor = Color.Red;

                lbWtoEStraight.BackColor = Color.Green;
                lbWtoELeft.BackColor = Color.Red;

                lbEtoWStraight.BackColor = Color.Green;
                lbEtoWLeft.BackColor = Color.Red;

                lbPeopleNS1.BackColor = Color.Red;
                lbPeopleNS2.BackColor = Color.Red;
                lbPeopleNS3.BackColor = Color.Red;
                lbPeopleNS4.BackColor = Color.Red;

                lbPeopleWE1.BackColor = Color.Green;
                lbPeopleWE2.BackColor = Color.Green;
                lbPeopleWE3.BackColor = Color.Green;
                lbPeopleWE4.BackColor = Color.Green;

                //倒计时
                txtWtoE.Text = (PassTime[4] - time - 1).ToString();
                txtEtoW.Text = (PassTime[4] - time - 1).ToString();
            }
            else if (time >= PassTime[4] && time < PassTime[5])
            {
                lbStoNStraight.BackColor = Color.Red;
                lbStoNLeft.BackColor = Color.Red;

                lbNtoSStraight.BackColor = Color.Red;
                lbNtoSLeft.BackColor = Color.Red;

                lbWtoEStraight.BackColor = Color.Yellow;
                lbWtoELeft.BackColor = Color.Red;

                lbEtoWStraight.BackColor = Color.Yellow;
                lbEtoWLeft.BackColor = Color.Red;

                lbPeopleNS1.BackColor = Color.Red;
                lbPeopleNS2.BackColor = Color.Red;
                lbPeopleNS3.BackColor = Color.Red;
                lbPeopleNS4.BackColor = Color.Red;

                lbPeopleWE1.BackColor = Color.Green;
                lbPeopleWE2.BackColor = Color.Green;
                lbPeopleWE3.BackColor = Color.Green;
                lbPeopleWE4.BackColor = Color.Green;

                //倒计时
                txtWtoE.Text = (PassTime[5] - time - 1).ToString();
                txtEtoW.Text = (PassTime[5] - time - 1).ToString();
            }
            else if (time >= PassTime[5] && time < PassTime[6])
            {
                lbStoNStraight.BackColor = Color.Red;
                lbStoNLeft.BackColor = Color.Red;

                lbNtoSStraight.BackColor = Color.Red;
                lbNtoSLeft.BackColor = Color.Red;

                lbWtoEStraight.BackColor = Color.Red;
                lbWtoELeft.BackColor = Color.Green;

                lbEtoWStraight.BackColor = Color.Red;
                lbEtoWLeft.BackColor = Color.Green;

                lbPeopleNS1.BackColor = Color.Red;
                lbPeopleNS2.BackColor = Color.Red;
                lbPeopleNS3.BackColor = Color.Red;
                lbPeopleNS4.BackColor = Color.Red;

                lbPeopleWE1.BackColor = Color.Red;
                lbPeopleWE2.BackColor = Color.Red;
                lbPeopleWE3.BackColor = Color.Red;
                lbPeopleWE4.BackColor = Color.Red;

                //倒计时
                txtWtoE.Text = (PassTime[6] - time - 1).ToString();
                txtEtoW.Text = (PassTime[6] - time - 1).ToString();
            }
            else if (time >= PassTime[6])
            {
                lbStoNStraight.BackColor = Color.Red;
                lbStoNLeft.BackColor = Color.Red;

                lbNtoSStraight.BackColor = Color.Red;
                lbNtoSLeft.BackColor = Color.Red;

                lbWtoEStraight.BackColor = Color.Red;
                lbWtoELeft.BackColor = Color.Yellow;

                lbEtoWStraight.BackColor = Color.Red;
                lbEtoWLeft.BackColor = Color.Yellow;

                lbPeopleNS1.BackColor = Color.Red;
                lbPeopleNS2.BackColor = Color.Red;
                lbPeopleNS3.BackColor = Color.Red;
                lbPeopleNS4.BackColor = Color.Red;

                lbPeopleWE1.BackColor = Color.Red;
                lbPeopleWE2.BackColor = Color.Red;
                lbPeopleWE3.BackColor = Color.Red;
                lbPeopleWE4.BackColor = Color.Red;

                //倒计时
                txtWtoE.Text = (MAX_LOOP_TIME - time - 1).ToString();
                txtEtoW.Text = (MAX_LOOP_TIME - time - 1).ToString();
            }
        }
    }

   
}

总结

重在理解交通信号灯的原理。

代码重点:

  • 使用了定时器
  • 使用了委托事件的触发方式
  • 对常量和公共数组的应用
  • 变量命名规范、代码整洁
目录
相关文章
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
1011 0
|
4月前
|
监控 网络协议 C#
基于C#的TCP/IP通信客户端与服务器
基于C#的TCP/IP通信客户端与服务器
415 0
|
6月前
|
缓存 监控 数据可视化
基于C#的CAN总线BMS上位机开发方案
基于C#的CAN总线BMS上位机开发方案
513 1
|
7月前
|
人工智能 运维 监控
2026,AI Agent指挥官的崛起与代码的黄昏
2026年,AI智能体泛滥引发系统性“熵增”危机:死锁、幻觉级联、资源踩踏频发。本文基于“智能体来了(西南总部)”研判与金加德讲师“多智能体治理”理论,提出技术人新定位——AI Agent指挥官(聚焦目标拆解与工作流设计)与AI调度官(专注运行治理与安全熔断),揭示Agentic Workflow时代的核心护城河:业务洞察力、逻辑编排力与AgentOps工程能力。(239字)
503 0
|
设计模式 开发者 UED
123. [HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 基础篇
在现代移动应用和平板应用中,侧边栏导航已经成为一种常见且实用的UI设计模式。HarmonyOS NEXT提供了专门的`SideBarContainer`组件来实现这一功能,它能够轻松创建可显示和隐藏的侧边栏布局,非常适合新闻阅读、电子商务、文件管理等应用场景。
531 3
123. [HarmonyOS NEXT 实战案例一:SideBarContainer] 侧边栏容器实战:新闻阅读应用侧边栏布局 基础篇
|
编译器 C语言 C++
NumPy 1.26 中文官方指南(三)(2)
NumPy 1.26 中文官方指南(三)
784 1
|
机器学习/深度学习 人工智能 自然语言处理
《打破知识壁垒:解锁自然语言处理模型跨领域知识图谱关联与推理密码》
在人工智能快速发展的背景下,自然语言处理(NLP)技术成为各行业智能化变革的关键。知识图谱作为结构化的语义知识库,通过“实体-关系-实体”三元组描绘现实世界的概念及其关系,为NLP模型提供背景知识和推理依据。然而,随着多领域知识的爆发式增长,如何实现不同领域知识图谱的有效关联与推理成为亟待解决的问题。本文探讨了理解领域特性、实体对齐、关系映射与融合及深度学习推理模型构建等关键步骤,旨在打破领域间知识壁垒,提升NLP技术的智能化水平,推动其在智能问答、推荐、决策辅助等领域的广泛应用。
673 1
Vue3统计数值(Statistic)
这是一个基于 Vue3 的统计数值组件 `Statistic`,用于展示数据指标。它支持设置标题、数值内容、精度、前缀、后缀及千分位标识符等,并可通过插槽和自定义函数实现更丰富的展示效果。
728 2
Vue3统计数值(Statistic)
|
小程序 前端开发 JavaScript
微信小程序之简易计算器的制作
微信小程序之简易计算器的制作
610 0
微信小程序之简易计算器的制作
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
614 4