Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 20:02

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - типа кусок тетриса
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
Прошу пардона, давно тут зарегился но как то не получалось заглядывать... Так что мог что-то и нарушить, но по раздолбайству, а не по злому умыслу :)

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 каждый. Поэтому не надо точного решения. Интересен просто ход мысли. Может быть у кого-то получится проще чем у меня.
Сообщение Добавлено: Вт апр 29, 2008 14:56
  Заголовок сообщения:   Ответить с цитатой
Зачем цвета смотреть непонятно, вот оно явавское, проще создать массив стакана, если -1 то блок, 0 пусто.
Сообщение Добавлено: Вт апр 29, 2008 05:50
  Заголовок сообщения:  типа кусок тетриса  Ответить с цитатой
Хе-хе... Я как раз совсем недавно такую задачу решал. Правда чуть более сложную, правда не на форте а на яве, и не в качестве разминки, а в практической деятельности (программирование для платформы Android). Задача была следующей. В игре The Next Tetris квадратики одинакового цвета сливаются в блоки. А блоки должны падать раздельно, как твердые тела, если ни на что не опираются. В связи с чем и нужно было разметить блоки и выяснить, какие из них опёрты, какие нет. С разметкой я поступил так (извиняюсь, кода не привожу ибо во-первых его трудно вычленить оставив понятным, во-вторых это форум фортеров, а не явщиков):
1 ) Помечаем все клетки как непросканированные
2 ) Процедура сканирования вызывается для каждой еще не просканированной клетки
3 ) Сама процедура, вызванная для клетки прежде всего помечает её как просканированную. Затем смотрит цвета всех её соседей. Если цвет некоторой соседней клетки совпадает, а сама она еще не просканирована, процедура рекурсивно вызывает саму себя для этой клетки.

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

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

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

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


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