前言
交通信號(hào)燈十字路口通行原理圖。
實(shí)際上歸類為四大類:
- 南北雙向直行
- 東西雙向直行
- 一對(duì)黑色粗線的左轉(zhuǎn)
- 一對(duì)紅色粗線的左轉(zhuǎn)。
狀態(tài)邏輯圖如下圖所示: - 假定通行順序?yàn)椋耗媳敝毙?、南北左轉(zhuǎn)、東西直行、東西左轉(zhuǎn)。
- 南北行人只在南北車流綠燈和黃燈的時(shí)候可以通行,東西人行同理。
- 假設(shè)綠燈25s,黃燈5s,這二者決定紅燈的時(shí)間。
- 四大類方向30s切換一次,總共循環(huán)為120s。
- 南北、東西行人通行時(shí)間一次循環(huán)內(nèi)分別為30s。
一、運(yùn)行效果
- 點(diǎn)擊開始:
進(jìn)入120s的整個(gè)循環(huán)中,第一部分南北直行綠燈在25s后變?yōu)辄S燈持續(xù)5s,然后為紅燈;第二部分南北左轉(zhuǎn)燈對(duì)應(yīng)變?yōu)榫G燈并進(jìn)行倒計(jì)時(shí),然后黃燈,紅燈;第三部分就是東西直行的綠燈黃燈紅燈,第四部分是東西左轉(zhuǎn)的綠黃紅切換。
-
南北向、東西向行人在對(duì)應(yīng)的時(shí)間切換綠燈和紅燈。
-
停止按鈕,停止計(jì)數(shù)器的計(jì)時(shí)。
-
思路:1秒的定時(shí)器計(jì)算時(shí)間,到了對(duì)應(yīng)的時(shí)間階段,觸發(fā)界面的狀態(tài)變化和倒計(jì)時(shí)。詳情見代碼。
二、界面設(shè)計(jì)
控件和命名圖片中標(biāo)出了同系列的第一個(gè),其余的根據(jù)方向類推命名。
三、代碼:
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;//計(jì)時(shí)器
const int MAX_LOOP_TIME = 120;//120s時(shí)間為一次循環(huán)
//以下時(shí)間段分別為:南北直行綠燈25,南北直行黃燈5,南北左轉(zhuǎn)綠燈25,南北左轉(zhuǎn)黃燈5,東西直行綠燈25,東西直行黃燈5,東西左轉(zhuǎn)綠燈25,東西左轉(zhuǎn)黃燈5
int[] PassTime={25, 30, 55, 60, 85, 90, 115, 120};
//事件委托的方式觸發(fā)
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)
{
//計(jì)時(shí)開始,進(jìn)入循環(huán),120s為一次循環(huán)
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;
//倒計(jì)時(shí)
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;
//倒計(jì)時(shí)
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;
//倒計(jì)時(shí)
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;
//倒計(jì)時(shí)
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;
//倒計(jì)時(shí)
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;
//倒計(jì)時(shí)
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;
//倒計(jì)時(shí)
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;
//倒計(jì)時(shí)
txtWtoE.Text = (MAX_LOOP_TIME - time - 1).ToString();
txtEtoW.Text = (MAX_LOOP_TIME - time - 1).ToString();
}
}
}
}
總結(jié)
重在理解交通信號(hào)燈的原理。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-494539.html
代碼重點(diǎn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-494539.html
- 使用了定時(shí)器
- 使用了委托事件的觸發(fā)方式
- 對(duì)常量和公共數(shù)組的應(yīng)用
- 變量命名規(guī)范、代碼整潔
到了這里,關(guān)于【W(wǎng)inForm項(xiàng)目】C#模擬交通信號(hào)燈|WinForm交通紅綠燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!