Вот что я бы использовал:
Пройдите по всем рядам (во всех направлениях). За каждый ряд, если он имеет только одну оценку игрока, присуждают очки этого игрока в зависимости от количества оценок. Вы можете иметь таблицу соответствия, отображающую количество баллов для оценки, которая может быть скорректирована для получения наилучших результатов. Конечным результатом будет разница между оценками двух игроков.
Пример (псевдокод):
const int markScore[4+1] = {0, 1, 3, 5, 99999}; //assuming 4x4x4 board
//The above values are arbitrary - adjust to what you think makes sense.
score = 0;
for all rows in all directions:
count Xs and Os
if (xs>0 && os==0)
score += markScore[xs];
else if (os>0 && xs==0)
score -= markScore[os];
return score;
Это должно работать хорошо, потому что любая строка с оценками только одного игрока дает этому игроку шанс на победу.