<< Вернуться на главную

НАНОТЕХ

Главная идея конкурса базируется на одноименном научно-фантастическом рассказе Александра Владимировича Лазоревича.

Было бы не плохо перед конкурсом прочитать его (для вдохновения) но на крайний случай можно обойтись и кратким пересказом :-).

Итак:

Группа талантливых ученых изобрела саморазмножающийся наномеханизм (бактерию-киборг), который размножившись, практически заполнил весь земной шар.

Все эти механизмы объеденены в глобальную информационную сеть наподобии интернета и могут управляться волей человека. Это открывает огромные созидательные возможности и позволяет изготавливать практически любые вещи, буквально складывая их из атомов.

Вот управление этими нано механизмами и составляет условие конкурса.

Вы должны написать программу управления группой этих киборгов с таким расчетом, чтобы они собрали из пролетающих мимо атомов некоторую деталь по предлагаемому чертежу.

За каждый установленный на место атом, вы получаете один балл (а за неверно установленный - штраф 2 балла). Цель как всегда, набрать наибольшее количество баллов за ограниченное количество ходов (5000). Кто больше всего наберет - тот и победит!

Программку для просмотра и предварительного ознакомления можно скачать ТУТ!

Выглядит это примерно так:


Справа рабочий чертеж для сборки а слева - рабочее поле, на котором собирается копия. В процессе сборки можно отключать отображение атомов и киборгов (крыжики внизу).

Исходники можно взять ниже. Как всегда в нашем конкурсе предложено готовое решение, которое нужно улучшить.
Проект для DELPHI7(CodeGear)
Проект для C++BUILDER(CodeGear)
Проект для Lazarus

Ну а теперь поподробнее о задании:
На поле размером 320 на 320 собирается объект по предлагаемому чертежу. Конкурсанты должны придумать стратегию (кого хватать, куда бежать, что ставить) а потом эту стратегию воплотить в готовую программу.
Все взаимодействие идет только через подпрограммы и функции! (это для нашего конкурса новинка, обычно пользователю предоставляются некоторые данные, а тут мы видим весь мир только "глазами" бактерий-киборгов). Но мы ничем не ограничиваем ваше право хранить все что нужно в собственных переменных.

Единственно, чем можно воспользоваться - это константы
MAX_STEK=10;// количество атомов, которое одновременно может хранить бактерия киборг
MAX_KIB=150;// количество киборгов (на очном этапе оно может меняться)
MAX_ATOM=1500;// "плотность" свободных атомов
MAX_RAZM=320;// размер картинки
Учтите, на очном этапе эти параметры могут измениться!

Конкурсанты могут править только подпрограмму "MY_HOD" и задавать свои переменные, в остальные части программы "влезать" настоятельно не рекомендуется!

PROCEDURE M_UPR(NN,KOM:Integer);//(lazarus, delphi)
void M_UPR (int NN,int KOM);//(C++ Builder

Главная подпрограмма управления киборгами. Подпрограмме передается номер киборга (от 1 до MAX_KIB) и собственно команда:
1 - вверх
2 - вправо
3 - вниз
4 - влево
5 - схватить пролетающий мимо атом
6 - Установить последний взятый атом на подложку в координатах киборга

Управление очень простое, но нужно помнить, что киборг может одновременно нести не более "MAX_STEK" атомов. При этом они хранятся как патроны в магазине автомата, кто последним взят, тот первым установится.
Если вы по ошибке возьмете "лишний" атом, то он возьмется, но при этом из стека "выпадет" атом взятый вами самым первым.

Управление сделано в "дураконепроницаемом" режиме. Неверные команды просто не выполняются. И еще нужно знать, что за один ход вы можете поуправлять киборгом много раз, но реально выполнится только последняя выданная вами команда.

Узнать текущие параметры киборга можно вызвав подпрограмму

PROCEDURE M_GET_SOST_KIB(N:Integer;VAR XX,YY:Integer;VAR T:BYTE);//(lazarus, delphi)
void M_GET_SOST_KIB(int N,int &XX,int &YY,byte &T);//(C++ Builder

Вы даете номер киборга (N) и подпрограмма возвращает вам его текущие координаты (XX, YY) и номер первого в стеке атома (T). Если T=0 значит у киборга нет ни одного атома в стеке.

Какой атом сейчас пролетает мимо указанного киборга, вы можете узнать вызвав функцию

FUNCTION M_GET_ATOM(NN:Integer):BYTE;//(lazarus, delphi)
Byte M_GET_ATOM(int NN);//(C++ Builder

Функция может вернуть "0" - (нет атома) или номер от 1 до 3 (тип атома)

Понять, какой атом должен стоять в указанных координатах (прочесть чертеж) можно через функцию

FUNCTION M_GET_RIS(X,Y:Integer):BYTE;//(lazarus, delphi)
Byte M_GET_RIS (int X,int Y);//(C++ Builder

Функция может вернуть "0" - (нет атома) или номер от 1 до 3 (тип атома)

Остальные функции являются служебными и их использование конкурсантами не предусмотрено. В крайнем случае можно еще использовать функцию получения баллов (FUNCTION M_GET_SCORE:Integer;) но это вряд-ли повлияет на конечный результат :-)

В приведенных исходниках имеются примеры использования всех нужных подпрограмм и функций. И еще раз напоминаем, что пользуясь этими компонентами вы можете создать и использовать собственные переменные.

Как всегда, конкурс состоится в 2-а этапа. На первом этапе (аж до нового года) все вникаем в проблему, ищем решения, пробуем, задаем любые вопросы. Попутно вылавливаем разные баги (чтобы потом сюрпризов на очном этапе было поменьше). И пишем свои версии программ

Ну а на зимних каникулах (08.01.2014 В 11:00 В КАБИНЕТЕ 2-24) состоится очный этап. Если народу будет слишком много, то участвовать будут только лучшие. Для чего необходимо принести готовые программы с заочного этапа. Сражаться будем в 2-х номинациях
8-е 9-е классы и 10-е 11-е.
Следите за информацией на сайте.

Желающим принять участие в конкурсе очень желательно зарегистрироваться. Чтобы заранее "застолбить" место на очном этапе.
РЕГИСТРАЦИЯ

На сегодня зарегистрировались:

Фамилия имя Среда программирования Особые отметки
Возисов Никита LAZARUS 10кл
Кириллов Семен LAZARUS 9кл
Медведев Алексей LAZARUS 10кл
Иванов Данил LAZARUS 10кл
Смирнов Кирилл LAZARUS 9кл
Кострюков Алексей Delphi 10
Данилюк Кирилл Delphi 11
Двоеглазов Николай С++ 11
Ерушевич Дмитрий С++ ?????

По всем вопросам обращайтесь к администрации "Звездного Мира" через систему

Вопрос-ответ.

или по почте