title: How to test if areas overlap (Python)
body: <p>I'm a novice coder writing a Python program to simulate natural selection using the Pygame library.</p>
  
  <p>One of the things I'm trying to accomplish is to make moving elliptical (or if this is too complex, rectangular) objects that overlap produce a child object that inherits their traits.</p>
  
  <p>My problem is that I'm unable to create a working code to identify when any two object areas are overlapped. I need the code to identify when two objects are crossing paths (and momentarily overlapped) so that the game knows to spawn another shape. </p>
  
  <p>At one point I tried a complex nested for-loop that I thought would work, but that caused the simulation to crash.</p>
  
  <p>This is my code as is:</p>
  
  <pre><code>import pygame, random
  
  # Define some colors
  black = (0, 0, 0)
  white = (255, 255, 255)
  red = (255, 0, 0)
  green = (0, 255, 0)
  blue = (0, 0, 255)
  
  pygame.init()
  
  # Set the width and height of the screen
  map_width = 800
  map_height = 800
  size = [map_width, map_height]
  screen = pygame.display.set_mode(size)
  
  # Display name
  pygame.display.set_caption("Natural Selection Game")
  
  # Loop until the user clicks the close button.
  done = False
  
  # Used to manage how fast the screen updates
  clock = pygame.time.Clock()
  
  # -------- Organism -----------
  class Organism:
  
      def __init__(self):
          # Speed and direction
          self.change_x = random.randrange(0,6)
          self.change_y = random.randrange(0,6)
  
          # Dimensions
          self.width = random.randrange(5,50)
          self.height = random.randrange(5,50)
  
          # Diet (WIP)
          self.color = random.choice([red, green, blue])
  
          # Starting position
          self.x = random.randrange(0 + self.width, 800 - self.width)
          self.y = random.randrange(0 + self.height, 800 - self.height)
  
      # Spawn
      def spawn(self, screen):
          pygame.draw.ellipse(screen, self.color, [self.x, self.y, self.width, self.height])
  
      # Initiate movement
      def move(self):
          self.x += self.change_x
          self.y += self.change_y
  
      # Bounce 
      def bounce(self, map_width, map_height):
          if self.x &lt; 0 or self.x &gt; map_width - self.width:
              self.change_x = self.change_x * -1
          if self.y &lt; 0 or self.y &gt; map_height - self.height:
              self.change_y = self.change_y * -1
  
  # Initial spawning conditions
  org_list = []
  org_number = 15
  
  for i in range(0,org_number):
      org = Organism()
      org_list.append(org)
  
  # -------- Main Program Loop -----------
  while not done:
      # ---- Event Processing ----
      for event in pygame.event.get():
          if event.type == pygame.QUIT:
              done = True
  
      # ---- Logic ----
      # Movement
      for i in org_list:
          i.move()
          i.bounce(map_width, map_height)
  
      # Reproduction
  
      # ---- Drawing ----
      # Set the screen background
      screen.fill(white)
  
      # Spawn organisms
      for i in org_list:
          i.spawn(screen)
  
      # --- Wrap-up
      # Limit to 60 frames per second
      clock.tick(60)
  
      # Go ahead and update the screen with what we've drawn.
      pygame.display.flip()
  
  # Close everything down
  pygame.quit()
  </code></pre>
  
  <p>Any insight would be much appreciated.</p>