![]() |
|
|
![]()
|
|
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
Всем привет. Следующий код находит совпадения подряд шариков (как в игре Lines) в двомерном массиве.
И это только для одного типа шарика. Всего их 4 (BALL_1_TYPE, BALL_2_TYPE, BALL_3_TYPE, BALL_4_TYPE). BALL_EMPTY_TYPE делает клетку пустой. Функуия возращает количество заработаных очков . Как видите алгоритм очень плохой для читабельности и т д. Как можно оптимизировать? Спасибо. Это сообщение отредактировал(а) Sergio - 18.12.2008, 16:51 |
|||
|
||||
| maxdiver |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
примерно так, не компилил. Добавлено через 3 минуты и 38 секунд И, кстати, не понял у вас такого оборота:
Вообще-то, operator== возвращает только true/false, а не само значение. Вот для присвоения это будет работать нормально, а для проверки на равенство - нет. |
||||
|
|||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
какие направления возможны? только горизонтальные/вертикальные? или диагональные?
в целом, можно так: проходимся по всему полю для каждой клеточки предполагаем, что шарик является крайним в линии проверяем в каждом из 8 направлений количество шариков если больше порога - помечаем их удалёнными, удалять сразу не стоит, т.к. один шарик может участвовать в нескольких линиях на самом деле, можно проверять только половину направлений например необязательно проверять направление вниз, если мы и так отлавливаем все направления вверх - мы обнаружим эту линию позже, при анализе нижнего шарика т.е. получается что-то вроде такого:
-------------------- qqq |
|||
|
||||
| Sergio |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
maxim1000, диагональные тоже нужны. Можно ещё описать выше написаный код? Не очень понятен этот кусок
Это сообщение отредактировал(а) Sergio - 18.12.2008, 19:54 |
||||
|
|||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
для простоты предположим, что нас интересуют только горизонтальные направления тогда функция CheckLine делает две вещи: 1. смотрит, сколько шариков такого же цвета справа от выбранного (x,y) 2. если их количество больше какого-то порога, то помечает их удалёнными можно переписать её по-другому:
порог - это то минимальное количество шариков в линии, чтобы она удалилась в данном случае - 4 -------------------- qqq |
|||
|
||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
теперь понял.
Ещё вопросик: зачем вичислать максимум из этих переменных?
Это сообщение отредактировал(а) Sergio - 19.12.2008, 14:53 |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 2 Всего: 134 |
Если это реализация lines, то нужно не так. В lines есть удобный инвариант: прямо перед ходом игрока на поле никогда нет линии из 4 и более шариков одинакового цвета. Данный инвариант может быть нарушен только в момент добавления шарика или перемещения шарика игроком.
То есть проверку надо делать только при добавлении шарика или только при переносе шарика в новую позицию. А дальше уже просто - проверяем на образование линий и вуаля. примерно так:
Это сообщение отредактировал(а) Mayk - 19.12.2008, 14:51 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
ну это что-то типа максимально возможной длины хотя. конечно, field должен выдавать "пусто" на клетках снаружи поля -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |