🤖 Alpha-Beta pruning
This commit is contained in:
@ -7,10 +7,10 @@ from . import fourInARowDraw
|
|||||||
from funcs import logThis
|
from funcs import logThis
|
||||||
|
|
||||||
AIScores = {
|
AIScores = {
|
||||||
"middle": 1,
|
"middle": 3,
|
||||||
"two in a row": 5,
|
"two in a row": 10,
|
||||||
"three in a row": 50,
|
"three in a row": 50,
|
||||||
"enemy two in a row": -25,
|
"enemy two in a row": -35,
|
||||||
"enemy three in a row": -200,
|
"enemy three in a row": -200,
|
||||||
"enemy win": -10000,
|
"enemy win": -10000,
|
||||||
"win": 420,
|
"win": 420,
|
||||||
@ -222,7 +222,7 @@ def fourInARowAI(channel):
|
|||||||
testBoard = copy.deepcopy(board)
|
testBoard = copy.deepcopy(board)
|
||||||
testBoard = placeOnBoard(testBoard,player,column)
|
testBoard = placeOnBoard(testBoard,player,column)
|
||||||
if testBoard != None:
|
if testBoard != None:
|
||||||
scores[column] = minimax(testBoard,4,player%2+1,player,False)
|
scores[column] = minimax(testBoard,5,player%2+1,player,-math.inf,math.inf,False)
|
||||||
logThis("Best score for column "+str(column)+" is "+str(scores[column]))
|
logThis("Best score for column "+str(column)+" is "+str(scores[column]))
|
||||||
|
|
||||||
possibleScores = scores.copy()
|
possibleScores = scores.copy()
|
||||||
@ -295,7 +295,7 @@ def evaluateWindow(window,player,otherPlayer):
|
|||||||
else:
|
else:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
def minimax(board, depth, player , originalPlayer, maximizingPlayer):
|
def minimax(board, depth, player , originalPlayer, alpha, beta, maximizingPlayer):
|
||||||
terminal = ((isWon(board)[0] != 0) or (0 not in board[0]))
|
terminal = ((isWon(board)[0] != 0) or (0 not in board[0]))
|
||||||
if depth == 0 or terminal:
|
if depth == 0 or terminal:
|
||||||
points = AICalcPoints(board,originalPlayer)
|
points = AICalcPoints(board,originalPlayer)
|
||||||
@ -306,7 +306,11 @@ def minimax(board, depth, player , originalPlayer, maximizingPlayer):
|
|||||||
testBoard = copy.deepcopy(board)
|
testBoard = copy.deepcopy(board)
|
||||||
testBoard = placeOnBoard(testBoard,player,column)
|
testBoard = placeOnBoard(testBoard,player,column)
|
||||||
if testBoard != None:
|
if testBoard != None:
|
||||||
value = max(value,minimax(testBoard,depth-1,player%2+1,originalPlayer,False))
|
evaluation = minimax(testBoard,depth-1,player%2+1,originalPlayer,alpha,beta,False)
|
||||||
|
value = max(value,evaluation)
|
||||||
|
alpha = max(alpha,evaluation)
|
||||||
|
if beta <= alpha:
|
||||||
|
break
|
||||||
return value
|
return value
|
||||||
else:
|
else:
|
||||||
value = math.inf
|
value = math.inf
|
||||||
@ -314,6 +318,10 @@ def minimax(board, depth, player , originalPlayer, maximizingPlayer):
|
|||||||
testBoard = copy.deepcopy(board)
|
testBoard = copy.deepcopy(board)
|
||||||
testBoard = placeOnBoard(testBoard,player,column)
|
testBoard = placeOnBoard(testBoard,player,column)
|
||||||
if testBoard != None:
|
if testBoard != None:
|
||||||
value = min(value,minimax(testBoard,depth-1,player%2+1,originalPlayer,True))
|
evaluation = minimax(testBoard,depth-1,player%2+1,originalPlayer,alpha,beta,True)
|
||||||
|
value = min(value,evaluation)
|
||||||
|
beta = min(beta,evaluation)
|
||||||
|
if beta <= alpha:
|
||||||
|
break
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user