🤖 Connect 4 AI prolongs losing

This commit is contained in:
NikolajDanger
2020-08-02 12:59:57 +02:00
parent 6c3e80739e
commit 04b5d55414

View File

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