Пример расчета оф
У нас имеется импровизированное поле 8x8 (рис.1), на котором шла некоторая игра и остановилась на определенном моменте, попробуем оценить игровую ситуацию нашим алгоритмом:
Рис.1 Игровое поле
Оранжевый квадрат, подступ к дому
Черный квадрат дом
Оценим положения шашек вне своих домов:
Белые шашки (+1 очко)
Черные шашки (+2 очка)
Оценим насколько близко шашки расположены к домам противника:
Белые шашки (+4 очка) всего: 5 очков
Черные шашки (+0 очков) всего: 2 очка
Оценим сколько шашек расположено во вражеских домах:
Белые шашки (+3 очко) всего: 8 очков
Черные шашки (+0 очков) всего: 2 очка
Посчитаем сумму полученных очков и вычислим их разницу:
Белая сторона = 8
Черная сторона = 2
Результат = 8 – 2 = 6 (выигрывает белая сторона)
Рис.2 Результат программы
Программный код с комментариями
#include <iostream>
using namespace std;
int OutsideOfHome(char Board[8][8], char Сheckers) // Начисление очков обеим сторонам за нахождение шашек вне своего дома
{
int Count = 0;
if (Сheckers == '2') {
for (int i = 0; i < 8; ++i) {
for (int j = 0; j < 8; ++j) {
if (i < 4 && j < 3) {
if (Board[i][j] == Сheckers) {
Count += 1;
}
}
else if (i == 4) {
if (Board[i][j] == Сheckers) {
Count += 1;
}
}
else if (i > 4 && j > 3) {
if (Board[i][j] == Сheckers) {
Count += 1;
}
}
}
}
}
else
{
for (int i = 0; i < 8; ++i) {
for (int j = 0; j < 8; ++j) {
if (i < 3 && j < 4) {
if (Board[i][j] == Сheckers) {
Count += 1;
}
}
else if (i == 3) {
if (Board[i][j] == Сheckers) {
Count += 1;
}
}
else if (i > 3 && j > 4) {
if (Board[i][j] == Сheckers) {
Count += 1;
}
}
}
}
}
return Count;
}
int CloseToHome(char Board[8][8], char Сheckers) // Начисление очков обеим сторонам за нахождение шашек у дома противника
{
int Count = 0;
if (Сheckers == '2') {
for (int i = 0; i < 5; ++i) {
for (int j = 3; j < 8; ++j) {
if (i < 3 && j == 3) {
if (Board[i][j] == Сheckers) {
Count += 2;
}
}
else if (i == 4 && j > 2) {
if (Board[i][j] == Сheckers) {
Count += 2;
}
}
}
}
}
else
{
for (int i = 4; i < 8; ++i) {
for (int j = 0; j < 8; ++j) {
if (i == 4 && j < 5) {
if (Board[i][j] == Сheckers) {
Count += 2;
}
}
else if (i > 4 && j == 4) {
if (Board[i][j] == Сheckers) {
Count += 2;
}
}
}
}
}
return Count;
}
int InHome(char Board[8][8], char Сheckers) // Начисление очков обеим сторонам за нахождение шашки в доме противника
{
int Count = 0;
if (Сheckers == '2') {
for (int i = 0; i < 3; ++i) {
for (int j = 4; j < 8; ++j) {
if (Board[i][j] == Сheckers) {
Count += 3;
}
}
}
}
else
{
for (int i = 5; i < 8; ++i) {
for (int j = 0; j < 4; ++j) {
if (Board[i][j] == Сheckers) {
Count += 3;
}
}
}
}
return Count;
}
int EvaluationFunction(char Board[8][8]) // Оценочная функция
{
return (OutsideOfHome(Board, '2') + CloseToHome(Board, '2') + InHome(Board, '2')) - (OutsideOfHome(Board, '1') + CloseToHome(Board, '1') + InHome(Board, '1'));
}
int main()
{
setlocale(LC_ALL, "ru");
// На доске представлены черные и белые шашки
// '1' - черные шашки
// '2' - белые шашки
char Board[8][8] =
{
'0', '0', '0', '0', '1', '1', '1', '1',
'0', '0', '0', '2', '1', '1', '1', '1',
'0', '0', '0', '1', '2', '0', '1', '1',
'0', '0', '1', '0', '2', '0', '0', '0',
'0', '0', '0', '2', '0', '0', '0', '0',
'2', '2', '0', '0', '0', '0', '0', '0',
'2', '0', '2', '2', '0', '0', '0', '0',
'2', '2', '0', '2', '0', '0', '0', '0',
};
int result = EvaluationFunction(Board);
if (result < 0)
cout << "Выиграшная ситуация у черных шашек " << result;
else
cout << "Выиграшная ситуация у белых шашек " << result;
return 0;
}
