Facebook
From Tani, 1 Month ago, written in Python.
Embed
Download Paste or View Raw
Hits: 194
  1. import random
  2. import time
  3. import threading
  4. import pygame
  5. import sys
  6.  
  7. # Default values of signal timers
  8. defaultGreen = {0: 10, 1: 10, 2: 10, 3: 10}
  9. defaultRed = 150
  10. defaultYellow = 5
  11.  
  12. signals = []
  13. noOfSignals = 4
  14. currentGreen = 0   # Indicates which signal is green currently
  15. nextGreen = (currentGreen + 1) % noOfSignals    # Indicates which signal will turn green next
  16. currentYellow = 0   # Indicates whether the yellow signal is on or off
  17.  
  18. speeds = {'car': 2.25, 'bus': 1.8, 'truck': 1.8, 'bike': 2.5}  # average speeds of vehicles
  19.  
  20. # Coordinates of vehicles' start
  21. x = {'right': [0, 0, 0], 'down': [755, 727, 697], 'left': [1400, 1400, 1400], 'up': [602, 627, 657]}
  22. y = {'right': [348, 370, 398], 'down': [0, 0, 0], 'left': [498, 466, 436], 'up': [800, 800, 800]}
  23.  
  24. vehicles = {'right': {0: [], 1: [], 2: [], 'crossed': 0}, 'down': {0: [], 1: [], 2: [], 'crossed': 0},
  25.             'left': {0: [], 1: [], 2: [], 'crossed': 0}, 'up': {0: [], 1: [], 2: [], 'crossed': 0}}
  26. vehicleTypes = {0: 'car', 1: 'bus', 2: 'truck', 3: 'bike'}
  27. directionNumbers = {0: 'right', 1: 'down', 2: 'left', 3: 'up'}
  28.  
  29. # Coordinates of signal image, timer, and vehicle count
  30. signalCoods = [(530, 230), (810, 230), (810, 570), (530, 570)]
  31. signalTimerCoods = [(530, 210), (810, 210), (810, 550), (530, 550)]
  32.  
  33. # Coordinates of stop lines
  34. stopLines = {'right': 590, 'down': 330, 'left': 800, 'up': 535}
  35. defaultStop = {'right': 580, 'down': 320, 'left': 810, 'up': 545}
  36.  
  37. pygame.init()
  38. simulation = pygame.sprite.Group()
  39.  
  40.  
  41. class TrafficSignal:
  42.     def __init__(self, red, yellow, green):
  43.         self.red = red
  44.         self.yellow = yellow
  45.         self.green = green
  46.         self.signalText = ""
  47.  
  48.  
  49. class Vehicle(pygame.sprite.Sprite):
  50.     def __init__(self, lane, vehicleClass, direction_number, direction):
  51.         pygame.sprite.Sprite.__init__(self)
  52.         self.lane = lane
  53.         self.vehicleClass = vehicleClass
  54.         self.speed = speeds[vehicleClass]
  55.         self.direction_number = direction_number
  56.         self.direction = direction
  57.         self.x = x[direction][lane]
  58.         self.y = y[direction][lane]
  59.         self.crossed = 0
  60.         vehicles[direction][lane].append(self)
  61.         self.index = len(vehicles[direction][lane]) - 1
  62.         path = "images/" + direction + "/" + vehicleClass + ".png"
  63.         self.image = pygame.image.load(path)
  64.  
  65.         if (len(vehicles[direction][lane]) > 1 and vehicles[direction][lane][self.index - 1].crossed == 0):
  66.             if (direction == 'right'):
  67.                 self.stop = vehicles[direction][lane][self.index - 1].stop - \
  68.                             vehicles[direction][lane][self.index - 1].image.get_rect().width - stoppingGap
  69.             elif (direction == 'left'):
  70.                 self.stop = vehicles[direction][lane][self.index - 1].stop + \
  71.                             vehicles[direction][lane][self.index - 1].image.get_rect().width + stoppingGap
  72.             elif (direction == 'down'):
  73.                 self.stop = vehicles[direction][lane][self.index - 1].stop - \
  74.                             vehicles[direction][lane][self.index - 1].image.get_rect().height - stoppingGap
  75.             elif (direction == 'up'):
  76.                 self.stop = vehicles[direction][lane][self.index - 1].stop + \
  77.                             vehicles[direction][lane][self.index - 1].image.get_rect().height + stoppingGap
  78.         else:
  79.             self.stop = defaultStop[direction]
  80.  
  81.         if (direction == 'right'):
  82.             temp = self.image.get_rect().width + stoppingGap
  83.             x[direction][lane] -= temp
  84.         elif (direction == 'left'):
  85.             temp = self.image.get_rect().width + stoppingGap
  86.             x[direction][lane] += temp
  87.         elif (direction == 'down'):
  88.             temp = self.image.get_rect().height + stoppingGap
  89.             y[direction][lane] -= temp
  90.         elif (direction == 'up'):
  91.             temp = self.image.get_rect().height + stoppingGap
  92.             y[direction][lane] += temp
  93.         simulation.add(self)
  94.  
  95.     def render(self, screen):
  96.         screen.blit(self.image, (self.x, self.y))
  97.  
  98.     def move(self):
  99.         if (self.direction == 'right'):
  100.             if (self.crossed == 0 and self.x + self.image.get_rect().width > stopLines[self.direction]):
  101.                 self.crossed = 1
  102.             if ((self.x + self.image.get_rect().width <= self.stop or self.crossed == 1 or (
  103.                     currentGreen == 0 and currentYellow == 0)) and (
  104.                     self.index == 0 or self.x + self.image.get_rect().width < (
  105.                     vehicles[self.direction][self.lane][self.index - 1].x - movingGap))):
  106.                 self.x += self.speed
  107.          elif (self.directi 'down'):
  108.             if (self.crossed == 0 and self.y + self.image.get_rect().height > stopLines[self.direction]):
  109.                 self.crossed = 1
  110.             if ((self.y + self.image.get_rect().height <= self.stop or self.crossed == 1 or (
  111.                     currentGreen == 1 and currentYellow == 0)) and (
  112.                     self.index == 0 or self.y + self.image.get_rect().height < (
  113.                     vehicles[self.direction][self.lane][self.index - 1].y - movingGap))):
  114.                 self.y += self.speed
  115.          elif (self.directi 'left'):
  116.             if (self.crossed == 0 and self.x < stopLines[self.direction]):
  117.                 self.crossed = 1
  118.             if ((self.x >= self.stop or self.crossed == 1 or (currentGreen == 2 and currentYellow == 0)) and (
  119.                     self.index == 0 or self.x > (
  120.                     vehicles[self.direction][self.lane][self.index - 1].x + vehicles[self.direction][self.lane][
  121.                         self.index - 1].image.get_rect().width + movingGap))):
  122.                 self.x -= self.speed
  123.         elif (self.direction == 'up'):
  124.             if (self.crossed == 0 and self.y < stopLines[self.direction]):
  125.                 self.crossed = 1
  126.             if ((self.y >= self.stop or self.crossed == 1 or (currentGreen == 3 and currentYellow == 0)) and (
  127.                     self.index == 0 or self.y > (
  128.                     vehicles[self.direction][self.lane][self.index - 1].y + vehicles[self.direction][self.lane][
  129.                         self.index - 1].image.get_rect().height + movingGap))):
  130.                 self.y -= self.speed
  131.  
  132.  
  133. # Initialization of signals with default values
  134. def initialize():
  135.     ts1 = TrafficSignal(0, defaultYellow, defaultGreen[0])
  136.     signals.append(ts1)
  137.     ts2 = TrafficSignal(ts1.red + ts1.yellow + ts1.green, defaultYellow, defaultGreen[1])
  138.     signals.append(ts2)
  139.     ts3 = TrafficSignal(defaultRed, defaultYellow, defaultGreen[2])
  140.     signals.append(ts3)
  141.     ts4 = TrafficSignal(defaultRed, defaultYellow, defaultGreen[3])
  142.     signals.append(ts4)
  143.     repeat()
  144.  
  145.  
  146. def repeat():
  147.     global currentGreen, currentYellow, nextGreen
  148.     while (signals[currentGreen].green > 0):
  149.         updateValues()
  150.         time.sleep(1)
  151.     currentYellow = 1
  152.     for i in range(0, 3):
  153.         for vehicle in vehicles[directionNumbers[currentGreen]][i]:
  154.             vehicle.stop = defaultStop[directionNumbers[currentGreen]]
  155.     while (signals[currentGreen].yellow > 0):
  156.         updateValues()
  157.         time.sleep(1)
  158.     currentYellow = 0
  159.  
  160.     signals[currentGreen].green = defaultGreen[currentGreen]
  161.     signals[currentGreen].yellow = defaultYellow
  162.     signals[currentGreen].red = defaultRed
  163.  
  164.     currentGreen = nextGreen
  165.     nextGreen = (currentGreen + 1) % noOfSignals
  166.     signals[nextGreen].red = signals[currentGreen].yellow + signals[currentGreen].green
  167.     repeat()
  168.  
  169.  
  170. def updateValues():
  171.     for i in range(0, noOfSignals):
  172.         if (i == currentGreen):
  173.             if (currentYellow == 0):
  174.                 signals[i].green -= 1
  175.             else:
  176.                 signals[i].yellow -= 1
  177.         else:
  178.             signals[i].red -= 1
  179.  
  180.  
  181. def generateVehicles():
  182.     while True:
  183.         vehicle_type = random.randint(0, 3)
  184.         lane_number = random.randint(1, 2)
  185.         temp = random.randint(0, 99)
  186.         direction_number = 0
  187.         dist = [25, 50, 75, 100]
  188.         if temp < dist[0]:
  189.              directi
  190.         elif temp < dist[1]:
  191.              directi
  192.         elif temp < dist[2]:
  193.              directi
  194.         elif temp < dist[3]:
  195.              directi
  196.         Vehicle(lane_number, vehicleTypes[vehicle_type], direction_number, directionNumbers[direction_number])
  197.         time.sleep(1)
  198.  
  199.  
  200. class Main:
  201.     thread1 = threading.Thread(name="initialization", target=initialize, args=())
  202.      thread1.daem
  203.     thread1.start()
  204.  
  205.     # Colors
  206.     black = (0, 0, 0)
  207.     white = (255, 255, 255)
  208.  
  209.     # Screen size
  210.     screenWidth = 1400
  211.     screenHeight = 800
  212.     screenSize = (screenWidth, screenHeight)
  213.  
  214.     # Setting background image i.e. image of the intersection
  215.     background = pygame.image.load('images/intersection.png')
  216.  
  217.     screen = pygame.display.set_mode(screenSize)
  218.     pygame.display.set_caption("SIMULATION")
  219.  
  220.     # Loading signal images and font
  221.     redSignal = pygame.image.load('images/signals/red.png')
  222.     yellowSignal = pygame.image.load('images/signals/yellow.png')
  223.     greenSignal = pygame.image.load('images/signals/green.png')
  224.      f 30)
  225.  
  226.     thread2 = threading.Thread(name="generateVehicles", target=generateVehicles, args=())
  227.      thread2.daem
  228.     thread2.start()
  229.  
  230.     while True:
  231.         for event in pygame.event.get():
  232.             if event.type == pygame.QUIT:
  233.                 sys.exit()
  234.  
  235.         screen.blit(background, (0, 0))
  236.         for i in range(0, noOfSignals):
  237.             if (i == currentGreen):
  238.                 if (currentYellow == 1):
  239.                     signals[i].signalText = signals[i].yellow
  240.                     screen.blit(yellowSignal, signalCoods[i])
  241.                 else:
  242.                     signals[i].signalText = signals[i].green
  243.                     screen.blit(greenSignal, signalCoods[i])
  244.             else:
  245.                 if (signals[i].red <= 10):
  246.                     signals[i].signalText = signals[i].red
  247.                 else:
  248.                     signals[i].signalText = "---"
  249.                 screen.blit(redSignal, signalCoods[i])
  250.         signalTexts = ["", "", "", ""]
  251.  
  252.         for i in range(0, noOfSignals):
  253.             signalTexts[i] = font.render(str(signals[i].signalText), True, white, black)
  254.             screen.blit(signalTexts[i], signalTimerCoods[i])
  255.  
  256.         for vehicle in simulation:
  257.             screen.blit(vehicle.image, [vehicle.x, vehicle.y])
  258.             vehicle.move()
  259.         pygame.display.update()
  260.  
  261.  
  262. Main()
  263.  

Replies to traffic control py rss

Title Name Language When
Re: traffic control py mimi python 1 Month ago.