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()