Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 00:47

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: типа кусок тетриса
СообщениеДобавлено: Пн апр 28, 2008 10:59 
Не в сети

Зарегистрирован: Пт авг 25, 2006 01:58
Сообщения: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Хе-хе... Я как раз совсем недавно такую задачу решал. Правда чуть более сложную, правда не на форте а на яве, и не в качестве разминки, а в практической деятельности (программирование для платформы Android). Задача была следующей. В игре The Next Tetris квадратики одинакового цвета сливаются в блоки. А блоки должны падать раздельно, как твердые тела, если ни на что не опираются. В связи с чем и нужно было разметить блоки и выяснить, какие из них опёрты, какие нет. С разметкой я поступил так (извиняюсь, кода не привожу ибо во-первых его трудно вычленить оставив понятным, во-вторых это форум фортеров, а не явщиков):
1 ) Помечаем все клетки как непросканированные
2 ) Процедура сканирования вызывается для каждой еще не просканированной клетки
3 ) Сама процедура, вызванная для клетки прежде всего помечает её как просканированную. Затем смотрит цвета всех её соседей. Если цвет некоторой соседней клетки совпадает, а сама она еще не просканирована, процедура рекурсивно вызывает саму себя для этой клетки.

Таким образом за один вызов верхнего уровня, до возврата, процедура размечает один блок. Наглядно это очень напоминает каплю чернил, растекающуюся по луже строго в её (лужи) границах.

Ставлю следующую задачу. Положим все "острова" или "блоки" уже размечены и организованны скажем в виде двусвязных списков. Упадут те, которые не опёрты. Опёртым считается блок, опирающийся либо на основание стакана (координата y=0) либо на опёртый блок. Требуется:
1) Определить, какие блоки упадут.
2) Определить какое расстояние они пролетят вниз.
Замечание: Не всё так просто. Блоки например могут входить друг с другом в сложное зацепление. Алгоритм должен правильно разрешать все такие ситуации.

замечание: перед тем, как оформлять ТЗ новой задачи обязательно необходимо читать правила конкурса. Посему, выделил ваше задание в отдельный топик *модератор


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 29, 2008 05:50 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Зачем цвета смотреть непонятно, вот оно явавское, проще создать массив стакана, если -1 то блок, 0 пусто.

_________________
Меня нет, не будет и не было.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 29, 2008 14:56 
Не в сети

Зарегистрирован: Пт авг 25, 2006 01:58
Сообщения: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Прошу пардона, давно тут зарегился но как то не получалось заглядывать... Так что мог что-то и нарушить, но по раздолбайству, а не по злому умыслу :)

Pretorian, не совсем так. И яванское тут нипричем. Вобщем-то всё равно какого цвета кошка, лишь бы мышей ловила... Давай я лучше поточнее задачу сформулирую.

Итак. Есть стакан для тетриса, в котором уже лежат какие-то кубики. Кубики семи разных цветов - красный R, синий B, зеленый G, желтый Y, белый W, малиновый M и оранжевый O.
Восьмым цветом * будем обозначать пустое пространство. Значками _ и | соответственно дно и стенки стакана. Например такая картинка:

|**********|
|**********|
|Y*YY**W**|
|W*RRBBB**|
|W*RBBBB**|
|WWRRBBB**|
|W*********|
|W*G*******|
|-------------|

Сначала требуется как-то разметить сами блоки. Например на картинке видно, что слева расположен белый блок. Внизу - зеленый из одного кубика. Выше - сцепленные красный и синий блоки, На белом стоит желтый. На красном - желтый. На синем - белый. Первая задача - разметить блоки из соседних одноцветных кубиков. Это та же самая задача об островах, что здесь рассматривалась, но только с ЦВЕТНЫМИ островами. Так что пиши хоть на яве, хоть на форте, хоть на смаллтоке с АПЛ, от рассмотрения цветов не уйти никуда. На яве я написал рекурсивный алгоритм, который это делает. К сожалению Java - ЕДИНСТВЕННЫЙ язык программирования, на котором разрешено разрабатывать приложения под платформу Android(бывший Google phone). Иначе бы попытался это сделать на форте. Сам не слишком яву люблю, но работать пришлось с тем что есть.

Следующая задача - определить, какие блоки упадут, какие нет, если блоки уже каким-то способом размечены (я например связывал кубики в двусвязные списки). Например на картинке не упадут зеленый и белый блоки, стоящие на дне. А так же желтый блок, стоящий на белом. А упадут красный, синий и опирающиеся на них белый и желтый. Сразу предупреждаю. Тупо смотреть, есть ли под блоками пустое пространство - не прокатит. Например красный и синий блоки на картинке сцеплены. А белый и желтый на них опёрты. Тем не менее все они должны быть помечены как падающие, и для каждого из них вычислено расстояние, на которое они упадут. На картинке это расстояние равно 1 клетке для всех 4-х падающих блоков, поскольку красный при падении обопрётся о зеленый, синий с ним сцеплен а белый с желтым на них опираются. Алгоритм должен все такие сложные ситуации правильно обрабатывать.


P.S. Прошу еще раз прощения. Если кого заинтересует задача, давайте алгоритм лучше на словах. Типа "помечаем так-то, проверяем то-то". Просто в моём решении (опять же ява под Android) есть ряд довольно тонких моментов, отладить которые вот так сразу будет тяжело. И как обойтись без них на том же форте например, мне не понятно. Думаю что никак. У меня это плотно заняло 2 выходных, часов по 10 каждый. Поэтому не надо точного решения. Интересен просто ход мысли. Может быть у кого-то получится проще чем у меня.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB