Alpha-Beta Pruning

AlphaBetaPruning function from AIPlayForm.cs
int AlphaBetaPruning(int level, int alpha, int beta)
{
// 만약에 현재 최대 깊이인 limit에 도달한 경우
if (level == limit)
{
// AI의 평가 가치에서 플레이어의 평가 가치를 뺀 수를 반환
return evaluate(aiPlayer) - evaluate(userPlayer);
}
// MAX 부분에 해당하는 경우
if (level % 2 == 0)
{
// 더이상 작아질 수 없는 수를 max로 설정
int max = -1000000;
// 탐색을 끝내는 경우 find를 1로 설정
int find = 0;
// 전체 바둑판을 모두 탐색
for (int i = 0; i < edgeCount; i++)
{
for (int j = 0; j < edgeCount; j++)
{
// 현재 위치에 둘 수 있는 경우
if (board[i, j] == 0)
{
// 잠시 그 수를 둔 것으로 설정
board[i, j] = aiPlayer;
// 재귀적 호출
int e = AlphaBetaPruning(level + 1, alpha, beta);
// 다시 그 수를 두지 않은 것으로 설정
board[i, j] = 0;
// 만약에 더욱 효율적인 수를 찾은 경우
if (max < e)
{
// 그 수로 타겟을 설정
max = e;
if (level == 0)
{
targetX = i;
targetY = j;
}
}
// alpha값 갱신
if (alpha < max)
{
alpha = max;
// 만약에 현재 알파값이 베타값보다 크다면 더이상 노드를 볼 필요가 없음
if (alpha >= beta) find = 1;
}
}
if (find == 1) break;
}
if (find == 1) break;
}
return max;
}
// MIN 부분에 해당하는 경우
else
{
// 더이상 커질 수 없는 수를 min으로 설정
int min = 1000000;
// 탐색을 끝내는 경우 find를 1로 설정
int find = 0;
// 전체 바둑판을 모두 탐색
for (int i = 0; i < edgeCount; i++)
{
for (int j = 0; j < edgeCount; j++)
{
// 현재 위치에 둘 수 있는 경우
if (board[i, j] == 0)
{
// 잠시 그 수를 둔 것으로 설정
board[i, j] = userPlayer;
// 재귀적 호출
int e = AlphaBetaPruning(level + 1, alpha, beta);
// 다시 그 수를 두지 않은 것으로 설정
board[i, j] = 0;
// 더욱 작은 수를 찾은 경우
if (min > e) min = e;
// beta값 갱신
if (beta > min)
{
beta = min;
// 만약에 현재 알파값이 베타값보다 크다면 더이상 노드를 볼 필요가 없음
if (alpha >= beta) find = 1;
}
}
if (find == 1) break;
}
if (find == 1) break;
}
return min;
}
}