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

news2024/11/20 8:41:16

文章目录

  • 前言
  • 一、运行效果
  • 二、界面设计
  • 三、代码:
  • 总结


前言

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

实际上归类为四大类:

  • 南北双向直行
  • 东西双向直行
  • 一对黑色粗线的左转
  • 一对红色粗线的左转。
    在这里插入图片描述
    状态逻辑图如下图所示:
  • 假定通行顺序为:南北直行、南北左转、东西直行、东西左转。
  • 南北行人只在南北车流绿灯和黄灯的时候可以通行,东西人行同理。
  • 假设绿灯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();
            }
        }
    }

   
}


总结

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

代码重点:

  • 使用了定时器
  • 使用了委托事件的触发方式
  • 对常量和公共数组的应用
  • 变量命名规范、代码整洁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb笔记(四)

前端基础 **提醒&#xff1a;**还没有申请到IDEA专业版本授权的同学要抓紧了&#xff0c;很快就需要用到。 经过前面基础内容的学习&#xff0c;现在我们就可以正式地进入Web开发的学习当中啦~ 本章节会讲解前端基础内容&#xff08;如果已经学习过&#xff0c;可以直接跳到…

一文说透:低代码开发平台和零代码平台区别是什么?

低代码开发平台和零代码平台区别是什么&#xff1f; 一个简单的例子就可以解释清楚。 假设你想入住一套新房&#xff0c;回看住房变迁史&#xff1a; 最原始方式是&#xff1a;自己建造往后一点&#xff0c;交付“毛坯房”&#xff1a;开发商统一建小区&#xff0c;不需要自…

5本豆瓣高分Python技术书籍

Python的经典书籍有很多&#xff0c;推荐五本对初学者来说非常实用的入门书&#xff0c;豆瓣评分都在8以上。分别是&#xff1a; 《Python学习手册》&#xff0c;豆瓣8.2分《Python编程&#xff0c;从入门到实践》&#xff0c;豆瓣9.3分《Python Cookbook》&#xff0c;豆瓣9.…

如何优化ABAP程序

文章目录 1 Before code3 After code3 Performance4 Summary4.1 We don t use nested loop as possible as .4.2 We use useful data in the program .4.3 Take care history data . 1 Before code DATA:BEGIN OF LW_SZJE,ZJN TYPE P DECIMALS 1, "折旧年KANSW LIKE A…

从零玩转系列之微信支付实战PC端接口搭建

一、前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端) 在此之前已经更新了微信支付开篇、微信支付安…

阿里云+Nginx Proxy Manager 设置二级域名

这里我们以购买阿里云的域名为例 有域名的作用&#xff1a;当我们在浏览器上面访问主机的某一个端口时&#xff0c;必须输入主机ip端口号&#xff0c;这就会非常的麻烦&#xff0c;而且也会暴露出我们的主机名&#xff0c;很不安全&#xff0c;因此域名的好处就是可以将我们的主…

开关电源-FPC入门知识

01功率因数补偿和功率因数校正 功率因数补偿&#xff1a;在上世纪五十年代&#xff0c;已经针对具有感性负载的交流用电器具的电压和电流不同相&#xff08;图1&#xff09;从而引起的供电效率低下提出了改进方法&#xff08;由于感性负载的电流滞后所加电压&#xff0c;由于电…

JavaWeb笔记(二)

数据库基础 数据库是学习JavaWeb的一个前置&#xff0c;只有了解了数据库的操作和使用&#xff0c;我们才能更好地组织和管理网站应用产生的数据。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IJ1neG69-1686619058026)(null)] 什么是数据库 数…

2023中国纸业碳中和与可持续峰会,九月来袭!

制浆与造纸是资源密集型产业&#xff0c;具有高污染、高能耗的特点。“双碳”目标提出后&#xff0c;造纸行业同时面临需求和产能增长的生产现状与实现“双碳”目标的考验。如何在未来保证产量增长&#xff0c;还能实现节能减排和降耗&#xff0c;成为了所有制浆造纸及上下游产…

docker容器启动的问题 - docker容器和虚拟机的比较 - docker的底层隔离机制

