🤖 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 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: