File size: 1,809 Bytes
b35651f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0a63dc9
 
b35651f
 
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
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()