Menu
CoddyTech

Win or Lose

Lesson 15 of 40 in Coddy's Make Games with Pygame course.

A game ends. Here you lose when the lives reach 0 and win when the score reaches 10. While neither has happened, the game is on.

Put everything that moves under one condition, so it stops when the game ends:

if lives > 0 and score < 10:
    # keys, the basket, the block, catches and misses

Drawing stays outside that if: the screen still shows the last frame, and on top of it the result.

if lives == 0:
    message = font.render("Game over", True, (240, 240, 240))
    screen.blit(message, message.get_rect(center=(240, 160)))

message.get_rect(center=(240, 160)) is the Rect of the text picture placed with its middle at (240, 160). Blitting at a Rect uses its top left corner, so the text is centred.

challenge icon

Challenge

Medium
  1. Indent everything that moves (the keys, the basket, the block, catches and misses) under if lives > 0 and score < 10:.
  2. After drawing the score and lives, show Game over when lives == 0, or You win! when score == 10, centred at (240, 160).

Try it yourself

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Catch the Blocks")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

basket = pygame.Rect(200, 330, 80, 16)
block = pygame.Rect(220, 0, 20, 20)
score = 0
lives = 3

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        basket.x -= 8
    if keys[pygame.K_RIGHT]:
        basket.x += 8
    basket.clamp_ip(screen.get_rect())

    block.y += 3
    if block.top > 360:
        block.y = -20
        block.x = random.randint(0, 460)
        lives -= 1
    if block.colliderect(basket):
        block.y = -20
        block.x = random.randint(0, 460)
        score += 1

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), basket)
    pygame.draw.rect(screen, (235, 80, 80), block)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    lives_text = font.render(f"Lives: {lives}", True, (240, 240, 240))
    screen.blit(lives_text, (370, 10))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTest yourself

This lesson includes a short quiz. Start the lesson to answer it and track your progress.

All lessons in Make Games with Pygame

Practice on your own: Pygame playground