🤖 Connect 4 AI prolongs losing
This commit is contained in:
@ -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:
|
||||
|
Reference in New Issue
Block a user