Среда, 18 Декабря 2024, 15:25

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Управление роботом. Миниконкурс.
-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, если дать больше - программа ограничит. Отрицательная сжимает пружину, положительная разжимает.

А, я пропустил. wacko Значит, frc - это и есть сила сжатия пружины?
Сделал DLL-ку по вашему примеру, но программа аварийно завершается (Win7). sad Мой код (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
WTALKERДата: Понедельник, 02 Января 2012, 15:30 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
11281


Раз уж занялся игростроем, то умей и имей:
1) знание иностранного языка и понимание того, что делаешь
2) программы для игростроя, а так же для обработки текстур, моделей, звуков
3) много свободного времени
-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... Что-то влево всё время несёт... sad


WTALKERДата: Понедельник, 02 Января 2012, 16:28 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
-Mikle- посмотри у меня красивей smile

http://ifolder.ru/27923711

Я так понял можно анализировать данные: Pos,Spd,Frc ?
А то я думал только Frc тудым-сюдым вилять biggrin

На твоём видно, что у тебя идёт расчёт - если два колеса на Земле, а потом у заднего колеса тянуть пружины.

TimKruz, теперь ошибки нет wink .

Видео 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. sad
Но это не самый худший результат. smile
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к.
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг