Оценочная функция
Пишу оценочную функцию для игры, правила приложил. Моя идея состоит в том, что главная функция принимает в кач-ве параметров доску и тип игрока (1 - белые, -1 - черные). Далее в цикле, пробегается по всем клеткам, и если находит клетку на которой стоит фишка нужного цвета, то для нее выполняется оценочная функция 'по позиции'. Далее считаются четыре 'оценки' позиции и выбирается наибольшая. Считаются оценки по принципу, если на ближней клетке стоит фишка такого же цвета то + 10, иначе -10 к итоговому результату, +1 если ближняя клетка пустая. Проблема в том, что программа выдает ошибку когда начинает пробегаться по диагонали я не знаю как ее решить. Прошу помочь разобраться. Спасибо.
#include <iostream>
#include <array>
#include <algorithm>
const int N = 8;
const int BLACK = -1;
const int WHITE = 1;
int board[N][N] =
{
{0,0,0,0,0,0,0,0},
{0,0,-1,-1,-1,1,0,0},
{0,0,0,1,0,1,0,0},
{0,0,1,-1,1,1,0,0},
{0,0,0,0,-1,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};
int evalPosition(int board[N][N], int x, int y, int playerColor)
{
std::array<int, 4> posScoreArray{};
int posScoreX = 10;
int posScoreY = 10;
int posScoreDiag = 10;
int posScoreReverseDiag = 10;
// row check
for (int j = x; j < N; ++j)
{
if (board[x][j+1] == playerColor && j+1 < N)
{
posScoreX += 10;
}
if (board[x][j+1] == -playerColor && j+1 < N)
{
posScoreX -= 10;
}
if (board[x][j+1] == 0 && j + 1 < N)
{
posScoreX += 1;
}
}
for (int j = x; j >= 0; --j)
{
if (board[x][j-1] == playerColor && j-1 >= 0)
{
posScoreX += 10;
}
if (board[x][j-1] == -playerColor && j-1 >=0)
{
posScoreX -= 10;
}
if (board[x][j - 1] == 0 && j - 1 >= N)
{
posScoreX += 1;
}
}
posScoreArray[0] = posScoreX;
//colm check
for (int i = y; i < N; ++i)
{
if (board[i+1][y] == playerColor && i + 1 < N)
{
posScoreY += 10;
}
if (board[i+1][y] == -playerColor && i + 1 < N)
{
posScoreY -= 10;
}
if (board[i+1][y] == 0 && i + 1 < N)
{
posScoreY += 1;
}
}
for (int i = y; i >= 0; --i)
{
if (board[i-1][y] == playerColor && i - 1 >= 0)
{
posScoreY += 10;
}
if (board[i-1][y] == -playerColor && i - 1 >= 0)
{
posScoreY -= 10;
}
if (board[i-1][y] == 0 && i - 1 >= N)
{
posScoreY += 1;
}
}
posScoreArray[1] = posScoreY;
// main diagonal
for (int i = x; x < N; ++i)
{
if (board[i + 1][i + 1] == playerColor && i + 1 < N)
{
posScoreDiag += 10;
}
if (board[i + 1][i + 1] == -playerColor && i + 1 < N)
{
posScoreDiag -= 10;
}
if (board[i + 1][i + 1] == 0 && i + 1 < N)
{
posScoreDiag += 1;
}
}
for (int i = x; x >= 0; --i)
{
if (board[i - 1][i - 1] == playerColor && i - 1 >= 0)
{
posScoreDiag += 10;
}
if (board[i - 1][i - 1] == -playerColor && i - 1 >= 0)
{
posScoreDiag -= 10;
}
if (board[i - 1][i - 1] == 0 && i - 1 >= 0)
{
posScoreDiag += 1;
}
}
posScoreArray[2] = posScoreDiag;
// sideline diagonal
for (int i = x; x < N; ++i)
{
if (board[i + 1][N - i - 1] == playerColor && i + 1 < N)
{
posScoreReverseDiag += 10;
}
if (board[i + 1][N - i - 1] == -playerColor && i + 1 < N)
{
posScoreReverseDiag -= 10;
}
if (board[i + 1][N - i - 1] == 0 && i + 1 < N)
{
posScoreReverseDiag += 1;
}
}
for (int i = x; x >= 0; --i)
{
if (board[N - i - 1][i - 1] == playerColor && i - 1 >= 0)
{
posScoreReverseDiag += 10;
}
if (board[N - i - 1][i - 1] == -playerColor && i - 1 >= 0)
{
posScoreReverseDiag -= 10;
}
if (board[N - i - 1][i - 1] == 0 && i - 1 >= 0)
{
posScoreReverseDiag += 1;
}
}
posScoreArray[3] = posScoreReverseDiag;
return *(std::max_element(posScoreArray.begin(), posScoreArray.end()));
}
int evaluationFunction(int board[N][N], int playerColor)
{
int score = 0;
int temp_score = 0;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
if (board[i][j] == playerColor)
{
temp_score = evalPosition(board, j, i, playerColor);
if (temp_score > score)
{
score = temp_score;
}
}
}
}
return score;
}
int main()
{
int result = evaluationFunction(board, -1);
std::cout << result << "\n";
return 0;
}
Правила Участвуют два игрока. Каждый получает по 12 шашек. Игрок, получивший белые шашки, ставит одну из них на любой из квадратов доски. Затем точно так же выставляется в любом месте чёрная шашка, потом белая и так далее по очереди.
Цель игры — выставить пять из своих шашек в ряд по прямой линии — горизонтальной, вертикальной или по диагонали.
Играющий, увидев что его противник выставил три из своих шашек в ряд по прямой линии, должен сейчас же возле них выставить в линию свою шашку. Если он этот момент пропустит и противник выставит в ряд четыре шашки, то он уже не сможет помешать выставить и пятую, так как не сумеет перекрыть ряд, действуя только с одного конца.
Когда противники выставили все свои 12 шашек, они по очереди начинают передвигать их, стремясь к той же цели — расположить пять своих шашек в ряд по прямой линии.
Передвигать шашки можно в любую сторону, но только на смежный квадрат, не занятый шашкой.
Каждая получившаяся комбинация из пяти шашек записывается (во избежание повторения) и приносит игроку одно очко. Выигрывает игрок, получивший первым 10 очков.