saroff
@saroff
Enterprise Java Developer

Матрица три на три, как быстро проверить, совпадают ли между собой элементы любого столбца\строки\диагонали?

Пишу программу для игры в крестики нолики, как проверить, что кто-то выстроил 3 элемента в ряд и игра выиграна? Единственное что приходит в голову - отдельно сравнивать на равенство каждый столбец\строку\диагональ, но это борода, может подскажете чего поумнее?
  • Вопрос задан
  • 3129 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Ndochp
ИМХО для поля произвольной расмерности надо проверять не поле, а ход. Так как число выигрыщных комбинаций с ростом поля будет расти очень плохо. Думаю надо проверять каждый ход, не привел ли он к победе.
То есть после каждого хода проверяем последовательно
1. длина диагонали крестиков вверхвправо + внизвлево+1
2. длина диагонали крестиков вверхвлево+внизвправо+1
3. длина диагонали крестиков вправо+влево+1
4. длина диагонали крестиков вниз+вверх + 1
Если хотя бы одно направление больше целевого значения (на неограниченном поле вроде 5 в ряд играют), то игрок победил.
Ответ написан
timych
@timych
Если я правильно понял предлагаемый lumierecyril вариант, то он не вполне рабочий . Представьте что крестик стоит на клетках с индексами 0, 5, 8. По идее если поставить крестик на индекс 4 , игрок выиграл. Но в данном случае это не так. При конкатенации индексов с крестиками мы получим 0, 4, 5 так как согласно предложенной логике мы пробегаем по клеткам последовательно и собираем варианты из трехзначных цифр. Мой вариант - каждый раз собирать строку из индексов , содержащих крестик(или нолик в зависмости от игрока) . Затем имея массив выигрышных комбинаций , проверять имеется ли каждая цифра комбинации в конкатенированной строке индексов с крестиками(работать со String) . Если есть все три совпадения, то игрок выиграл. Есть еще вариант - пробежаться два раза циклом с вложенным циклом по игровому полю, накапливая результаты каждый раз в два списка по условиям - совпадение по горизонтали, по диагонали слева, затем по вертикали и по диагонали справа. Если хоть один список имеет длину равную количеству клеток стороны игрового поля, то игрок выиграл.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы