Skip to content

Commit 0a0675c

Browse files
Merge pull request #2020 from HVbajoria/master
Created a Tic Tac Toe game which uses Min-Max Algorithm for AI move
2 parents 183ddae + 2dd08f3 commit 0a0675c

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

Diff for: AI Game/Tic-Tac-Toe-AI/tictactoe.py

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import tkinter as tk
2+
from tkinter import messagebox
3+
import random
4+
5+
def check_winner(board, player):
6+
# Check rows, columns, and diagonals for a win
7+
for i in range(3):
8+
if all(board[i][j] == player for j in range(3)) or all(board[j][i] == player for j in range(3)):
9+
return True
10+
if all(board[i][i] == player for i in range(3)) or all(board[i][2 - i] == player for i in range(3)):
11+
return True
12+
return False
13+
14+
def is_board_full(board):
15+
return all(all(cell != ' ' for cell in row) for row in board)
16+
17+
def minimax(board, depth, is_maximizing):
18+
if check_winner(board, 'X'):
19+
return -1
20+
if check_winner(board, 'O'):
21+
return 1
22+
if is_board_full(board):
23+
return 0
24+
25+
if is_maximizing:
26+
max_eval = float('-inf')
27+
for i in range(3):
28+
for j in range(3):
29+
if board[i][j] == ' ':
30+
board[i][j] = 'O'
31+
eval = minimax(board, depth + 1, False)
32+
board[i][j] = ' '
33+
max_eval = max(max_eval, eval)
34+
return max_eval
35+
else:
36+
min_eval = float('inf')
37+
for i in range(3):
38+
for j in range(3):
39+
if board[i][j] == ' ':
40+
board[i][j] = 'X'
41+
eval = minimax(board, depth + 1, True)
42+
board[i][j] = ' '
43+
min_eval = min(min_eval, eval)
44+
return min_eval
45+
46+
def best_move(board):
47+
best_val = float('-inf')
48+
best_move = None
49+
50+
for i in range(3):
51+
for j in range(3):
52+
if board[i][j] == ' ':
53+
board[i][j] = 'O'
54+
move_val = minimax(board, 0, False)
55+
board[i][j] = ' '
56+
if move_val > best_val:
57+
best_val = move_val
58+
best_move = (i, j)
59+
60+
return best_move
61+
62+
def make_move(row, col):
63+
if board[row][col] == ' ':
64+
board[row][col] = 'X'
65+
buttons[row][col].config(text='X')
66+
if check_winner(board, 'X'):
67+
messagebox.showinfo("Tic-Tac-Toe", "You win!")
68+
root.quit()
69+
elif is_board_full(board):
70+
messagebox.showinfo("Tic-Tac-Toe", "It's a draw!")
71+
root.quit()
72+
else:
73+
ai_move()
74+
else:
75+
messagebox.showerror("Error", "Invalid move")
76+
77+
def ai_move():
78+
row, col = best_move(board)
79+
board[row][col] = 'O'
80+
buttons[row][col].config(text='O')
81+
if check_winner(board, 'O'):
82+
messagebox.showinfo("Tic-Tac-Toe", "AI wins!")
83+
root.quit()
84+
elif is_board_full(board):
85+
messagebox.showinfo("Tic-Tac-Toe", "It's a draw!")
86+
root.quit()
87+
88+
root = tk.Tk()
89+
root.title("Tic-Tac-Toe")
90+
91+
board = [[' ' for _ in range(3)] for _ in range(3]
92+
buttons = []
93+
94+
for i in range(3):
95+
row_buttons = []
96+
for j in range(3):
97+
button = tk.Button(root, text=' ', font=('normal', 30), width=5, height=2, command=lambda row=i, col=j: make_move(row, col))
98+
button.grid(row=i, column=j)
99+
row_buttons.append(button)
100+
buttons.append(row_buttons)
101+
102+
root.mainloop()

0 commit comments

Comments
 (0)