Spaces:
Sleeping
Sleeping
import streamlit as st | |
import os | |
import random | |
import time | |
from PIL import Image | |
import json | |
from datetime import datetime | |
from pathlib import Path | |
# Initialize session state variables | |
if 'game_state' not in st.session_state: | |
st.session_state.game_state = { | |
'players': {}, | |
'chat_messages': [], | |
'tile_map': [], | |
'current_player': None | |
} | |
if 'player_name' not in st.session_state: | |
st.session_state.player_name = None | |
# Utility functions | |
def load_tiles(tiles_path="tiles"): | |
"""Load tile images from the specified directory""" | |
tiles = {} | |
if not os.path.exists(tiles_path): | |
os.makedirs(tiles_path) | |
# Here you would need to add some default tiles | |
return tiles | |
for file in os.listdir(tiles_path): | |
if file.endswith(('.png', '.jpg', '.jpeg')): | |
tile_name = os.path.splitext(file)[0] | |
tile_path = os.path.join(tiles_path, file) | |
tiles[tile_name] = Image.open(tile_path) | |
return tiles | |
def generate_map(width=20, height=15): | |
"""Generate a random tile map""" | |
tile_types = ['grass', 'water', 'rock'] # Example tile types | |
return [[random.choice(tile_types) for _ in range(width)] for _ in range(height)] | |
def save_game_state(): | |
"""Save the current game state to a file""" | |
state_file = Path("game_state.json") | |
state_to_save = { | |
'players': st.session_state.game_state['players'], | |
'chat_messages': st.session_state.game_state['chat_messages'], | |
'tile_map': st.session_state.game_state['tile_map'] | |
} | |
with open(state_file, 'w') as f: | |
json.dump(state_to_save, f) | |
def load_game_state(): | |
"""Load the game state from file""" | |
state_file = Path("game_state.json") | |
if state_file.exists(): | |
with open(state_file, 'r') as f: | |
loaded_state = json.load(f) | |
st.session_state.game_state.update(loaded_state) | |
def add_chat_message(player_name, message): | |
"""Add a message to the chat history""" | |
timestamp = datetime.now().strftime("%H:%M:%S") | |
st.session_state.game_state['chat_messages'].append({ | |
'player': player_name, | |
'message': message, | |
'timestamp': timestamp | |
}) | |
save_game_state() | |
# Main game UI | |
def main(): | |
st.title("Multiplayer Tile Game") | |
# Player login/join game section | |
if st.session_state.player_name is None: | |
with st.form("join_game"): | |
player_name = st.text_input("Enter your name:") | |
submitted = st.form_submit_button("Join Game") | |
if submitted and player_name: | |
st.session_state.player_name = player_name | |
st.session_state.game_state['players'][player_name] = { | |
'position': {'x': 0, 'y': 0}, | |
'last_active': time.time() | |
} | |
st.experimental_rerun() | |
else: | |
# Game layout with columns | |
col1, col2 = st.columns([2, 1]) | |
with col1: | |
st.subheader("Game Map") | |
# Load or generate tile map | |
if not st.session_state.game_state['tile_map']: | |
st.session_state.game_state['tile_map'] = generate_map() | |
# Display tile map | |
tiles = load_tiles() | |
if tiles: | |
# Create a placeholder for the game map | |
map_placeholder = st.empty() | |
# Update player position with arrow keys | |
if st.session_state.player_name: | |
player = st.session_state.game_state['players'][st.session_state.player_name] | |
# Movement controls | |
cols = st.columns(4) | |
if cols[0].button("β"): | |
player['position']['x'] = max(0, player['position']['x'] - 1) | |
if cols[1].button("β"): | |
player['position']['y'] = max(0, player['position']['y'] - 1) | |
if cols[2].button("β"): | |
player['position']['y'] = min(14, player['position']['y'] + 1) | |
if cols[3].button("β"): | |
player['position']['x'] = min(19, player['position']['x'] + 1) | |
# Display current position | |
st.write(f"Position: ({player['position']['x']}, {player['position']['y']})") | |
else: | |
st.warning("No tile images found. Please add images to the 'tiles' directory.") | |
with col2: | |
st.subheader("Chat Room") | |
# Chat message display | |
chat_container = st.container() | |
with chat_container: | |
for message in st.session_state.game_state['chat_messages'][-50:]: # Show last 50 messages | |
st.text(f"[{message['timestamp']}] {message['player']}: {message['message']}") | |
# Chat input | |
with st.form("chat_form", clear_on_submit=True): | |
message = st.text_input("Message:") | |
if st.form_submit_button("Send") and message: | |
add_chat_message(st.session_state.player_name, message) | |
st.experimental_rerun() | |
# Logout button | |
if st.button("Leave Game"): | |
if st.session_state.player_name in st.session_state.game_state['players']: | |
del st.session_state.game_state['players'][st.session_state.player_name] | |
st.session_state.player_name = None | |
save_game_state() | |
st.experimental_rerun() | |
if __name__ == "__main__": | |
load_game_state() | |
main() |