| 
	
		
		
			| Управление роботом. Миниконкурс. |  |  |  | 
| -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к.
 |  |  |  |  |  
 |