In this game, you avoid obstacles and try to get an incredibly high score. Use arrow keys to move,.

Demonstration: Obstacle rush

To play the game, copy the code below into your python file and run the game.

Copy the code for FREE!:

import pygame
import sys
import random
import time

# Initialize Pygame
pygame.init()

# Set up the game window
width, height = 800, 600
win = pygame.display.set_mode((width, height))
pygame.display.set_caption("Obstacle Rush")

# Define colors
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)

# Define the player
player_size = 50
player_x = width // 2 - player_size // 2
player_y = height - 2 * player_size
player_speed = 5

# Define obstacles
obstacle_size = 50
obstacle_speed = 5
obstacle_frequency = 25
obstacles = []

# Scoring
score = 0
score_font = pygame.font.Font(None, 36)

# Clocks for controlling frame rate and scoring
clock = pygame.time.Clock()
score_clock = pygame.time.Clock()
score_timer = 0


def display_score():
    score_text = score_font.render(f"Score: {score}", True, black)
    win.blit(score_text, (10, 10))


def display_game_over():
    game_over_font = pygame.font.Font(None, 72)
    game_over_text = game_over_font.render("You died!", True, black)
    score_text = score_font.render(f"Score: {score}", True, black)

    win.blit(game_over_text, (width // 2 - game_over_text.get_width() // 2, height // 2 - 50))
    win.blit(score_text, (width // 2 - score_text.get_width() // 2, height // 2 + 50))

    # Draw Play Again button
    play_again_rect = pygame.Rect(width // 2 - 100, height // 2 + 150, 200, 50)
    pygame.draw.rect(win, red, play_again_rect)

    play_again_font = pygame.font.Font(None, 36)
    play_again_text = play_again_font.render("Play Again?", True, white)
    win.blit(play_again_text, (width // 2 - play_again_text.get_width() // 2, height // 2 + 165))

    pygame.display.update()

    # Wait for a key press before restarting the game
    wait_for_play_again()


def wait_for_play_again():
    waiting = True
    while waiting:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                x, y = event.pos
                play_again_rect = pygame.Rect(width // 2 - 100, height // 2 + 150, 200, 50)
                if play_again_rect.collidepoint(x, y):
                    restart_game()
                    waiting = False


def restart_game():
    global player_x, player_y, obstacles, score
    player_x = width // 2 - player_size // 2
    player_y = height - 2 * player_size
    obstacles = []
    score = 0


# Main game loop
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    keys = pygame.key.get_pressed()
    player_x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * player_speed

    # Update obstacles
    if random.randrange(obstacle_frequency) == 0:
        obstacle_x = random.randint(0, width - obstacle_size)
        obstacle_y = -obstacle_size
        obstacles.append([obstacle_x, obstacle_y])

    for obstacle in obstacles:
        obstacle[1] += obstacle_speed
        if obstacle[1] > height:
            obstacles.remove(obstacle)
            score += 1  # Increase score when an obstacle is avoided

    # Check for collisions with obstacles
    for obstacle in obstacles:
        if (
                player_x < obstacle[0] + obstacle_size
                and player_x + player_size > obstacle[0]
                and player_y < obstacle[1] + obstacle_size
                and player_y + player_size > obstacle[1]
        ):
            display_game_over()

    # Draw everything
    win.fill(white)
    pygame.draw.rect(win, black, (player_x, player_y, player_size, player_size))

    for obstacle in obstacles:
        pygame.draw.rect(win, black, (obstacle[0], obstacle[1], obstacle_size, obstacle_size))

    display_score()  # Display the current score

    pygame.display.update()
    clock.tick(30)  # Set the frame rate

    # Scoring: Increase score every 2 seconds
    elapsed_time = score_clock.tick(1000)  # Clock in milliseconds
    score_timer += elapsed_time
    if score_timer >= 2000:  # 2000 milliseconds = 2 seconds
        score += 1
        score_timer = 0

    # Check for collisions again after drawing to avoid immediate game over screen
    for obstacle in obstacles:
        if (
                player_x < obstacle[0] + obstacle_size
                and player_x + player_size > obstacle[0]
                and player_y < obstacle[1] + obstacle_size
                and player_y + player_size > obstacle[1]
        ):
            display_game_over()

    pygame.display.update()