func negamax(b game.Board, depth, alpha, beta int, color game.Color) (int, game.Move) { if depth == 0 { return scoreBoard(b, color), nullMove } moves := b.AvailableMoves(color) if len(moves) == 0 { return math.MinInt32 + 1, nullMove } var ( bestScore = math.MinInt32 bestMove game.Move ) for _, i := range rand.Perm(len(moves)) { val, _ := negamax(b.IfMove(moves[i]), depth-1, -beta, -alpha, color.Other()) val = -val if val > bestScore { bestScore = val bestMove = moves[i] } if val > alpha { alpha = val } if alpha >= beta { break } } return bestScore, bestMove }