Menu
CoddyTech

Win or Lose

Part of the The Game Loop section of Coddy's Pygame journey. Lesson 29 of 32.

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()

All lessons in The Game Loop

Practice on your own: Pygame playground