Оценочная функция

Пишу оценочную функцию для игры, правила приложил. Моя идея состоит в том, что главная функция принимает в кач-ве параметров доску и тип игрока (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 очков.


Ответы (0 шт):