Programming Assignment - 2 Submitted by – Utkarsh Singh Cse 1 210215 PROBLEM: Write a program to implement the following: MinMax (also known as MiniMax) algorithm for adversarialsearch (game playing). Part-1: You may take the example of a Tic-Tac-Toe game (or any othergame of your choice, choose a game with a relatively small state-space). Define the evaluation function (heuristic - problem specific). Perform the MinMax search to find out which path is the bestfor the player Max. Part-2: Reduce search space/time by applying anyone of the following:Pruning (with alpha/beta cutoff) or Early cut-off Display all the results in a suitable form. CODE: def print_board(board):d =2 print("\n") for row in board: print(" | ".join(row))if d > 0: print("-" * 9) d -= 1 print("\n") def is_winner(board, player): # Check rows, columns, and diagonals for a win for i in range(3): if all(board[i][j] == player for j in range(3)) or \ all(board[j][i] == player for j in range(3)): return True if all(board[i][i] == player for i in range(3)) or \ all(board[i][2 - i] == player for i in range(3)): return True return False def is_full(board): return all(board[i][j] != ' ' for i in range(3) for j in range(3)) def evaluate(board): if is_winner(board, 'X'): return 1 if is_winner(board, 'O'): return -1 return 0 def minimax(board, depth, is_maximizing, alpha, beta):if is_winner(board, 'X'): return 1 if is_winner(board, 'O'): return -1 if is_full(board): return 0 if is_maximizing: max_eval = -float("inf") for i in range(3): for j in range(3): if board[i][j] == ' ': board[i][j] = 'X' eval = minimax(board, depth + 1, False, alpha, beta) board[i][j] = ' ' max_eval = max(max_eval, eval)alpha = max(alpha, eval) if beta <= alpha: break return max_evalelse: min_eval = float("inf") for i in range(3): for j in range(3): if board[i][j] == ' ': board[i][j] = 'O' eval = minimax(board, depth + 1, True, alpha, beta) board[i][j] = ' ' min_eval = min(min_eval, eval) beta = min(beta, eval) if beta <= alpha: break return min_eval def find_best_move(board): best_eval = -float("inf") best_move = None alpha = -float("inf") beta = float("inf") for i in range(3): for j in range(3): if board[i][j] == ' ': board[i][j] = 'X' eval = minimax(board, 0, False, alpha, beta) board[i][j] = ' ' if eval > best_eval: best_eval = eval best_move = (i, j) alpha = max(alpha, eval) return best_move if name == " main ": board = [[' ' for _ in range(3)] for _ in range(3)] player_turn = True # True for player, False for computer while True: print("Current State: ") print_board(board) if not player_turn: print("Computer Chance: ") row, col = find_best_move(board) board[row][col] = 'X' else: print("Your Chance: ") row = int(input("Enter the row [0,1,2]: ")) col = int(input("Enter the column [0,1,2]: ")) if 0 <= row < 3 and 0 <= col < 3 and board[row][col] == ' ': board[row][col] = 'O' else: print("\nInvalid move. Try again.\n") continue if is_winner(board, 'O'): print("\nYou Win!!! :)") break elif is_winner(board, 'X'): print("\nComputer wins!") break elif is_full(board): print("\nIt's a tie!") break player_turn = not player_turn print_board(board) OUTPUT: