Spaces:
Sleeping
Sleeping
import streamlit as st | |
from PIL import Image, ImageDraw | |
# Streamlit setup | |
st.set_page_config(page_title="Breakout Game", layout="centered") | |
st.title("🎮 Breakout Game - Hugging Face Version") | |
st.write("Control the paddle with your mouse or left/right arrow keys.") | |
# Initialize game parameters | |
WIDTH, HEIGHT = 800, 600 | |
PADDLE_WIDTH, PADDLE_HEIGHT = 100, 15 | |
BALL_RADIUS = 10 | |
BRICK_ROWS, BRICK_COLS = 5, 8 | |
BRICK_WIDTH = WIDTH // BRICK_COLS | |
BRICK_HEIGHT = 30 | |
# Session state for game variables | |
if "paddle_x" not in st.session_state: | |
st.session_state.paddle_x = WIDTH // 2 - PADDLE_WIDTH // 2 | |
if "ball_pos" not in st.session_state: | |
st.session_state.ball_pos = [WIDTH // 2, HEIGHT // 2] | |
if "ball_speed" not in st.session_state: | |
st.session_state.ball_speed = [4, -4] | |
if "bricks" not in st.session_state: | |
st.session_state.bricks = [ | |
[col * BRICK_WIDTH, row * BRICK_HEIGHT] | |
for row in range(BRICK_ROWS) | |
for col in range(BRICK_COLS) | |
] | |
if "score" not in st.session_state: | |
st.session_state.score = 0 | |
if "lives" not in st.session_state: | |
st.session_state.lives = 3 | |
if "paddle_speed" not in st.session_state: | |
st.session_state.paddle_speed = 0 | |
# Draw the game screen | |
def draw_game(): | |
# Create a blank canvas | |
img = Image.new("RGB", (WIDTH, HEIGHT), "black") | |
draw = ImageDraw.Draw(img) | |
# Draw paddle | |
paddle_y = HEIGHT - 40 | |
draw.rectangle( | |
[ | |
(st.session_state.paddle_x, paddle_y), | |
(st.session_state.paddle_x + PADDLE_WIDTH, paddle_y + PADDLE_HEIGHT), | |
], | |
fill="white", | |
) | |
# Draw ball | |
ball_x, ball_y = st.session_state.ball_pos | |
draw.ellipse( | |
[ | |
(ball_x - BALL_RADIUS, ball_y - BALL_RADIUS), | |
(ball_x + BALL_RADIUS, ball_y + BALL_RADIUS), | |
], | |
fill="red", | |
) | |
# Draw bricks | |
for brick in st.session_state.bricks: | |
brick_x, brick_y = brick | |
draw.rectangle( | |
[(brick_x, brick_y), (brick_x + BRICK_WIDTH - 2, brick_y + BRICK_HEIGHT - 2)], | |
fill="blue", | |
) | |
return img | |
# Update game state | |
def update_game(): | |
# Move paddle continuously | |
st.session_state.paddle_x += st.session_state.paddle_speed | |
if st.session_state.paddle_x < 0: | |
st.session_state.paddle_x = 0 | |
if st.session_state.paddle_x > WIDTH - PADDLE_WIDTH: | |
st.session_state.paddle_x = WIDTH - PADDLE_WIDTH | |
# Move ball | |
ball_x, ball_y = st.session_state.ball_pos | |
speed_x, speed_y = st.session_state.ball_speed | |
ball_x += speed_x | |
ball_y += speed_y | |
# Ball collision with walls | |
if ball_x - BALL_RADIUS <= 0 or ball_x + BALL_RADIUS >= WIDTH: | |
speed_x = -speed_x | |
if ball_y - BALL_RADIUS <= 0: | |
speed_y = -speed_y | |
# Ball collision with paddle | |
paddle_y = HEIGHT - 40 | |
if ( | |
paddle_y <= ball_y + BALL_RADIUS <= paddle_y + PADDLE_HEIGHT | |
and st.session_state.paddle_x | |
<= ball_x | |
<= st.session_state.paddle_x + PADDLE_WIDTH | |
): | |
speed_y = -speed_y | |
# Ball collision with bricks | |
new_bricks = [] | |
for brick in st.session_state.bricks: | |
brick_x, brick_y = brick | |
if not ( | |
brick_x <= ball_x <= brick_x + BRICK_WIDTH | |
and brick_y <= ball_y <= brick_y + BRICK_HEIGHT | |
): | |
new_bricks.append(brick) | |
else: | |
speed_y = -speed_y | |
st.session_state.score += 10 | |
st.session_state.bricks = new_bricks | |
# Ball out of bounds | |
if ball_y + BALL_RADIUS >= HEIGHT: | |
st.session_state.lives -= 1 | |
ball_x, ball_y = WIDTH // 2, HEIGHT // 2 | |
speed_x, speed_y = 4, -4 | |
# Update ball position and speed | |
st.session_state.ball_pos = [ball_x, ball_y] | |
st.session_state.ball_speed = [speed_x, speed_y] | |
# Display the game | |
st.image(draw_game(), use_column_width=True) | |
# Display score and lives | |
st.write(f"**Score**: {st.session_state.score}") | |
st.write(f"**Lives**: {st.session_state.lives}") | |
# Game over | |
if st.session_state.lives <= 0: | |
st.write("**Game Over! Refresh the page to restart.**") | |
else: | |
# Handle user input | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
if st.button("⬅️ Move Left"): | |
st.session_state.paddle_speed = -10 | |
with col2: | |
if st.button("🔄 Stop Paddle"): | |
st.session_state.paddle_speed = 0 | |
with col3: | |
if st.button("➡️ Move Right"): | |
st.session_state.paddle_speed = 10 | |
# Auto-update game state | |
update_game() | |
st.experimental_rerun() | |