This game involves catching falling stars and avoiding bombs. Players control a basket that moves left and right using arrow keys. Here's a breakdown of the code:
We import the necessary modules: random for generating random values and pgzrun to run the Pygame Zero game:
import random import pgzrun
The screen size, basket, falling objects, score, and game state are initialized as follows:
WIDTH = 200 HEIGHT = 300 basket = Rect((WIDTH // 2 - 20, HEIGHT - 30), (40, 10)) objects = [] object_speed = 2 object_types = ["star", "bomb"] score = 0 game_running = True
The spawn_object() function generates a random object (either a star or a bomb) at a random position at the top of the screen:
def spawn_object():
x = random.randint(0, WIDTH - 10)
obj_type = random.choice(object_types)
objects.append({"rect": Rect((x, -10), (10, 10)), "type": obj_type})
The draw() function displays the basket, objects, score, and game-over message (if applicable):
def draw():
screen.clear()
screen.draw.filled_rect(basket, "blue")
for obj in objects:
if obj["type"] == "star":
screen.draw.filled_rect(obj["rect"], "yellow")
elif obj["type"] == "bomb":
screen.draw.filled_rect(obj["rect"], "red")
screen.draw.text(f"Score: {score}", (10, 10), color="white", fontsize=20)
if not game_running:
screen.draw.text("GAME OVER", center=(WIDTH // 2, HEIGHT // 2), color="white", fontsize=30)
The update() function is the heart of the game logic. It handles movement, collision detection, scoring, and gradually increases the game's difficulty:
If the game is over, no further updates are processed:
if not game_running:
return
The basket is moved left or right with the arrow keys, ensuring it stays within screen bounds:
if keyboard.left and basket.left > 0:
basket.x -= 4
if keyboard.right and basket.right < WIDTH:
basket.x += 4
keyboard.left: Detects if the left arrow key is pressed.basket.left > 0: Prevents the basket from moving off the left edge.basket.right < WIDTH: Prevents the basket from moving off the right edge.Each falling object moves down by a fixed speed:
for obj in objects[:]:
obj["rect"].y += object_speed
Objects are checked for collisions with the basket or the bottom of the screen:
if obj["rect"].colliderect(basket):
if obj["type"] == "star":
score += 1
elif obj["type"] == "bomb":
game_running = False
objects.remove(obj)
elif obj["rect"].top > HEIGHT:
objects.remove(obj)
obj["rect"].colliderect(basket): Detects if the object touches the basket.obj["type"] == "star": Increases the score if the object is a star.obj["type"] == "bomb": Ends the game if the object is a bomb.The speed of falling objects increases slightly every 10 points:
if score % 10 == 0 and score > 0:
global object_speed
object_speed += 0.01
The game ends when the player catches a bomb, and the game_running flag is set to False:
def game_over():
global game_running
game_running = False
Objects are spawned every second using a timer:
clock.schedule_interval(spawn_object, 1.0)
The game starts with the pgzrun.go() function:
pgzrun.go()