import gradio as gr import numpy as np ENFORCE_RULES = False MAX_EVENTS = 10 board_state = np.full((3, 3), "") turn_state = ["X", 0] event_log = [] def place(evt: gr.SelectData, gr_request: gr.Request): if evt.value: return board_state, "\n".join(event_log) client_id = hash(gr_request.client.host[0]) if ENFORCE_RULES and client_id == turn_state[1]: return board_state, update_events("may not move twice in a row") turn_state[1] = client_id row, column = evt.index board_state[row, column] = turn_state[0] if (board_state[row,:] == turn_state[0]).all() or (board_state[:,column] == turn_state[0]).all(): return board_state, update_events("has won!!!!") turn_state[0] = "O" if turn_state[0] == "X" else "X" return board_state, update_events("made the last move") def reset(gr_request: gr.Request): board_state.fill("") turn_state[0] = "X" turn_state[1] = hash(gr_request.client.host[0]) return board_state, update_events("has reset the board state") def update_events(message=None): if message: event_log.append(f"player {turn_state[1] % 10000} {message}, {turn_state[0]} moves next") if len(event_log) > MAX_EVENTS: event_log.pop(0) return "\n".join(event_log) def refresh_display(): return board_state, "\n".join(event_log) with gr.Blocks(analytics_enabled=False) as demo: events = gr.Textbox(interactive=False, label="Turn") board = gr.Dataframe(interactive=False, type="array") board.select(place, [], [board, events]) reset_button = gr.Button(value="Reset Board") reset_button.click(reset, [], [board, events]) demo.load(refresh_display, [], [board, events], every=10, show_progress=False) demo.queue() demo.launch()