import time
import threading
import pygame
import sys
# Default values of signal timers
defaultGreen = {0: 10, 1: 10, 2: 10, 3: 10}
defaultRed = 150
defaultYellow = 5
signals = []
noOfSignals = 4
currentGreen =
nextGreen = (currentGreen + 1) %
currentYellow =
speeds =
# Coordinates of
x =
y =
vehicles =
vehicleTypes = {0:
directionNumbers = {0:
# Coordinates of signal image, timer, and vehicle count
signalCoods = [(530, 230), (810, 230), (810, 570), (530, 570)]
signalTimerCoods = [(530, 210), (810, 210), (810, 550), (530, 550)]
# Coordinates of stop lines
stopLines =
defaultStop =
pygame.init()
simulation = pygame.sprite.Group()
class TrafficSignal:
def __init__(self, red, yellow, green):
self.red = red
self.yellow = yellow
self.green = green
self.signalText =
class Vehicle(pygame.sprite.Sprite):
def __init__(self, lane, vehicleClass, direction_number, direction):
pygame.sprite.Sprite.__init__(self)
self.lane = lane
self.vehicleClass = vehicleClass
self.speed = speeds[vehicleClass]
self.direction_number = direction_number
self.direction = direction
self.x = x[direction][lane]
self.y = y[direction][lane]
self.crossed = 0
vehicles[direction][lane].append(self)
self.index = len(vehicles[direction][lane]) - 1
path =
self.image = pygame.image.load(path)
if (len(vehicles[direction][lane])
if (direction ==
self.stop = vehicles[direction][lane][self.index - 1].stop
vehicles[direction][lane][self.index - 1].image.get_rect().width - stoppingGap
elif (direction ==
self.stop = vehicles[direction][lane][self.index - 1].stop
vehicles[direction][lane][self.index - 1].image.get_rect().width + stoppingGap
elif (direction ==
self.stop = vehicles[direction][lane][self.index - 1].stop
vehicles[direction][lane][self.index - 1].image.get_rect().height - stoppingGap
elif (direction ==
self.stop = vehicles[direction][lane][self.index - 1].stop
vehicles[direction][lane][self.index - 1].image.get_rect().height + stoppingGap
else:
self.stop = defaultStop[direction]
if (direction ==
temp = self.image.get_rect().width + stoppingGap
x[direction][lane] -= temp
elif (direction ==
temp = self.image.get_rect().width + stoppingGap
x[direction][lane] += temp
elif (direction ==
temp = self.image.get_rect().height + stoppingGap
y[direction][lane] -= temp
elif (direction ==
temp = self.image.get_rect().height + stoppingGap
y[direction][lane] += temp
simulation.add(self)
def render(self, screen):
screen.blit(self.image, (self.x, self.y))
def move(self):
if (self.direction ==
if (self.crossed == 0 and self.x + self.image.get_rect().width
self.crossed = 1
if ((self.x + self.image.get_rect().width
currentGreen == 0 and currentYellow == 0)) and (
self.index == 0 or self.x + self.image.get_rect().width
vehicles[self.direction][self.lane][self.index - 1].x - movingGap))):
self.x += self.speed
elif (self.directi
if (self.crossed == 0 and self.y + self.image.get_rect().height
self.crossed = 1
if ((self.y + self.image.get_rect().height
currentGreen == 1 and currentYellow == 0)) and (
self.index == 0 or self.y + self.image.get_rect().height
vehicles[self.direction][self.lane][self.index - 1].y - movingGap))):
self.y += self.speed
elif (self.directi
if (self.crossed == 0 and self.x
self.crossed = 1
if ((self.x
self.index == 0 or self.x
vehicles[self.direction][self.lane][self.index - 1].x + vehicles[self.direction][self.lane][
self.x -= self.speed
elif (self.direction ==
if (self.crossed == 0 and self.y
self.crossed = 1
if ((self.y
self.index == 0 or self.y
vehicles[self.direction][self.lane][self.index - 1].y + vehicles[self.direction][self.lane][
self.y -= self.speed
# Initialization of signals with default values
def initialize():
ts1 = TrafficSignal(0, defaultYellow, defaultGreen[0])
signals.append(ts1)
ts2 = TrafficSignal(ts1.red + ts1.yellow + ts1.green, defaultYellow, defaultGreen[1])
signals.append(ts2)
ts3 = TrafficSignal(defaultRed, defaultYellow, defaultGreen[2])
signals.append(ts3)
ts4 = TrafficSignal(defaultRed, defaultYellow, defaultGreen[3])
signals.append(ts4)
repeat()
def repeat():
global currentGreen, currentYellow, nextGreen
while (signals[currentGreen].green
updateValues()
time.sleep(1)
currentYellow = 1
for i in range(0, 3):
for vehicle in vehicles[directionNumbers[currentGreen]][i]:
vehicle.stop = defaultStop[directionNumbers[currentGreen]]
while (signals[currentGreen].yellow
updateValues()
time.sleep(1)
currentYellow = 0
signals[currentGreen].green = defaultGreen[currentGreen]
signals[currentGreen].yellow = defaultYellow
signals[currentGreen].red = defaultRed
currentGreen = nextGreen
nextGreen = (currentGreen + 1) % noOfSignals
signals[nextGreen].red = signals[currentGreen].yellow + signals[currentGreen].green
repeat()
def updateValues():
for i in range(0, noOfSignals):
if (i == currentGreen):
if (currentYellow == 0):
signals[i].green -= 1
else:
signals[i].yellow -= 1
else:
signals[i].red -= 1
def generateVehicles():
while True:
vehicle_type = random.randint(0, 3)
lane_number = random.randint(1, 2)
temp = random.randint(0, 99)
direction_number = 0
dist = [25, 50, 75, 100]
if temp
directi
direction_number
elif temp
directi
direction_number
elif temp
directi
direction_number
elif temp
directi
direction_number
Vehicle(lane_number, vehicleTypes[vehicle_type], direction_number, directionNumbers[direction_number])
time.sleep(1)
class Main:
thread1 = threading.
thread1.daem
thread1.
thread1.daemon
#
black = (0, 0,
white = (255, 255,
# Screen
screenWidth =
screenHeight =
screenSize = (screenWidth,
# Setting background image i.e. image of the intersection
screen = pygame.display.set_mode(screenSize)
# Loading signal images and
redSignal = pygame.image.
yellowSignal = pygame.image.
greenSignal = pygame.image.
# f
thread2 = threading.
thread2.
thread2.
while
for event in pygame.event.get():
if (i ==
if (currentYellow ==
signals[i].signalText = signals[i].yellow
signals[i].signalText = signals[i].green
screen.blit(greenSignal, signalCoods[i])
else:
if (signals[i].red
signals[i].signalText = signals[i].red
signals[i].signalText =
screen.blit(redSignal, signalCoods[i])
for i in range(0,
signalTexts[i] = font.render(str(signals[i].signalText), True, white, black)
screen.blit(vehicle.image, [vehicle.x, vehicle.y])
Main()
Main()