Вы правы, такая техника есть.
Каждый выигрышный паттерн начинается с верхнего или левого края и продолжается три шага. На каждом из этих этапов происходит одно из следующих действий:
- Номер строки увеличивается, а столбец остается прежним
- Номер столбца увеличивается, а строка остается прежней
- Увеличивается номер строки и столбца (первая диагональ)
- Номер строки увеличивается, а номер столбца уменьшается (другая диагональ)
Так что теперь вы можете написать такую функцию:
bool CheckWin(char[3][3] board, char playerCh, int r, int c, int dr, int dc) {
for (int i = 0 ; i != 3 ; i++) {
if (board[r+i*dr][c+i*dc] != playerCh) {
return false;
}
}
return true;
}
Используя эту функцию, вы можете проверить, есть ли у игрока три в ряд, начиная с (r, c), с рядами dr dr и столбцами dc:
bool won = false;
for (int i = 0 ; !won && i != 3 ; i++) {
won |= CheckWin(board, 'X', i, 0, 0, 1)
|| CheckWin(board, 'X', 0, i, 1, 0);
}
won |= CheckWin(board, 'X', 0, 0, 1, 1);
won |= CheckWin(board, 'X', 2, 0, -1, 1);