Skip to content

Commit

Permalink
Update tictactoe.py
Browse files Browse the repository at this point in the history
  • Loading branch information
JDeep1234 authored Feb 3, 2025
1 parent 5d286b7 commit 4ade11a
Showing 1 changed file with 28 additions and 53 deletions.
81 changes: 28 additions & 53 deletions tictactoe.py
Original file line number Diff line number Diff line change
@@ -1,62 +1,37 @@
class TicTacToe:
def __init__(self):
self.board = [[' ']*3 for _ in range(3)]
self.player = 'X'

def print_board(self):
print('\n'.join([' | '.join(row) for row in self.board]) + '\n')

def is_game_over(self):
for i in range(3):
if self.board[i][0] == self.board[i][1] == self.board[i][2] != ' ': return self.board[i][0]
if self.board[0][i] == self.board[1][i] == self.board[2][i] != ' ': return self.board[0][i]
if self.board[0][0] == self.board[1][1] == self.board[2][2] != ' ': return self.board[0][0]
if self.board[0][2] == self.board[1][1] == self.board[2][0] != ' ': return self.board[0][2]
return False

def is_draw(self):
return all(cell != ' ' for row in self.board for cell in row)

def dfs(self, board, player):
winner = self.is_game_over()
if winner: return {'score': 1 if winner == 'X' else -1}
if self.is_draw(): return {'score': 0}

best = {'score': -float('inf')} if player == 'X' else {'score': float('inf')}
def __init__(self): self.b, self.p = [[' ']*3 for _ in range(3)], 'X'
def p_b(self): print('\n'.join([' | '.join(r) for r in self.b])+'\n')
def g_o(self): return any([self.b[i][0]==self.b[i][1]==self.b[i][2]!=' ' for i in range(3)] + [self.b[0][i]==self.b[1][i]==self.b[2][i]!=' ' for i in range(3)] + [self.b[0][0]==self.b[1][1]==self.b[2][2]!=' ', self.b[0][2]==self.b[1][1]==self.b[2][0]!=' '])
def draw(self): return all(c!=' ' for r in self.b for c in r)
def dfs(self, p):
if (w:=self.g_o()): return {'s': 1 if self.p=='X' else -1}
if self.draw(): return {'s': 0}
b={'s':-float('inf')} if p=='X' else {'s':float('inf')}
for i in range(3):
for j in range(3):
if board[i][j] == ' ':
board[i][j] = player
score = self.dfs(board, 'O' if player == 'X' else 'X')
board[i][j] = ' '
score['row'], score['col'] = i, j
if (player == 'X' and score['score'] > best['score']) or (player == 'O' and score['score'] < best['score']):
best = score
return best

if self.b[i][j]==' ':
self.b[i][j]=p
s=self.dfs('O'if p=='X'else'X')
self.b[i][j]=' '
s['r'],s['c']=i,j
if (p=='X'and s['s']>b['s'])or(p=='O'and s['s']<b['s']):b=s
return b
def play(self):
while True:
self.print_board()
winner = self.is_game_over()
if winner or self.is_draw():
print(f"Player {winner} wins!" if winner else "It's a draw!")
break

if self.player == 'X':
print("AI is making a move...")
move = self.dfs(self.board, 'X')
self.board[move['row']][move['col']] = 'X'
while not (self.g_o() or self.draw()):
self.p_b()
if self.p=='X':
print("AI move...")
m=self.dfs('X')
self.b[m['r']][m['c']]='X'
else:
while True:
try:
row, col = map(int, input("Enter row and column (0-2): ").split())
if self.board[row][col] == ' ':
self.board[row][col] = 'O'
break
print("Invalid move. Try again.")
except (ValueError, IndexError):
print("Invalid input.")

self.player = 'O' if self.player == 'X' else 'X'
r,c=map(int,input("Enter row,col (0-2): ").split())
if self.b[r][c]==' ':self.b[r][c]='O';break
print("Invalid move.")
except: print("Invalid input.")
self.p='O'if self.p=='X'else'X'
self.p_b()
print(f"Player {self.g_o()} wins!" if self.g_o() else "It's a draw!")

TicTacToe().play()

0 comments on commit 4ade11a

Please sign in to comment.