Renecto commited on
Commit
34d6098
·
verified ·
1 Parent(s): 6ad4064

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +15 -21
app.py CHANGED
@@ -1,19 +1,16 @@
1
  import gradio as gr
2
  from PIL import Image, ImageDraw
3
 
4
- # Othello (Reversi) logic implementation
5
  def initialize_board():
6
  board = [[0 for _ in range(8)] for _ in range(8)]
7
- board[3][3], board[4][4] = 1, 1 # White
8
- board[3][4], board[4][3] = -1, -1 # Black
9
  return board
10
 
11
- # Directions for flipping
12
  DIRECTIONS = [(-1, -1), (-1, 0), (-1, 1),
13
  (0, -1), (0, 1),
14
  (1, -1), (1, 0), (1, 1)]
15
 
16
- # Check if a move is valid and collect flips
17
  def get_flips(board, row, col, player):
18
  if board[row][col] != 0:
19
  return []
@@ -23,12 +20,12 @@ def get_flips(board, row, col, player):
23
  buffer = []
24
  while 0 <= r < 8 and 0 <= c < 8 and board[r][c] == -player:
25
  buffer.append((r, c))
26
- r += dr; c += dc
 
27
  if buffer and 0 <= r < 8 and 0 <= c < 8 and board[r][c] == player:
28
  flips.extend(buffer)
29
  return flips
30
 
31
- # Apply move if valid
32
  def apply_move(board, row, col, player):
33
  flips = get_flips(board, row, col, player)
34
  if not flips:
@@ -38,7 +35,6 @@ def apply_move(board, row, col, player):
38
  board[r][c] = player
39
  return True
40
 
41
- # Generate PIL image representation
42
  def board_to_image(board, img_size=320):
43
  cell_size = img_size // 8
44
  img = Image.new('RGB', (img_size, img_size), 'green')
@@ -54,39 +50,37 @@ def board_to_image(board, img_size=320):
54
  draw.ellipse([x0+4, y0+4, x1-4, y1-4], fill='black')
55
  return img
56
 
57
- # Count score
58
  def count_score(board):
59
  black = sum(cell == -1 for row in board for cell in row)
60
  white = sum(cell == 1 for row in board for cell in row)
61
  return black, white
62
 
63
- # Gradio interaction with clickable board
64
- def play_move(evt, state):
65
  board, player = state
66
  img_size = 320
67
  cell_size = img_size / 8
68
- x, y = evt['x'], evt['y']
69
  col, row = int(x // cell_size), int(y // cell_size)
 
 
70
  if not apply_move(board, row, col, player):
71
  return board_to_image(board), f"Invalid move at ({row+1},{col+1})", state
72
- # Switch player
73
  player = -player
74
  black_score, white_score = count_score(board)
75
  status = f"Black: {black_score} | White: {white_score} | {'Black' if player == -1 else 'White'} to move"
76
  return board_to_image(board), status, (board, player)
77
 
78
- # Initialize Gradio app
79
  def main():
80
  with gr.Blocks() as demo:
81
  gr.HTML("<h2>Othello (Reversi) Game</h2>")
82
- state = gr.State((initialize_board(), -1)) # -1: Black starts
83
- board_img = gr.Image(value=board_to_image(initialize_board()), interactive=True, tool="click", label="Click to place a stone")
84
  status = gr.Text(value="Black: 2 | White: 2 | Black to move", interactive=False)
85
- # Bind click event
86
- board_img.select(fn=play_move,
87
- inputs=[state],
88
- outputs=[board_img, status, state])
 
89
  demo.launch()
90
 
91
  if __name__ == "__main__":
92
- main()
 
1
  import gradio as gr
2
  from PIL import Image, ImageDraw
3
 
 
4
  def initialize_board():
5
  board = [[0 for _ in range(8)] for _ in range(8)]
6
+ board[3][3], board[4][4] = 1, 1
7
+ board[3][4], board[4][3] = -1, -1
8
  return board
9
 
 
10
  DIRECTIONS = [(-1, -1), (-1, 0), (-1, 1),
11
  (0, -1), (0, 1),
12
  (1, -1), (1, 0), (1, 1)]
13
 
 
14
  def get_flips(board, row, col, player):
15
  if board[row][col] != 0:
16
  return []
 
20
  buffer = []
21
  while 0 <= r < 8 and 0 <= c < 8 and board[r][c] == -player:
22
  buffer.append((r, c))
23
+ r += dr
24
+ c += dc
25
  if buffer and 0 <= r < 8 and 0 <= c < 8 and board[r][c] == player:
26
  flips.extend(buffer)
27
  return flips
28
 
 
29
  def apply_move(board, row, col, player):
30
  flips = get_flips(board, row, col, player)
31
  if not flips:
 
35
  board[r][c] = player
36
  return True
37
 
 
38
  def board_to_image(board, img_size=320):
39
  cell_size = img_size // 8
40
  img = Image.new('RGB', (img_size, img_size), 'green')
 
50
  draw.ellipse([x0+4, y0+4, x1-4, y1-4], fill='black')
51
  return img
52
 
 
53
  def count_score(board):
54
  black = sum(cell == -1 for row in board for cell in row)
55
  white = sum(cell == 1 for row in board for cell in row)
56
  return black, white
57
 
58
+ def play_move(x, y, state):
 
59
  board, player = state
60
  img_size = 320
61
  cell_size = img_size / 8
 
62
  col, row = int(x // cell_size), int(y // cell_size)
63
+ if not (0 <= row < 8 and 0 <= col < 8):
64
+ return board_to_image(board), f"Click inside the board.", state
65
  if not apply_move(board, row, col, player):
66
  return board_to_image(board), f"Invalid move at ({row+1},{col+1})", state
 
67
  player = -player
68
  black_score, white_score = count_score(board)
69
  status = f"Black: {black_score} | White: {white_score} | {'Black' if player == -1 else 'White'} to move"
70
  return board_to_image(board), status, (board, player)
71
 
 
72
  def main():
73
  with gr.Blocks() as demo:
74
  gr.HTML("<h2>Othello (Reversi) Game</h2>")
75
+ state = gr.State((initialize_board(), -1))
76
+ image_box = gr.Image(value=board_to_image(initialize_board()), interactive=True, label="Click to place a stone")
77
  status = gr.Text(value="Black: 2 | White: 2 | Black to move", interactive=False)
78
+
79
+ def click_handler(evt: gr.SelectData, state):
80
+ return play_move(evt.index[0], evt.index[1], state)
81
+
82
+ image_box.select(click_handler, inputs=[state], outputs=[image_box, status, state])
83
  demo.launch()
84
 
85
  if __name__ == "__main__":
86
+ main()