zarashahid commited on
Commit
1624dcb
ยท
verified ยท
1 Parent(s): 95e8177

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -21
app.py CHANGED
@@ -1,6 +1,7 @@
1
  import gradio as gr
2
  import numpy as np
3
 
 
4
  def check_winner(board):
5
  for i in range(3):
6
  if abs(sum(board[i, :])) == 3:
@@ -16,7 +17,7 @@ def check_winner(board):
16
  return None
17
 
18
  def ai_move(board):
19
- # Smart AI: Win if possible, block if needed
20
  for player in [-1, 1]:
21
  for i in range(3):
22
  for j in range(3):
@@ -33,32 +34,32 @@ def ai_move(board):
33
  open_cells = np.argwhere(board == 0)
34
  return tuple(open_cells[0])
35
 
36
- def play(user_row, user_col, board_flat):
37
  board = np.array(board_flat).reshape(3, 3)
38
- if board[user_row, user_col] != 0:
39
- return board.flatten().tolist(), "Cell already occupied! Try another."
40
 
41
- board[user_row, user_col] = 1
42
  winner = check_winner(board)
43
  if winner == 1:
44
- return board.flatten().tolist(), "โœ… You win!"
45
  elif winner == 0:
46
- return board.flatten().tolist(), "๐Ÿค It's a draw!"
47
 
48
  ai_r, ai_c = ai_move(board)
49
  board[ai_r, ai_c] = -1
50
  winner = check_winner(board)
51
  if winner == -1:
52
- return board.flatten().tolist(), "๐Ÿค– AI wins!"
53
  elif winner == 0:
54
- return board.flatten().tolist(), "๐Ÿค It's a draw!"
55
 
56
- return board.flatten().tolist(), "Your turn!"
57
 
58
  def new_game():
59
  return [0]*9, "๐ŸŽฎ New game started! You go first."
60
 
61
- def update_button_labels(board):
62
  labels = []
63
  for v in board:
64
  if v == 1:
@@ -66,9 +67,10 @@ def update_button_labels(board):
66
  elif v == -1:
67
  labels.append("โญ•")
68
  else:
69
- labels.append("")
70
  return labels
71
 
 
72
  with gr.Blocks() as demo:
73
  board_state = gr.State([0]*9)
74
 
@@ -79,22 +81,22 @@ with gr.Blocks() as demo:
79
  for r in range(3):
80
  with gr.Row():
81
  for c in range(3):
82
- btn = gr.Button("", elem_id=f"cell-{r}-{c}", size="lg")
83
  btns.append((btn, r, c))
84
 
85
  reset = gr.Button("๐Ÿ”„ Reset Game")
86
 
87
- def handle_click(r, c, board_flat):
88
- board, msg = play(r, c, board_flat)
89
- return board, msg, board
90
-
91
  for btn, r, c in btns:
 
 
 
 
92
  btn.click(
93
- handle_click,
94
- inputs=[gr.Number(r), gr.Number(c), board_state],
95
  outputs=[board_state, status, board_state],
96
  ).then(
97
- update_button_labels,
98
  inputs=board_state,
99
  outputs=[b for b, _, _ in btns]
100
  )
@@ -103,7 +105,7 @@ with gr.Blocks() as demo:
103
  new_game,
104
  outputs=[board_state, status]
105
  ).then(
106
- update_button_labels,
107
  inputs=board_state,
108
  outputs=[b for b, _, _ in btns]
109
  )
 
1
  import gradio as gr
2
  import numpy as np
3
 
4
+ # ๐Ÿง  Game logic
5
  def check_winner(board):
6
  for i in range(3):
7
  if abs(sum(board[i, :])) == 3:
 
17
  return None
18
 
19
  def ai_move(board):
20
+ # Smart AI: try to win or block
21
  for player in [-1, 1]:
22
  for i in range(3):
23
  for j in range(3):
 
34
  open_cells = np.argwhere(board == 0)
35
  return tuple(open_cells[0])
36
 
37
+ def play(board_flat, r, c):
38
  board = np.array(board_flat).reshape(3, 3)
39
+ if board[r, c] != 0:
40
+ return board_flat, "๐Ÿšซ Cell already taken! Try another.", board_flat
41
 
42
+ board[r, c] = 1
43
  winner = check_winner(board)
44
  if winner == 1:
45
+ return board.flatten().tolist(), "โœ… You win!", board.flatten().tolist()
46
  elif winner == 0:
47
+ return board.flatten().tolist(), "๐Ÿค It's a draw!", board.flatten().tolist()
48
 
49
  ai_r, ai_c = ai_move(board)
50
  board[ai_r, ai_c] = -1
51
  winner = check_winner(board)
52
  if winner == -1:
53
+ return board.flatten().tolist(), "๐Ÿค– AI wins!", board.flatten().tolist()
54
  elif winner == 0:
55
+ return board.flatten().tolist(), "๐Ÿค It's a draw!", board.flatten().tolist()
56
 
57
+ return board.flatten().tolist(), "Your turn!", board.flatten().tolist()
58
 
59
  def new_game():
60
  return [0]*9, "๐ŸŽฎ New game started! You go first."
61
 
62
+ def update_board_labels(board):
63
  labels = []
64
  for v in board:
65
  if v == 1:
 
67
  elif v == -1:
68
  labels.append("โญ•")
69
  else:
70
+ labels.append("โฌœ")
71
  return labels
72
 
73
+ # ๐ŸŽจ Gradio interface
74
  with gr.Blocks() as demo:
75
  board_state = gr.State([0]*9)
76
 
 
81
  for r in range(3):
82
  with gr.Row():
83
  for c in range(3):
84
+ btn = gr.Button("โฌœ", elem_id=f"cell-{r}-{c}", size="lg")
85
  btns.append((btn, r, c))
86
 
87
  reset = gr.Button("๐Ÿ”„ Reset Game")
88
 
 
 
 
 
89
  for btn, r, c in btns:
90
+ def on_click(board_flat, r=r, c=c):
91
+ board, msg, _ = play(board_flat, r, c)
92
+ return board, msg, board
93
+
94
  btn.click(
95
+ on_click,
96
+ inputs=[board_state],
97
  outputs=[board_state, status, board_state],
98
  ).then(
99
+ update_board_labels,
100
  inputs=board_state,
101
  outputs=[b for b, _, _ in btns]
102
  )
 
105
  new_game,
106
  outputs=[board_state, status]
107
  ).then(
108
+ update_board_labels,
109
  inputs=board_state,
110
  outputs=[b for b, _, _ in btns]
111
  )