目录 一、docker容器启动的问题&#xff1f; 二、什么是docker仓库&#xff1f; 三、虚拟机和docker容器的区别&#xff1a; docker的优势&#xff1a; docker的缺点&#xff1a; 对比&#xff1a; 四、docker的底层隔离机制 参考文献&#xff1a;LXC linux容器简介——…

前端项目架构怎么搭

前端项目架构 文章目录 **前端项目架构** **框架选型标准****异常处理****自动化构建** **&#xff08;打包&#xff09;****基础组件****公共方法封装****目录结构分配原则** 框架选型标准 ​ 框架的选型需要考虑很多因素&#xff0c;如该技术能否可以满足业务需求、浏览器支…

《大卫科波菲尔》社会网络分析

《大卫科波菲尔》社会网络分析 1.简介1.1数据集介绍1.2社会网络分析简介1.3《大卫科波菲尔》介绍 2.描述性统计3.网络概述4.社区发现5.好句摘抄6.总结和不足 1.简介 1.1数据集介绍 Newman教授的个人数据网站 网址&#xff1a;http://www-personal.umich.edu/~mejn/netdata/ 从…

网络设备容量测试该如何进行?

网络设备容量测试该如何进行? 网络设备容量测试是现代IT运维管理中的重要内容之一。随着企业对网络带宽需求的不断增加&#xff0c;为了更好地满足用户需求和提升网络性能&#xff0c;进行网络设备容量测试显得尤为重要。那么&#xff0c;网络设备容量测试该如何进行呢? 首先…

转行大数据该怎么学

大数据分析主要面向于离线计算。负责数据分析、报表统计等工作&#xff0c;重于数据价值的体现&#xff1b;数据的ETL调度&#xff0c;即E抽取、T转换、L加载&#xff0c;着重于离线数据的流转。虽然工作形式比较单一&#xff0c;但日常需求比较多&#xff0c;尤其是节假日的数…

UE特效案例 —— 武器附魔

一&#xff0c;环境配置 创建默认地形Landscape&#xff0c;如给地形上材质需确定比例&#xff1b;添加环境主光源DirectionalLight&#xff0c;设置相应的强度和颜色&#xff1b;PostProcessVolume设置曝光&#xff0c;设置Min/Max Brightness为1&#xff1b; 与关闭Game Sett…

从数据中台实践,浅谈数据质量管理

时代背景 近20年来&#xff0c;我国的科学技术发展日新月异&#xff0c;各种新兴技术层出不穷&#xff0c;深刻的改变着各行各业&#xff0c;也改变着我们的生活。大数据、云计算、人工智能的出现更是将技术革命推向了高潮。在这种背景下&#xff0c;继农业经济、工业经济之后&…

NSS周常刷密码(3)

[LitCTF 2023]md5的破解 from hashlib import md5 from string import ascii_lowercase,digits import itertools f1 LitCTF{md5can3derypt213thoughcrsh} for i in itertools.product(ascii_lowercasedigits, repeat4):t .join(i)flag f1[:13] t[:2] f1[13:16] t[2] f…

d2l_第四章学习_Classification/Softmax Regression

x.1 Classification 分类问题理论 x.1.1 Classification和Regression的区别 注意&#xff0c;广义上来讲&#xff0c;Classification/Softmax Regression 和 Linear Regression 都属于线性模型。但人们口语上更习惯用Classification表示Softmax Regression&#xff0c;而用Re…

13. ReentrantLock、ReentrantReadWriteLock、StampedLock讲解

13.1 关于锁的面试题 ● 你知道Java里面有那些锁 ● 你说说你用过的锁&#xff0c;锁饥饿问题是什么&#xff1f; ● 有没有比读写锁更快的锁 ● StampedLock知道吗&#xff1f;&#xff08;邮戳锁/票据锁&#xff09; ● ReentrantReadWriteLock有锁降级机制&#xff0c;你知道…

linux实验四 vi编辑器及用户管理

1、vi编辑器的详细使用 &#xff08;1&#xff09;在用户主目录下建一个名为vi的目录。 &#xff08;2&#xff09;进入vi目录。 &#xff08;3&#xff09;将文件/etc/man_db.conf复制到当前目录下&#xff0c;并用命令sudo修改man_db.conf的属性为所有用户可以读写。 &am…