Skip to content

Commit

Permalink
Complete score position function in MinimaxAI
Browse files Browse the repository at this point in the history
  • Loading branch information
sumupitchayan committed Jan 1, 2020
1 parent dfdcc36 commit 81f65ef
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 14 deletions.
4 changes: 2 additions & 2 deletions Connect Four/Board.swift
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,8 @@ struct Board {
There are four different lines that intersect any given point:
- Horizontal (the row): xStep = 1, yStep = 0
- Vertical (the column): xStep = 0, yStep = 0
- Positive Diagonal: xStep = 1, yStep = 0
- Vertical (the column): xStep = 0, yStep = 1
- Positive Diagonal: xStep = 1, yStep = 1
- Negative Diagonal: xStep = 1, yStep = -1
*/
var leftSide = [BoardPosition]()
Expand Down
73 changes: 63 additions & 10 deletions Connect Four/MinimaxAI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ class MinimaxAI: AIPlayer {

override func makeDecision(board: Board) -> Int {
// let bestCol = pickBestMove(game: game)
return pickBestMove(board: board)
// return 0
return pickBestMove(board: board, curToken: token)
}

func isTerminalNode(game: Game) -> Bool {
Expand Down Expand Up @@ -51,19 +50,24 @@ class MinimaxAI: AIPlayer {
return 0
}

func pickBestMove(board: Board) -> Int {
var bestCol = 0
func pickBestMove(board: Board, curToken: TokenColor) -> Int {
let randIndex = Int.random(in: 0..<board.getAvailableCols().count)

var bestCol = board.getAvailableCols()[randIndex]
var bestScore = Int.min
var curScore = Int.min

for col in board.getAvailableCols() {
var boardTemp = board
boardTemp.dropToken(col: col, val: token)
curScore = scorePosition(board: boardTemp, curToken: token)
_ = boardTemp.dropToken(col: col, val: token)

print(curScore)
curScore = scorePosition(board: boardTemp, curToken: curToken)
// print("cur col = \(col)")
// print(curScore)

if curScore > bestScore {
// print("Cur score: = \(curScore)")

if curScore >= bestScore {
bestScore = curScore
bestCol = col
}
Expand All @@ -77,10 +81,50 @@ class MinimaxAI: AIPlayer {
// Score Horizontal
for r in 0..<board.rows {
let rowArr = board.getLine(row: r, col: 0, xStep: 1, yStep: 0)
for c in 0..<board.rows-board.connect-1 {
for c in 0...board.cols-board.connect {
let window = Array(rowArr[c..<c+board.connect])
score += evaluateWindow(window: window, curToken: curToken)
print(window.count)
}
}

// Score Vertical
for c in 0..<board.cols {
let colArr = board.getLine(row: 0, col: c, xStep: 0, yStep: 1)
for r in 0...board.rows-board.connect {
let window = Array(colArr[r..<r+board.connect])
score += evaluateWindow(window: window, curToken: curToken)
}
}

// Score Positive Diagonal
for c in 0..<board.cols {
let posDiagArr = board.getLine(row: 2, col: c, xStep: 1, yStep: 1)
if posDiagArr.count >= board.connect {
var i = 0
var j = board.connect - 1

while(j < posDiagArr.count) {
let window = Array(posDiagArr[i...j])
score += evaluateWindow(window: window, curToken: curToken)
i += 1
j += 1
}
}
}

// Score Negative Diagonal
for c in 0..<board.cols {
let posDiagArr = board.getLine(row: 2, col: c, xStep: 1, yStep: -1)
if posDiagArr.count >= board.connect {
var i = 0
var j = board.connect - 1

while(j < posDiagArr.count) {
let window = Array(posDiagArr[i...j])
score += evaluateWindow(window: window, curToken: curToken)
i += 1
j += 1
}
}
}

Expand All @@ -100,10 +144,19 @@ class MinimaxAI: AIPlayer {
score += 100
} else if counts[curToken] == 3 && counts[.none] == 1 {
score += 10
} else if counts[curToken] == 2 && counts[.none] == 2 {
score += 5
}

if counts[curToken] == 0 && counts[.none] == 1 {
score -= 80
}


// else if counts[curToken] == 2 && counts[.none] == 2 {
// score += 2
// } else if counts[curToken] == 1 {
// score += 7
// }
//
// if counts[token] == 0 && counts[.none] == 1 {
Expand Down
4 changes: 2 additions & 2 deletions Connect FourTests/Connect_FourTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,8 @@ class Connect_FourTests: XCTestCase {

func testGetAvailableCols() {
XCTAssertTrue(board.getAvailableCols().count == 7)
for i in 0..<6 {
board.dropToken(col: 0, val: .red)
for _ in 0..<6 {
_ = board.dropToken(col: 0, val: .red)
}
XCTAssertTrue(board.getAvailableCols().count == 6)
XCTAssertFalse(board.getAvailableCols().contains(0))
Expand Down

0 comments on commit 81f65ef

Please sign in to comment.