Game Over

Right now, the game does nothing even if our ninja crashes into the cactus. Let's add in a game over condition. If the ninja touches any of the obstacles, we'll end the game.

First, we'll add in a variable called game_over and set it to False at the start.

game_over = False

Inside the update() function, we'll detect if our runner collided with any of the obstacles. If she did, we'll set game_over to True.

if runner.collidelist(obstacles) != -1:
  game_over = True

** Important: Remember to declare game_over as a global in the update() function.**

The runner.collidelist(obstacles) checks if the runner collided with any of the actors in the obstacles list. If she didn't, the collidelist function will give us the value -1.

Next, we'll need to draw the game over text inside draw() by changing this...

  runner.draw()
  for actor in obstacles:
    actor.draw()
  screen.draw.text('Score: ' + str(score), (15,10), color=(0,0,0), fontsize=30)

...into this...

if game_over:
  screen.draw.text('Game Over', centerx=400, centery=270, color=(255,255,255), fontsize=60)
  screen.draw.text('Score: ' + str(score), centerx=400, centery=330, color=(255,255,255), fontsize=60)
else:
  runner.draw()
  for actor in obstacles:
    actor.draw()
  screen.draw.text('Score: ' + str(score), (15,10), color=(0,0,0), fontsize=30)

Your final game should look like this...

import pgzrun
from pgzhelper import *

WIDTH=800
HEIGHT=600

runner = Actor('run__000')
run_images = ['run__000', 'run__001', 'run__002', 'run__003', 'run__004', 'run__005', 'run__006', 'run__007', 'run__008', 'run__009']
runner.images = run_images
runner.x = 100
runner.y = 400

velocity_y = 0
gravity = 1

obstacles = []
obstacles_timeout = 0

score = 0
game_over = False

def update():
  global velocity_y, obstacles_timeout, score, game_over
  runner.next_image()

  obstacles_timeout += 1
  if obstacles_timeout > 50:
    actor = Actor('cactus')
    actor.x = 850
    actor.y = 430
    obstacles.append(actor)
    obstacles_timeout = 0

  for actor in obstacles:
    actor.x -= 8
    if actor.x < -50:
      obstacles.remove(actor)
      score += 1

  if keyboard.up:
    velocity_y = -15

  runner.y += velocity_y
  velocity_y += gravity
  if runner.y > 400:
    velocity_y = 0
    runner.y = 400

  if runner.collidelist(obstacles) != -1:
    game_over = True

def draw():
  screen.draw.filled_rect(Rect(0,0,800,400), (163, 232, 254))
  screen.draw.filled_rect(Rect(0,400,800,200), (88, 242, 152))
  if game_over:
    screen.draw.text('Game Over', centerx=400, centery=270, color=(255,255,255), fontsize=60)
    screen.draw.text('Score: ' + str(score), centerx=400, centery=330, color=(255,255,255), fontsize=60)
  else:
    runner.draw()
    for actor in obstacles:
      actor.draw()
    screen.draw.text('Score: ' + str(score), (15,10), color=(0,0,0), fontsize=30)

pgzrun.go() # Must be last line