Uploaded by Dhruv Sahgal

AI Programing Assignment 2

advertisement
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:
Download