saroff
@saroff
Enterprise Java Developer

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

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

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

Войти через центр авторизации
Похожие вопросы