import streamlit as st
import streamlit.components.v1 as components
# Initialize session state if not already done
if 'board' not in st.session_state:
st.session_state.board = [
['♜', '♞', '♝', '♛', '♚', '♝', '♞', '♜'],
['♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'],
[None] * 8,
[None] * 8,
[None] * 8,
[None] * 8,
['♙', '♙', '♙', '♙', '♙', '♙', '♙', '♙'],
['♖', '♘', '♗', '♕', '♔', '♗', '♘', '♖']
]
if 'current_player' not in st.session_state:
st.session_state.current_player = 'white'
if 'selected_piece' not in st.session_state:
st.session_state.selected_piece = None
if 'move_made' not in st.session_state:
st.session_state.move_made = False
# Use the full width of the page
st.set_page_config(layout="wide")
# Create the HTML/JavaScript for the chess board
chess_board_html = f"""
Current Player: {'White' if st.session_state.current_player == 'white' else 'Black'}
"""
# Generate the squares with pieces
for row in range(8):
for col in range(8):
piece = st.session_state.board[row][col] or ''
is_selected = (st.session_state.selected_piece and
st.session_state.selected_piece['row'] == row and
st.session_state.selected_piece['col'] == col)
square_color = 'white' if (row + col) % 2 == 0 else 'black'
selected_class = ' selected' if is_selected else ''
chess_board_html += f"""
{piece}
"""
# Add JavaScript for handling moves with improved interaction
chess_board_html += """
"""
# Create a custom component that returns the clicked square
def chess_board_component():
component_value = components.html(
chess_board_html,
height=1200,
key="chess_board"
)
return component_value
# Handle the component interaction
clicked_square = chess_board_component()
if clicked_square:
try:
# Parse the clicked square data
data = json.loads(clicked_square)
row, col = data['row'], data['col']
# Handle the move logic
if st.session_state.selected_piece is None:
# Select a piece
if st.session_state.board[row][col] is not None:
st.session_state.selected_piece = {'row': row, 'col': col}
st.session_state.move_made = True
else:
# Move the selected piece
from_row = st.session_state.selected_piece['row']
from_col = st.session_state.selected_piece['col']
# Make the move
st.session_state.board[row][col] = st.session_state.board[from_row][from_col]
st.session_state.board[from_row][from_col] = None
st.session_state.selected_piece = None
st.session_state.current_player = 'black' if st.session_state.current_player == 'white' else 'white'
st.session_state.move_made = True
if st.session_state.move_made:
st.rerun()
except Exception as e:
st.error(f"Error processing move: {str(e)}")
# Add a reset button
if st.button('Reset Game', key='reset'):
st.session_state.board = [
['♜', '♞', '♝', '♛', '♚', '♝', '♞', '♜'],
['♟', '♟', '♟', '♟', '♟', '♟', '♟', '♟'],
[None] * 8,
[None] * 8,
[None] * 8,
[None] * 8,
['♙', '♙', '♙', '♙', '♙', '♙', '♙', '♙'],
['♖', '♘', '♗', '♕', '♔', '♗', '♘', '♖']
]
st.session_state.current_player = 'white'
st.session_state.selected_piece = None
st.session_state.move_made = False
st.rerun()