text: 
  # pip install freegames
  
  # Use Arrow Keys To Navigate
  
  # import modules
  from random import choice
  import turtle as t
  from freegames import floor, vector
  
  # Set window title and icon
  t.title("Pacman")
  root = t.Screen()._root
  root.iconbitmap("logo-ico.ico")
  
  state = {'score': 0}
  path = t.Turtle(visible=False)
  writer = t.Turtle(visible=False)
  aim = vector(5, 0)
  pacman = vector(-40, -80)
  ghosts = [
      [vector(-180, 160), vector(5, 0)],
      [vector(-180, -160), vector(0, 5)],
      [vector(100, 160), vector(0, -5)],
      [vector(100, -160), vector(-5, 0)],
  ]
  tiles = [
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
      0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
      0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
      0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
      0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
      0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
      0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
      0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
      0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
      0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0,
      0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
      0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
      0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0,
      0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
      0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0,
      0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
      0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  ]
  
      # Functions
  # Draw square using path at (x, y)
  def square(x, y):
      path.up()
      path.goto(x, y)
      path.down()
      path.begin_fill()
  
      for count in range(4):
          path.forward(20)
          path.left(90)
  
      path.end_fill()
  
  # Return offset of point in tiles
  def offset(point):
      x = (floor(point.x, 20) + 200) / 20
      y = (180 - floor(point.y, 20)) / 20
      index = int(x + y * 20)
      return index
  
  # Return True if point is valid in tiles
  def valid(point):
      index = offset(point)
  
      if tiles[index] == 0:
          return False
  
      index = offset(point + 19)
  
      if tiles[index] == 0:
          return False
  
      return point.x % 20 == 0 or point.y % 20 == 0
  
  # Draw world using path
  def world():
      t.bgcolor('black')
      path.color('blue')
  
      for index in range(len(tiles)):
          tile = tiles[index]
  
          if tile > 0:
              x = (index % 20) * 20 - 200
              y = 180 - (index // 20) * 20
              square(x, y)
  
              if tile == 1:
                  path.up()
                  path.goto(x + 10, y + 10)
                  path.dot(2, 'white')
  
  # Move pacman and all ghosts
  def move():
      writer.undo()
      writer.write(state['score'])
  
      t.clear()
  
      if valid(pacman + aim):
          pacman.move(aim)
  
      index = offset(pacman)
  
      if tiles[index] == 1:
          tiles[index] = 2
          state['score'] += 1
          x = (index % 20) * 20 - 200
          y = 180 - (index // 20) * 20
          square(x, y)
  
      t.up()
      t.goto(pacman.x + 10, pacman.y + 10)
      t.dot(20, 'yellow')
  
      for point, course in ghosts:
          if valid(point + course):
              point.move(course)
          else:
              options = [
                  vector(5, 0),
                  vector(-5, 0),
                  vector(0, 5),
                  vector(0, -5),
              ]
              plan = choice(options)
              course.x = plan.x
              course.y = plan.y
  
          t.up()
          t.goto(point.x + 10, point.y + 10)
          t.dot(20, 'red')
  
      t.update()
  
      for point, course in ghosts:
          if abs(pacman - point) < 20:
              return
  
      t.ontimer(move, 100)
  
  # Change pacman aim if valid
  def change(x, y):
      if valid(pacman + vector(x, y)):
          aim.x = x
          aim.y = y
  
  
  t.setup(420, 420, 370, 0)
  t.hideturtle()
  t.tracer(False)
  writer.goto(160, 160)
  writer.color('white')
  writer.write(state['score'])
  t.listen()
  
  # Set Keyboard Controls
  t.onkey(lambda: change(5, 0), 'Right')
  t.onkey(lambda: change(-5, 0), 'Left')
  t.onkey(lambda: change(0, 5), 'Up')
  t.onkey(lambda: change(0, -5), 'Down')
  world()
  move()
  t.done()
  