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