🤖 Connect 4 AI prolongs losing
This commit is contained in:
@ -13,7 +13,8 @@ AIScores = {
|
|||||||
"enemy two in a row": -35,
|
"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": 1000,
|
||||||
|
"avoid losing": 100
|
||||||
}
|
}
|
||||||
|
|
||||||
rowCount = 6
|
rowCount = 6
|
||||||
@ -156,54 +157,54 @@ def isWon(board):
|
|||||||
winDirection = ""
|
winDirection = ""
|
||||||
winCoordinates = [0,0]
|
winCoordinates = [0,0]
|
||||||
|
|
||||||
for line in range(len(board)):
|
for row in range(len(board)):
|
||||||
for place in range(len(board[line])):
|
for place in range(len(board[row])):
|
||||||
if won == 0:
|
if won == 0:
|
||||||
piecePlayer = board[line][place]
|
piecePlayer = board[row][place]
|
||||||
if piecePlayer != 0:
|
if piecePlayer != 0:
|
||||||
# Checks horizontal
|
# Checks horizontal
|
||||||
if place <= columnCount-4:
|
if place <= columnCount-4:
|
||||||
pieces = [board[line][place+1],board[line][place+2],board[line][place+3]]
|
pieces = [board[row][place+1],board[row][place+2],board[row][place+3]]
|
||||||
else:
|
else:
|
||||||
pieces = [0]
|
pieces = [0]
|
||||||
|
|
||||||
if all(x == piecePlayer for x in pieces):
|
if all(x == piecePlayer for x in pieces):
|
||||||
won = piecePlayer
|
won = piecePlayer
|
||||||
winDirection = "h"
|
winDirection = "h"
|
||||||
winCoordinates = [line,place]
|
winCoordinates = [row,place]
|
||||||
|
|
||||||
# Checks vertical
|
# Checks vertical
|
||||||
if line <= rowCount-4:
|
if row <= rowCount-4:
|
||||||
pieces = [board[line+1][place],board[line+2][place],board[line+3][place]]
|
pieces = [board[row+1][place],board[row+2][place],board[row+3][place]]
|
||||||
else:
|
else:
|
||||||
pieces = [0]
|
pieces = [0]
|
||||||
|
|
||||||
if all(x == piecePlayer for x in pieces):
|
if all(x == piecePlayer for x in pieces):
|
||||||
won = piecePlayer
|
won = piecePlayer
|
||||||
winDirection = "v"
|
winDirection = "v"
|
||||||
winCoordinates = [line,place]
|
winCoordinates = [row,place]
|
||||||
|
|
||||||
# Checks right diagonal
|
# Checks right diagonal
|
||||||
if line <= rowCount-4 and place <= columnCount-4:
|
if row <= rowCount-4 and place <= columnCount-4:
|
||||||
pieces = [board[line+1][place+1],board[line+2][place+2],board[line+3][place+3]]
|
pieces = [board[row+1][place+1],board[row+2][place+2],board[row+3][place+3]]
|
||||||
else:
|
else:
|
||||||
pieces = [0]
|
pieces = [0]
|
||||||
|
|
||||||
if all(x == piecePlayer for x in pieces):
|
if all(x == piecePlayer for x in pieces):
|
||||||
won = piecePlayer
|
won = piecePlayer
|
||||||
winDirection = "r"
|
winDirection = "r"
|
||||||
winCoordinates = [line,place]
|
winCoordinates = [row,place]
|
||||||
|
|
||||||
# Checks left diagonal
|
# Checks left diagonal
|
||||||
if line <= rowCount-4 and place >= 3:
|
if row <= rowCount-4 and place >= 3:
|
||||||
pieces = [board[line+1][place-1],board[line+2][place-2],board[line+3][place-3]]
|
pieces = [board[row+1][place-1],board[row+2][place-2],board[row+3][place-3]]
|
||||||
else:
|
else:
|
||||||
pieces = [0]
|
pieces = [0]
|
||||||
|
|
||||||
if all(x == piecePlayer for x in pieces):
|
if all(x == piecePlayer for x in pieces):
|
||||||
won = piecePlayer
|
won = piecePlayer
|
||||||
winDirection = "l"
|
winDirection = "l"
|
||||||
winCoordinates = [line,place]
|
winCoordinates = [row,place]
|
||||||
|
|
||||||
|
|
||||||
return won, winDirection, winCoordinates
|
return won, winDirection, winCoordinates
|
||||||
@ -242,13 +243,13 @@ def AICalcPoints(board,player):
|
|||||||
otherPlayer = player%2+1
|
otherPlayer = player%2+1
|
||||||
|
|
||||||
# Adds points for middle placement
|
# Adds points for middle placement
|
||||||
for line in range(len(board)):
|
for row in range(len(board)):
|
||||||
if board[line][3] == player:
|
if board[row][3] == player:
|
||||||
score += AIScores["middle"]
|
score += AIScores["middle"]
|
||||||
|
|
||||||
# Checks horizontal
|
# Checks horizontal
|
||||||
for line in range(rowCount):
|
for row in range(rowCount):
|
||||||
rowArray = [int(i) for i in list(board[line])]
|
rowArray = [int(i) for i in list(board[row])]
|
||||||
for place in range(columnCount-3):
|
for place in range(columnCount-3):
|
||||||
window = rowArray[place:place+4]
|
window = rowArray[place:place+4]
|
||||||
score += evaluateWindow(window,player,otherPlayer)
|
score += evaluateWindow(window,player,otherPlayer)
|
||||||
@ -261,15 +262,15 @@ def AICalcPoints(board,player):
|
|||||||
score += evaluateWindow(window,player,otherPlayer)
|
score += evaluateWindow(window,player,otherPlayer)
|
||||||
|
|
||||||
# Checks right diagonal
|
# Checks right diagonal
|
||||||
for line in range(rowCount-3):
|
for row in range(rowCount-3):
|
||||||
for place in range(columnCount-3):
|
for place in range(columnCount-3):
|
||||||
window = [board[line][place],board[line+1][place+1],board[line+2][place+2],board[line+3][place+3]]
|
window = [board[row][place],board[row+1][place+1],board[row+2][place+2],board[row+3][place+3]]
|
||||||
score += evaluateWindow(window,player,otherPlayer)
|
score += evaluateWindow(window,player,otherPlayer)
|
||||||
|
|
||||||
# Checks left diagonal
|
# Checks left diagonal
|
||||||
for line in range(rowCount-3):
|
for row in range(rowCount-3):
|
||||||
for place in range(3,columnCount):
|
for place in range(3,columnCount):
|
||||||
window = [board[line][place],board[line+1][place-1],board[line+2][place-2],board[line+3][place-3]]
|
window = [board[row][place],board[row+1][place-1],board[row+2][place-2],board[row+3][place-3]]
|
||||||
score += evaluateWindow(window,player,otherPlayer)
|
score += evaluateWindow(window,player,otherPlayer)
|
||||||
|
|
||||||
|
|
||||||
@ -307,6 +308,7 @@ def minimax(board, depth, player , originalPlayer, alpha, beta, maximizingPlayer
|
|||||||
testBoard = placeOnBoard(testBoard,player,column)
|
testBoard = placeOnBoard(testBoard,player,column)
|
||||||
if testBoard != None:
|
if testBoard != None:
|
||||||
evaluation = minimax(testBoard,depth-1,player%2+1,originalPlayer,alpha,beta,False)
|
evaluation = minimax(testBoard,depth-1,player%2+1,originalPlayer,alpha,beta,False)
|
||||||
|
if evaluation < -9000: evaluation += AIScores["avoid losing"]
|
||||||
value = max(value,evaluation)
|
value = max(value,evaluation)
|
||||||
alpha = max(alpha,evaluation)
|
alpha = max(alpha,evaluation)
|
||||||
if beta <= alpha:
|
if beta <= alpha:
|
||||||
@ -319,6 +321,7 @@ def minimax(board, depth, player , originalPlayer, alpha, beta, maximizingPlayer
|
|||||||
testBoard = placeOnBoard(testBoard,player,column)
|
testBoard = placeOnBoard(testBoard,player,column)
|
||||||
if testBoard != None:
|
if testBoard != None:
|
||||||
evaluation = minimax(testBoard,depth-1,player%2+1,originalPlayer,alpha,beta,True)
|
evaluation = minimax(testBoard,depth-1,player%2+1,originalPlayer,alpha,beta,True)
|
||||||
|
if evaluation < -9000: evaluation += AIScores["avoid losing"]
|
||||||
value = min(value,evaluation)
|
value = min(value,evaluation)
|
||||||
beta = min(beta,evaluation)
|
beta = min(beta,evaluation)
|
||||||
if beta <= alpha:
|
if beta <= alpha:
|
||||||
|
Reference in New Issue
Block a user