Простой "структурированный" подход
Если вы думаете о доске как:
A B C
D E F
G H I
Тогда один минимальный выбор блоков, к которому должен прикоснуться любой выигрышный макет:
A B C
D
G
Вы можете представить движение из любого из этих мест в выигрышной линии в терминах смещения на 0, 1 или -1 позиции в каждом из направлений X и Y. Мы можем перечислить движения, которые вам нужно проверить:
A: (++x) (++x, ++y) (++y)
B: (++y)
C: (++y) (--x, ++y)
D: (++x)
E: (++x)
В C ++ вы можете создать список / вектор координат x / y начальных точек и показанных выше дельт движения + / - / 0 x / y, а затем использовать три вложенных цикла для оценки каждой линии на доске. .
Это значительно больше работы, чем просто жесткое кодирование двух циклов по координатам x и y и двум диагоналям (ниже), но это более алгоритмический подход, который может быть интеллектуально привлекательным: больше похоже на то, что вам, возможно, придется делать, если вы обрабатываете намного большая доска.
Очевидное приближение грубой силы
Для простоты, этот более простой подход будет выглядеть так:
int x;
for (row = 0; row < 3; ++row)
if ((x = board[row][0]) != Empty &&
board[row][1] == x && board[row][2] == x)
return x;
// similar loop for columns...
...
// hardcode diagonals...
if ((x = board[1][1]) != Empty &&
(board[0][0] == x && board[2][2] == x ||
board[2][0] == x && board[0][2] == x))
return x