Управление роботом. Миниконкурс.
| |
-Mikle- | Дата: Понедельник, 02 Января 2012, 12:12 | Сообщение # 1 |
Изобретатель велосипедов
Сейчас нет на сайте
| Краткое описание: Робот представляет собой три массивных колеса (изображение в 2D), соединённых невесомыми пружинами, внизу расположена земля, имеется сила тяжести, трение. Столкновения колёс между собой и с землёй абсолютно неупругие. Радиус колеса - 32 (в пикселях), длина ненагруженных пружин - 150, земля находится на уровне -32, то есть колесо, касающееся земли, находится на уровне 0. ЭТО ВСЁ УЖЕ НАПИСАНО! Ваша задача - написать robot.dll. Программа, визуализирующая робота, обращается к robot.dll, которая экспортирует единственную ф-цию RTICK. Единственный параметр ф-ции - указатель на структуру, содержащую текущее значения координат и скоростей колёс, а так же усилия, приложенные к пружинам. Задача - заставить робота двигаться вправо, цель - за минуту уйти как можно дальше. Ф-ция RTICK вызывается 60 раз в секунду. Тут уже готовая программа и исходник robot.dll на C++: RoboControl Можно этот исходник брать за основу. Естественно, писать dll можно на любом удобном языке.
Немного подробностей. Единицы все условные: Масса колеса - 1. Время - 1 "тик", то есть примерно 1/60 сек. Расстояние - пиксели. Соответственно скорость - пиксели за тик. Единица силы - та величина, при которой за 1 тик тело массой в 1 ускоряется на 1. Ускорение св. падения - 0.1. Трение об воздух - каждый тик скорость каждого шара умножается на 0.997. К-т жёсткости пружины - 6/150 (по Гуку). Сила трения покоя и движения - 3 * сила_сжатия_тел. Можно только влиять на три пружины, сила от -3 до 3, если дать больше - программа ограничит. Отрицательная сжимает пружину, положительная разжимает. Пружина с индексом №0 соединяет колёса №0 и №1, пружина с индексом №1 соединяет колёса №1 и №2, пружина с индексом №2 соединяет колёса №2 и №0.
Могу, при необходимости, дать исходник физики, но вряд ли это нужно. Мне кажется, что будет и проще, и интереснее сделать так, чтобы робот сам динамически принимал решение.
Текущий результат, который пока можно считать рекордом, от Apati - 43595.
Сообщение отредактировал -Mikle- - Вторник, 03 Января 2012, 09:54 |
|
| |
M1ghtMortal | Дата: Понедельник, 02 Января 2012, 12:37 | Сообщение # 2 |
участник
Сейчас нет на сайте
| О, интересная идея. Возможно попробую написать свой вариант, но не знаю точно.
Java/C++/Unity(C#) Programmer. Мой блог MightMortal.RU
|
|
| |
TimKruz | Дата: Понедельник, 02 Января 2012, 13:29 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| Интересно... Сейчас посмотрю пример, но можно вкратце описать функции управления роботом? Что с ним можно делать?
Сообщение отредактировал TimKruz - Понедельник, 02 Января 2012, 13:33 |
|
| |
-Mikle- | Дата: Понедельник, 02 Января 2012, 13:35 | Сообщение # 4 |
Изобретатель велосипедов
Сейчас нет на сайте
| Quote (TimKruz) можно вкратце описать функции управления роботом? Я уже описал: Quote (-Mikle-) Можно только влиять на три пружины, сила от -3 до 3, если дать больше - программа ограничит. Отрицательная сжимает пружину, положительная разжимает. Это - всё. Quote (TimKruz) что мешает перемещать его бесконечно долго - там какое-то ограничение? Программа сама остановится через минуту и покажет результат.
|
|
| |
TimKruz | Дата: Понедельник, 02 Января 2012, 14:02 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| Quote (-Mikle-) Я уже описал: Можно только влиять на три пружины, сила от -3 до 3, если дать больше - программа ограничит. Отрицательная сжимает пружину, положительная разжимает. А, я пропустил. Значит, frc - это и есть сила сжатия пружины? Сделал DLL-ку по вашему примеру, но программа аварийно завершается (Win7). Мой код (Delphi 7): Code library robot; type fVect=record x,y:single; //Single - вещественный тип в 4 байта, аналог Float (тоже 4 байта) в C++ end; Robo=record Pos:array[0..2]of fVect; //Массивы по три переменные Spd:array[0..2]of fVect; Frc:array[0..2]of single; end; procedure RTICK(R:Robo); StdCall; begin //Ничего не делаю end; exports RTICK; //Экспорт begin end. Вроде бы, всё о описано так же, как в примере на C++. Но что-то не так...
|
|
| |
WTALKER | Дата: Понедельник, 02 Января 2012, 14:18 | Сообщение # 6 |
постоянный участник
Сейчас нет на сайте
| TimKruz, а Result процедура обязательно должна возвращать? Да и function
Перевод на Delphi (начального кода от TimKruz): Code library robot; type fVect=record x,y:single; //Single - вещественный тип в 4 байта, аналог Float (тоже 4 байта) в C++ end; Robo=record Pos:array[0..2]of fVect; //Массивы по три переменные Spd:array[0..2]of fVect; Frc:array[0..2]of single; end;
var R:Robo;
function RTICK():Robo; StdCall; begin R.Frc[0]:=R.Frc[0]-0.007; R.Frc[1]:=R.Frc[1]-0.007; R.Frc[2]:=R.Frc[2]+0.007; if R.Frc[2]>0.8 then begin R.Frc[0]:=0.8; R.Frc[1]:=0.8; R.Frc[2]:=-0.8; end;
Result:=R; end;
exports RTICK; //Экспорт
begin end.
Хм.. 3600.. 3688 - потеря 88.
Раз уж занялся игростроем, то умей и имей: 1) знание иностранного языка и понимание того, что делаешь 2) программы для игростроя, а так же для обработки текстур, моделей, звуков 3) много свободного времени
Сообщение отредактировал WTALKER - Понедельник, 02 Января 2012, 14:37 |
|
| |
Apati | Дата: Понедельник, 02 Января 2012, 14:19 | Сообщение # 7 |
заслуженный участник
Сейчас нет на сайте
| http://rghost.ru/35706870 Мой результат - 16846
|
|
| |
M1ghtMortal | Дата: Понедельник, 02 Января 2012, 15:24 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Apati, У меня с твоей DLL'кой не запускается.
Java/C++/Unity(C#) Programmer. Мой блог MightMortal.RU
|
|
| | |
-Mikle- | Дата: Понедельник, 02 Января 2012, 16:10 | Сообщение # 10 |
Изобретатель велосипедов
Сейчас нет на сайте
| WTALKER, нормально, но у меня больше: robot.dll - 27227. Apati, тоже не могу запустить.
|
|
| |
Apati | Дата: Понедельник, 02 Января 2012, 16:13 | Сообщение # 11 |
заслуженный участник
Сейчас нет на сайте
| ну-ка, а вот этот запустится? http://rghost.ru/35708309
|
|
| |
TimKruz | Дата: Понедельник, 02 Января 2012, 16:24 | Сообщение # 12 |
старожил
Сейчас нет на сайте
| Quote (WTALKER) TimKruz, а Result процедура обязательно должна возвращать? Да и function Перевод на Delphi (начального кода от TimKruz): function RTICK():Robo; StdCall; Да не, не обязательно как функция; я сделал так, тоже работает: Code procedure RTICK(var R:Robo); StdCall; begin //обрабатываем r end; При этом переменные меняются сразу в программе. (передаётся не копия, а оригинал)
Лично мой рекорд, пока что, примерно минус 6500... Что-то влево всё время несёт...
|
|
| |
WTALKER | Дата: Понедельник, 02 Января 2012, 16:28 | Сообщение # 13 |
постоянный участник
Сейчас нет на сайте
| -Mikle- посмотри у меня красивей
http://ifolder.ru/27923711
Я так понял можно анализировать данные: Pos,Spd,Frc ? А то я думал только Frc тудым-сюдым вилять
На твоём видно, что у тебя идёт расчёт - если два колеса на Земле, а потом у заднего колеса тянуть пружины.
TimKruz, теперь ошибки нет .
Видео 12700
Раз уж занялся игростроем, то умей и имей: 1) знание иностранного языка и понимание того, что делаешь 2) программы для игростроя, а так же для обработки текстур, моделей, звуков 3) много свободного времени
Сообщение отредактировал WTALKER - Понедельник, 02 Января 2012, 17:04 |
|
| |
-Mikle- | Дата: Понедельник, 02 Января 2012, 17:48 | Сообщение # 14 |
Изобретатель велосипедов
Сейчас нет на сайте
| Quote (Apati) вот этот запустится? Да, работает - 16846. Quote (WTALKER) посмотри у меня красивей Оригинально выглядит, не подумал бы, что так можно двигаться. 12700. На GameDev Zefick сделал 35553: http://dl.dropbox.com/u/54090777/robot_35553.dll Quote (WTALKER) Я так понял можно анализировать данные: Pos,Spd,Frc ? Конечно можно, для того они и даны.
Сообщение отредактировал -Mikle- - Понедельник, 02 Января 2012, 17:49 |
|
| |
Apati | Дата: Понедельник, 02 Января 2012, 17:51 | Сообщение # 15 |
заслуженный участник
Сейчас нет на сайте
| Quote (-Mikle-) WTALKER, нормально, но у меня больше: robot.dll - 27227. Немного улучшил твой алгоритм - теперь 40489 (http://rghost.ru/35709675)
|
|
| |
-Mikle- | Дата: Понедельник, 02 Января 2012, 19:05 | Сообщение # 16 |
Изобретатель велосипедов
Сейчас нет на сайте
| Предлагаю приз - тому, кто до 23-59-59 6.01.2012 покажет РАБОТОСПОСОБНУЮ dll с лучшим результатом, каждый участник этого обсуждения плюсует в репу. dll со стороны не в счёт.
|
|
| |
Apati | Дата: Понедельник, 02 Января 2012, 23:11 | Сообщение # 17 |
заслуженный участник
Сейчас нет на сайте
| 43595
|
|
| |
Apati | Дата: Вторник, 03 Января 2012, 18:19 | Сообщение # 18 |
заслуженный участник
Сейчас нет на сайте
| Новый рекорд! 47852
|
|
| |
PBPROG | Дата: Среда, 04 Января 2012, 02:22 | Сообщение # 19 |
постоянный участник
Сейчас нет на сайте
| Мне пока что рекорд побить не удалось, добился только 42592. Но это не самый худший результат. DLL. http://depositfiles.com/files/xz4uy7qy6 Кстати, из всех представленных у меня получилась самая компактная DLLка, всего 3 КБ.
|
|
| |
-Mikle- | Дата: Среда, 04 Января 2012, 11:07 | Сообщение # 20 |
Изобретатель велосипедов
Сейчас нет на сайте
| PBPROG, залей на нормальный хостинг, например: http://www.188.ru/ http://narod.yandex.ru/ А то ждёшь минуту, смотришь рекламу, закрываешь попап окна - а потом видишь капчу, которую не можешь прочесть. На GameDev, вроде как, побили порог 50к.
|
|
| |
|