title: Why is the program not stopping after the main loop is stopped?
body: <p>I am trying to make my own version of Snake. I'm trying to set it up so that when a wall is hit, the main while loop stops running by setting run = False. This works when I close the program with the quit button, but for some reason is not working when a collision is detected. Any help?</p>
  <p>Note: I did try moving the gameOver() function out of the updateScreen() function and putting it separately at the end of the loop, but that didn't work either.</p>
  <pre><code>import pygame
  import time
  import os
  
  pygame.init()
  
  width, height = (500, 500)
  win = pygame.display.set_mode((width, height))
  pygame.display.set_caption(&quot;Snake&quot;)
  win.fill((0, 0, 0))
  
  # Snake Class
  class Snake:
      def __init__(self, x, y, width, height, color):
          self.x = x
          self.y = y
          self.width = width
          self.height = height
          self.color = color
          self.len = []
          self.xvel = 0
          self.yvel = 0
  
      def draw(self, window):
          win.fill((0, 0, 0))
          pygame.draw.rect(window, self.color, (self.x, self.y, self.width, self.height))
  
      def move(self):
          self.x += self.xvel
          self.y += self.yvel
  
      def checkCol(self):
          # Check if edge is hit
          if self.x &lt;= 0 or self.x + self.width &gt;= width:
              return True
          elif self.y &lt;= 0 or self.y + self.height &gt;= height:
              return True
          else:
              return False
  
  sn = Snake(100, 100, 15, 15, (0, 255, 0))
  
  # MAIN LOOP
  def main():
      run = True
      FPS = 15
      clock = pygame.time.Clock()
  
      fontStyle = pygame.font.SysFont(None, 50)
  
      def updateScreen():
          sn.move()
          sn.draw(win)
  
          gameOver()
  
          pygame.display.update()
  
      def gameOver():
          if sn.checkCol():
              run = False
              print(&quot;check&quot;)
  
      def message(msg, color):
          m = fontStyle.render(msg, True, color)
          win.blit(m, [width / 2, height / 2])
  
      while run:
          clock.tick(FPS)
  
          for event in pygame.event.get():
              if event.type == pygame.QUIT:
                  run = False
  
          keys = pygame.key.get_pressed()
  
          if keys[pygame.K_w]:
              sn.yvel = -10
              sn.xvel = 0
          if keys[pygame.K_s]:
              sn.yvel = 10
              sn.xvel = 0
          if keys[pygame.K_a]:
              sn.xvel = -10
              sn.yvel = 0
          if keys[pygame.K_d]:
              sn.xvel = 10
              sn.yvel = 0
  
          updateScreen()
  
      message(&quot;Game Over!&quot;, (255, 0, 0))
  
  main()
  </code></pre>