File size: 2,814 Bytes
a85401c
af09c74
 
a85401c
af09c74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import streamlit as st
import chess
import chess.svg

st.set_page_config(page_title="Chess Game", layout="wide")

# ================= CSS (compact layout) =================
st.markdown("""
<style>
.block-container {
    padding-top: 1rem;
    padding-bottom: 1rem;
}

/* Reduce spacing between columns */
div[data-testid="column"] {
    padding: 0 !important;
}

div[data-testid="stHorizontalBlock"] {
    gap: 5px !important;
}
</style>
""", unsafe_allow_html=True)

st.title("โ™Ÿ๏ธ Chess Game")

# ================= INIT =================
if "board" not in st.session_state:
    st.session_state.board = chess.Board()
    st.session_state.selected = None
    st.session_state.message = ""

board = st.session_state.board

# ================= HANDLE CLICK =================
def select_square(square):
    if st.session_state.selected is None:
        piece = board.piece_at(square)
        if piece and piece.color == board.turn:
            st.session_state.selected = square
    else:
        move = chess.Move(st.session_state.selected, square)

        if move in board.legal_moves:
            board.push(move)
            st.session_state.message = "โœ… Move played"
        else:
            st.session_state.message = "โŒ Illegal move"

        st.session_state.selected = None

# ================= LAYOUT =================
col_board, col_controls = st.columns([2.3, 1])

# ================= BOARD =================
with col_board:
    st.subheader(f"Turn: {'White' if board.turn else 'Black'}")

    selected_square = st.session_state.selected

    svg_board = chess.svg.board(
        board=board,
        size=720,  # ๐Ÿ”ฅ big board for better UX
        lastmove=board.peek() if board.move_stack else None,
        squares=[selected_square] if selected_square else []
    )

    st.image(svg_board)

# ================= CONTROLS =================
with col_controls:
    st.subheader("๐ŸŽฎ Controls")

    for row in range(7, -1, -1):
        cols = st.columns(8)
        for col in range(8):
            square = chess.square(col, row)
            name = chess.square_name(square)

            if cols[col].button(name, key=name):
                select_square(square)

    if st.session_state.message:
        st.success(st.session_state.message)
        st.session_state.message = ""

    st.markdown("---")

    if st.button("โ†ฉ๏ธ Undo"):
        if board.move_stack:
            board.pop()

    if st.button("๐Ÿ”„ Reset"):
        st.session_state.board = chess.Board()
        st.session_state.selected = None

# ================= STATUS =================
st.subheader("Game Status")

if board.is_checkmate():
    st.error("โ™Ÿ๏ธ Checkmate!")
elif board.is_stalemate():
    st.warning("Stalemate!")
elif board.is_check():
    st.warning("Check!")
else:
    st.success("Game in progress...")