Открытое соревнование по программированию искусственного интеллекта

Быстрый старт

Проект

Песочница

Раунд 1

Раунд 2

Финал

Песочница (на 20 декабря 2015 г.)

Последние комментарии

26 апреля 08:52: iSperia написал комментарий в посте Планы по развитию чемпионата
19 января 23:28: DVS написал комментарий в посте Планы по развитию чемпионата
14 января 22:14: MagAlex написал комментарий в посте Песочница
14 января 19:32: Apocalypse написал комментарий в посте Песочница
14 января 10:08: bearf написал комментарий в посте Песочница
12 января 20:07: MrZlodey написал комментарий в посте Планы по развитию чемпионата

Группа ВКонтакте

 

Ниже мы расскажем, как присоединиться к CodeRacing буквально за несколько минут. Кроме того будут освещены некоторые маленькие хитрости и тонкости правил.

Регистрируйтесь

Разумеется, для участия необходимо зарегистрироваться. Начиная с этого года, для всех соревновательных проектов Mail.Ru Group внедрена единая система авторизации it.mail.ru. Мы убедительно просим всех участников использовать достоверные и полные данные о себе. Загружайте аватарки — всем интересно знать противников в лицо.

Подтвердите своё участие

Через несколько минут после регистрации на указанный почтовый адрес придёт ссылка, перейдите по ней для подтверждения своего участия. Если вы зарегистрировались через соц. сеть, то пароль вашего аккаунта не используется. В этом случае, для входа на сайт с использованием пароля, можно пройти процедуру восстановления пароля.

Скачайте языковой пакет

Скачайте пакет для любимого языка программирования со страницы языковые пакеты. Поддерживаются C++, Java, C#, Pascal, Python2, Python3 и Ruby. Распакуйте ZIP-архив в удобное для вас место и откройте проект в любимой IDE. Для некоторых IDE мы уже подготовили проекты. Возможно, вам надо будет настроить некоторые пути.

Скачайте Local runner

Local runner — это специальная версия симулятора игры для участников. Local runner предоставляет вам возможность запускать простые тестовые игры локально на своём компьютере. Подробнее об этом здесь.

Прочитайте документацию

В разделе Правила опубликованы официальные и полные правила, обязательно прочитайте их. Некоторые организационные моменты вы можете найти в описаниях Песочницы и этапов чемпионата (Раунд 1, Раунд 2, Финал).

Отошлите свою стратегию

Это можно сделать на странице отослать. Прежде, чем система примет вашу стратегию, она будет скомпилирована и протестирована в нескольких коротких играх. Если всё в порядке, ваша стратегия автоматически начнёт участвовать в регулярных квалификационных играх Песочницы. Внимательно изучите в секции “На что стоит обратить внимание” различные моменты, вследствие которых ваша стратегия может получить вердикт “Ошибка верификации”. Суммарное количество посылок не ограничено, однако в системе есть ограничения на слишком частую отправку стратегий, а любые попытки дестабилизировать работу системы приведут к дисквалификации. Вы можете написать свою стратегию в произвольном количестве файлов, вам нужно будет лишь упаковать всё необходимое в ZIP-архив и отослать его. Все файлы должны находиться в корне архива, таким образом, например, создание пользовательских пакетов в стратегии на Java недопустимо. Помните, что в стартовом пакете вы можете менять только файл MyStrategy.${ext} (где ${ext} — расширение используемого вами языка), и даже если вы измените какой-то другой файл и тоже приложите его в архив, всё равно при тестировании он будет заменён на стандартный.

Что может помочь вам

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

На что стоит обратить внимание

  • запрещается взаимодействие с сетью, файловой системой и другими ресурсами, кроме оперативной памяти и текущего каталога, нарушители будут дисквалифицированы;
  • процессорное время работы вашей стратегии достаточно сильно ограничено (точные сведения вы можете найти в документации);
  • запускаемая стратегия не должна использовать более 256 мегабайт оперативной памяти (в это количество включается вся память, используемая запускаемым процессом);
  • если ваша стратегия превышает ограничение по времени или памяти, а также в случае ошибок исполнения (например, неожиданное падение), она перестаёт участвовать в этой игре, при этом как бы “замораживается”, то есть ваши очки не обнуляются;
  • стратегия каждого участника запускается в отдельном процессе, при этом для каждого кодемобиля создаётся отдельный экземпляр класса MyStrategy, для обмена информацией между кодемобилями вы можете использовать статические поля или глобальные переменные.

Напишем простую стратегию на Java

Простейшая стратегия ничего не делает и никуда не едет (в этом можно убедиться, отослав код в систему):

import model.*;

public final class MyStrategy implements Strategy {
    @Override
    public void move(Car self, World world, Game game, Move move) {
    }
}

Теперь заставим кодемобиль просто ехать вперед с максимальной скоростью и одновременно постоянно использовать различные расходники. Метод move примет вид:

public void move(Car self, World world, Game game, Move move) {
    move.setEnginePower(1.0D);
    move.setThrowProjectile(true);
    move.setSpillOil(true);
}

Мы устанавливаем кодемобилю режим работы двигателя «полный вперёд» и одновременно используем имеющиеся у нас метательные снаряды и канистры с мазутом. Режим работы двигателя является относительной величиной и должен находиться в интервале от -1.0 до 1.0. Значения, выходящие за данный интервал будут приведены к ближайшей его границе. Для каждого типа расходников имеется некоторая задержка (“cooldown”), в течение которой кодемобиль не может использовать расходник этого типа, однако нам не обязательно это учитывать: если кодемобиль не имеет таких расходников или не может совершить действие, инструкция просто будет проигнорирована.

Теперь напишем более сложный код. Гоночная трасса разделена на квадратные области — тайлы. Известно, что прохождение круга трассы засчитывается, если наш кодемобиль посетил все ключевые тайлы (“waypoints”) в определённом порядке. Пусть наш кодемобиль получает координаты следующего ключевого тайла и едет туда.

import model.Car;
import model.Game;
import model.Move;
import model.World;

import static java.lang.StrictMath.*;

public final class MyStrategy implements Strategy {
    @Override
    public void move(Car self, World world, Game game, Move move) {
        double nextWaypointX = (self.getNextWaypointX() + 0.5D) * game.getTrackTileSize();
        double nextWaypointY = (self.getNextWaypointY() + 0.5D) * game.getTrackTileSize();

        double angleToWaypoint = self.getAngleTo(nextWaypointX, nextWaypointY);
        double speedModule = hypot(self.getSpeedX(), self.getSpeedY());

        move.setWheelTurn(angleToWaypoint * 32.0D / PI);
        move.setEnginePower(0.75D);

        if (speedModule * speedModule * abs(angleToWaypoint) > 2.5D * 2.5D * PI) {
            move.setBrake(true);
        }
    }
}

Сперва найдём координаты центра тайла, который нам необходимо посетить следующим. Для этого используем размер тайла (game.trackTileSize), а также целочисленные значения — номер строки и номер столбца нужного тайла в прямоугольной матрице тайлов (car.nextWaypointX и car.nextWaypointY). Определяем угол до цели и поворачиваем руль/колёса в необходимом направлении (устанавливаем move.wheelTurn).

Поворот колёс — относительное значение, которое может изменяться в интервале от -1.0 (поворот налево) до 1.0 (поворот направо). Чем больше угол, на который нужно повернуть, тем сильнее мы поворачиваем колёса. Мы использовали эвристические коэффициенты, однако вы можете подобрать более оптимальную формулу.

Затем мы устанавливаем режим работы двигателя 0.75 (движение вперёд на скорости чуть меньше максимальной) для осторожной езды. Разумеется, на трассе нет скоростных ограничений, и любители полихачить могут разогнаться сильнее :)

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

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

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

Попробуем написать стратегию, которая это исправит:

import model.Car;
import model.Game;
import model.Move;
import model.World;

import static java.lang.StrictMath.*;

public final class MyStrategy implements Strategy {
    @Override
    public void move(Car self, World world, Game game, Move move) {
        double nextWaypointX = (self.getNextWaypointX() + 0.5D) * game.getTrackTileSize();
        double nextWaypointY = (self.getNextWaypointY() + 0.5D) * game.getTrackTileSize();

        double cornerTileOffset = 0.25D * game.getTrackTileSize();

        switch (world.getTilesXY()[self.getNextWaypointX()][self.getNextWaypointY()]) {
            case LEFT_TOP_CORNER:
                nextWaypointX += cornerTileOffset;
                nextWaypointY += cornerTileOffset;
                break;
            case RIGHT_TOP_CORNER:
                nextWaypointX -= cornerTileOffset;
                nextWaypointY += cornerTileOffset;
                break;
            case LEFT_BOTTOM_CORNER:
                nextWaypointX += cornerTileOffset;
                nextWaypointY -= cornerTileOffset;
                break;
            case RIGHT_BOTTOM_CORNER:
                nextWaypointX -= cornerTileOffset;
                nextWaypointY -= cornerTileOffset;
                break;
            default:
        }

        double angleToWaypoint = self.getAngleTo(nextWaypointX, nextWaypointY);
        double speedModule = hypot(self.getSpeedX(), self.getSpeedY());

        move.setWheelTurn(angleToWaypoint * 32.0D / PI);
        move.setEnginePower(0.75D);

        if (speedModule * speedModule * abs(angleToWaypoint) > 2.5D * 2.5D * PI) {
            move.setBrake(true);
        }
    }
}

Проверим тип следующего ключевого тайла. Если он является поворотом, то мы немного сместим координаты цели. Отправив улучшенную стратегию в систему, легко убедиться, что кодемобиль стал проходить трассу заметно быстрее.

Понятно, что это самая простая стратегия и шансов выиграть у неё немного, но это всего-лишь пример. Удачи!



Tehnar

Tehnar

СПб АУ РАН

Когда приблизительно планируете выложить код физического движка?

Nov 9, 2015 9:05:05 PM
cjey

Не планируют :) Половина интереса пропадет.

Nov 9, 2015 9:25:12 PM
Tehnar

Tehnar

СПб АУ РАН

Не планируют :) Половина интереса пропадет.

Выдержка из правил:

Физика игрового мира основана на движке Notreal2D, специально разработанном для CodeRacing 2015 и других проектов серии Russian AI Cup. Исходный код Notreal2D скоро будет опубликован.

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

Nov 9, 2015 9:35:21 PM
aydin1918

aydin1918

Baku State University

Как отослать свое решение? на компе все работает. На сайте решение не принимает. Заранее Спасибо!

Nov 9, 2015 10:55:03 PM
vitaly.kuliev

vitaly.kuliev

Доктор Тариф

У меня в браузере игры не показываются. появляется окно, скачивается игра, играет музыка, но картинки нет. Нужны какие-то расширения в браузере? chromium, linux mint 17.2

Nov 9, 2015 11:06:02 PM
aydin1918

aydin1918

Baku State University

vitaly.kuliev

vitaly.kuliev

Доктор Тариф

У меня в браузере игры не показываются. появляется окно, скачивается игра, играет музыка, но картинки нет. Нужны какие-то расширения в браузере? chromium, linux mint 17.2

Надо немного подождать. Я “тупо” секунд 30-40 ждал

Nov 9, 2015 11:08:08 PM
Hamster

Hamster

Мелитополь

vitaly.kuliev

vitaly.kuliev

Доктор Тариф

У меня в браузере игры не показываются. появляется окно, скачивается игра, играет музыка, но картинки нет. Нужны какие-то расширения в браузере? chromium, linux mint 17.2

Присоединяюсь к вопросу. Обновил java, попробовал во всех браузерах - безрезультатно

Nov 9, 2015 11:09:06 PM
vitaly.kuliev

vitaly.kuliev

Доктор Тариф

в хромиуме не работает. в фаерфоксе завелось

Nov 9, 2015 11:19:35 PM
SladeThe

SladeThe

Команда Russian AI Cup

aydin1918

aydin1918

Baku State University

Как отослать свое решение? на компе все работает. На сайте решение не принимает. Заранее Спасибо!

Вы переложили файлы Java в другой пакет, поэтому получаете ошибку компиляции.

Nov 9, 2015 11:27:50 PM
SladeThe

SladeThe

Команда Russian AI Cup

vitaly.kuliev

vitaly.kuliev

Доктор Тариф

У меня в браузере игры не показываются. появляется окно, скачивается игра, играет музыка, но картинки нет. Нужны какие-то расширения в браузере? chromium, linux mint 17.2

Расширения не нужны, должно работать “из коробки”. Возможно, у браузеров какие-то проблемы с поддержкой HTML 5 под Linux. Можете посмотреть, в консоли что-то подозрительно красное имеется?

Nov 9, 2015 11:30:24 PM
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

у меня после полминуты ожидания запустилось отображение а с режимом тени не хочет никак. браузер google chrome

уже заработало

Nov 9, 2015 11:33:59 PM
megaterik

megaterik

Белорусский Государственный Университет

vitaly.kuliev

vitaly.kuliev

Доктор Тариф

в хромиуме не работает. в фаерфоксе завелось

не работало в хромиуме, сделал apt-get upgrade для него и все получилось)

Nov 9, 2015 11:50:50 PM
Hamster

Hamster

Мелитополь

у меня под Win7 не работает и через 10 минут ожидания. Скачалось, показало имена игроков и все… ничего не происходит, нагрузки на проц нет.

Nov 10, 2015 12:06:20 AM
ikar

ikar

Команда Russian AI Cup

Hamster

Hamster

Мелитополь

у меня под Win7 не работает и через 10 минут ожидания. Скачалось, показало имена игроков и все… ничего не происходит, нагрузки на проц нет.

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

Nov 10, 2015 12:19:08 AM
vitaly.kuliev

vitaly.kuliev

Доктор Тариф

megaterik

megaterik

Белорусский Государственный Университет

не работало в хромиуме, сделал apt-get upgrade для него и все получилось)

обновил хромиум - все равно не работает

Nov 10, 2015 1:46:16 AM
vitaly.kuliev

vitaly.kuliev

Доктор Тариф

Хочу нарисовать все тайлы для одной из карт. python2. такое чувство, что top и bottom перепутаны местами. Правильно ли я понимаю, что тайл BOTTOM_HEADED_T выглядит, как буква “Т”? Есть рисунки для каждого типа тайлов?

Nov 10, 2015 1:49:18 AM
vitaly.kuliev

vitaly.kuliev

Доктор Тариф

vitaly.kuliev

vitaly.kuliev

Доктор Тариф

Хочу нарисовать все тайлы для одной из карт. python2. такое чувство, что top и bottom перепутаны местами. Правильно ли я понимаю, что тайл BOTTOM_HEADED_T выглядит, как буква “Т”? Есть рисунки для каждого типа тайлов?

похоже путаница TOP и BOTTOM возникла из-за того, что ось У вертикально вниз направлена. В описании мира на рисунках тайлов не указаны оси.

Nov 10, 2015 2:08:11 AM
enot.1.10

enot.1.10

SPb ITMO University

Когда будет опубликован код физического движка?

Nov 10, 2015 2:21:10 AM
modemaizer

modemaizer

ЦИТОВ УФСИН

vitaly.kuliev

vitaly.kuliev

Доктор Тариф

похоже путаница TOP и BOTTOM возникла из-за того, что ось У вертикально вниз направлена. В описании мира на рисунках тайлов не указаны оси.

Виталий, BOTTOM_HEADED_T - это перевернутая Т. То есть голова (HEAD) у этого перекрестка там, где ответвление.

Nov 10, 2015 12:18:08 PM
SladeThe

SladeThe

Команда Russian AI Cup

enot.1.10

enot.1.10

SPb ITMO University

Когда будет опубликован код физического движка?

“Исходный код Notreal2D скоро будет опубликован.” (C) Правила

Nov 10, 2015 1:49:11 PM
enot.1.10

enot.1.10

SPb ITMO University

SladeThe

SladeThe

Команда Russian AI Cup

“Исходный код Notreal2D скоро будет опубликован.” (C) Правила

Хотелось бы знать точнее! Скоро может быть сегодня, а может быть через неделю.

Nov 10, 2015 1:50:58 PM
SladeThe

SladeThe

Команда Russian AI Cup

enot.1.10

enot.1.10

SPb ITMO University

Хотелось бы знать точнее! Скоро может быть сегодня, а может быть через неделю.

Есть небольшая вероятность, что сегодня. Зависит от степени продвижения по другим делам. До окончания бета-теста точно опубликуем.

Nov 10, 2015 1:57:05 PM
imbeat

imbeat

МИЭТ

Как “отдалить камеру” при просмотре игры в браузере (на сайте)? аналог фичи “ctrl+-” в LocalRunner. Есть такое? Еще очень бы хотелось иметь кнопки, по нажатию на которые камера перескакивает по кругу на следующую машину и на предыдущую… что то типа “перейти к следующей машине” и “перейти к предыдущей машине”. Если такое уже есть то какой хоткей?

Nov 10, 2015 10:45:51 PM
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

imbeat

imbeat

МИЭТ

Как “отдалить камеру” при просмотре игры в браузере (на сайте)? аналог фичи “ctrl+-” в LocalRunner. Есть такое? Еще очень бы хотелось иметь кнопки, по нажатию на которые камера перескакивает по кругу на следующую машину и на предыдущую… что то типа “перейти к следующей машине” и “перейти к предыдущей машине”. Если такое уже есть то какой хоткей?

на цифрах от 1 до 4 включается нужная машина

Nov 10, 2015 10:54:53 PM
ikar

ikar

Команда Russian AI Cup

imbeat

imbeat

МИЭТ

Как “отдалить камеру” при просмотре игры в браузере (на сайте)? аналог фичи “ctrl+-” в LocalRunner. Есть такое? Еще очень бы хотелось иметь кнопки, по нажатию на которые камера перескакивает по кругу на следующую машину и на предыдущую… что то типа “перейти к следующей машине” и “перейти к предыдущей машине”. Если такое уже есть то какой хоткей?

Возможность приближения/отдаления камеры в плеере на сайте будет добавлена в скором времени. Так же добавим хоткей для переключения камеры на следующую машинку. Сейчас переключаться между машинками можно с помощью цифр на клавиатуре 1-4, управлять камерой с помощью WASD.

Nov 10, 2015 10:56:20 PM
Hamster

Hamster

Мелитополь

ikar

ikar

Команда Russian AI Cup

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

Ничего не поменялось. Пробовал с трех разных компьютеров http://i003.radikal.ru/1511/c8/18db9bfb727c.jpg

Nov 10, 2015 11:04:43 PM
ikar

ikar

Команда Russian AI Cup

Hamster

Hamster

Мелитополь

Ничего не поменялось. Пробовал с трех разных компьютеров http://i003.radikal.ru/1511/c8/18db9bfb727c.jpg

Вы уверены что ваш компьютер и браузер поддерживают WebGL?

Nov 10, 2015 11:12:46 PM
Hamster

Hamster

Мелитополь

ikar

ikar

Команда Russian AI Cup

Вы уверены что ваш компьютер и браузер поддерживают WebGL?

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

Nov 10, 2015 11:33:09 PM
ikar

ikar

Команда Russian AI Cup

ikar

ikar

Команда Russian AI Cup

Возможность приближения/отдаления камеры в плеере на сайте будет добавлена в скором времени. Так же добавим хоткей для переключения камеры на следующую машинку. Сейчас переключаться между машинками можно с помощью цифр на клавиатуре 1-4, управлять камерой с помощью WASD.

Добавлена возможность зума камеры, перехода к следующей машинке по хоткею, а также теперь перед запуском плеера проверяется поддерживается ли у вас WebGL.

Nov 11, 2015 2:10:20 AM
ViktorM

ViktorM

NVidia

Просмотр игр не открывается у меня на компьютере. Браузер хром. Получаю сообщение - You graphic card seems doesn’t seem to support WebGL. Карта у меня не доиcторическая - Titan X. Как пофиксить эту проблему?

Nov 11, 2015 11:41:36 AM
ViktorM

ViktorM

NVidia

Включение поддержки WebGL в браузере не помогает.

Nov 11, 2015 11:47:03 AM
ikar

ikar

Команда Russian AI Cup

ViktorM

ViktorM

NVidia

Включение поддержки WebGL в браузере не помогает.

Удостоверьтесь, что у вас установленны драйвера. Проверить WebGL можно по ссылке http://get.webgl.org/

Nov 11, 2015 12:02:43 PM
ViktorM

ViktorM

NVidia

ikar

ikar

Команда Russian AI Cup

Удостоверьтесь, что у вас установленны драйвера. Проверить WebGL можно по ссылке http://get.webgl.org/

По вашей ссылке я получил сообщение:

Hmm. While your browser seems to support WebGL, it is disabled or unavailable. If possible, please ensure that you are running the latest drivers for your video card.

Драйвер у меня самый новый. Да и даже если бы драйвер был и месячной давности, всё равно должно работать в теории.

Nov 11, 2015 12:22:10 PM
ViktorM

ViktorM

NVidia

ikar

ikar

Команда Russian AI Cup

Удостоверьтесь, что у вас установленны драйвера. Проверить WebGL можно по ссылке http://get.webgl.org/

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

Nov 11, 2015 12:23:52 PM
Spun

Spun

Москва

В случае если не работает WebGL часто помогает включение экспериментальной поддержки. В хроме в адресной строке chrome://flags. Там -> Override software rendering list. (Переопределить программный список рендеринга) Но в этом случае никто не застрахован от ошибок и артефактов.

Nov 11, 2015 12:29:23 PM
marshrutchik

Запускаю начальный проект для python2 без модификаций, при отправке стратегии показывает “ошибка верификации”

При запуске repeater с токеном получаю java.io.FileNotFoundException

Nov 17, 2015 8:42:42 AM
render1980

render1980

Moscow

Не совсем понял, почему в тестовом примере происходит следующее.

Движение происходит по часовой стрелке. Допустим, экземпляр Car находится в определенном тайле. Следующий по ходу движения - тайл типа LEFT_TOP_CORNER. По идее, мы должны найти координаты тайла с типом LEFT_TOP_CORNER и сделать следующее: увеличить значение nextWaypointX на значение cornerTileOffset (т к движение по часовой вправо) и УМЕНЬШИТЬ значение nextWaypointY на значение cornerTileOffset, т к вертикальная ось идет сверху вниз (здесь подразумевается уменьшение координаты Y.

Таким образом, разве не будет коректным:

switch (world.getTilesXY()[self.getNextWaypointX()][self.getNextWaypointY()]) {
        case LEFT_TOP_CORNER:
            nextWaypointX += cornerTileOffset;
            nextWaypointY -= cornerTileOffset;
            break;
        case RIGHT_TOP_CORNER:
            nextWaypointX += cornerTileOffset;
            nextWaypointY += cornerTileOffset;
            break;
        case LEFT_BOTTOM_CORNER:
            nextWaypointX -= cornerTileOffset;
            nextWaypointY -= cornerTileOffset;
            break;
        case RIGHT_BOTTOM_CORNER:
            nextWaypointX -= cornerTileOffset;
            nextWaypointY += cornerTileOffset;
            break;
        default:
    }

?

В приведенном же примере рассчет будет корректен, если смотреть на текущий порядок тайла по X и Y:

switch (world.getTilesXY()[(int)(self.getX() / game.getTrackTileSize())]
[(int)(self.getY() / game.getTrackTileSize())]) {
case LEFT_TOP_CORNER:
    nextWaypointX += cornerTileOffset;
    nextWaypointY += cornerTileOffset;
    break;
case RIGHT_TOP_CORNER:
    nextWaypointX -= cornerTileOffset;
    nextWaypointY += cornerTileOffset;
    break;
case LEFT_BOTTOM_CORNER:
    nextWaypointX += cornerTileOffset;
    nextWaypointY -= cornerTileOffset;
    break;
case RIGHT_BOTTOM_CORNER:
    nextWaypointX -= cornerTileOffset;
    nextWaypointY -= cornerTileOffset;
    break;
default:

}

Или где я ошибаюсь ?

Nov 17, 2015 8:08:08 PM
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

оба варианта корректны, просто поворачивать будут по-разному

Nov 17, 2015 8:25:09 PM
render1980

render1980

Moscow

amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

оба варианта корректны, просто поворачивать будут по-разному

Да, но при движении к тайлу с типом LEFT_TOP_CORNER необходимо поворачивать направо (иначе произойдет столкновение с краем дороги). А поворот направо будет возможен за счет приращения по X и уменьшения Y (т е вторая точка хорды должна находиться выше и правее при движении по часовой стрелке для данного случая). Угол поворота колес при этом должен быть от 0 до 90.

Nov 17, 2015 8:45:45 PM
mixei4

mixei4

КГУ

Изначально машина двигалась к центру тайла. То есть точка притяжения машины - центр тайла. Код switch на поворотных тайлах смещает точку притяжения ближе к апексу поворота. Поэтому для LEFT_TOP_CORNER смещать надо вправо и вниз независимо от направления движения или ещё чего.

Nov 17, 2015 9:06:51 PM
Ilya32167

Как узнать координаты машинки? self.X, self.Y что-то не то показывают.

Nov 17, 2015 9:40:06 PM
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

render1980

render1980

Moscow

Да, но при движении к тайлу с типом LEFT_TOP_CORNER необходимо поворачивать направо (иначе произойдет столкновение с краем дороги). А поворот направо будет возможен за счет приращения по X и уменьшения Y (т е вторая точка хорды должна находиться выше и правее при движении по часовой стрелке для данного случая). Угол поворота колес при этом должен быть от 0 до 90.

вообще то если ехать в обратную сторону, то поворот будет уже налево

Nov 17, 2015 9:51:01 PM
keltanas

keltanas

Sperasoft

render1980

render1980

Moscow

Да, но при движении к тайлу с типом LEFT_TOP_CORNER необходимо поворачивать направо (иначе произойдет столкновение с краем дороги). А поворот направо будет возможен за счет приращения по X и уменьшения Y (т е вторая точка хорды должна находиться выше и правее при движении по часовой стрелке для данного случая). Угол поворота колес при этом должен быть от 0 до 90.

Если ты такой умный, где результаты твои? Мм?..

Nov 18, 2015 5:51:39 AM
render1980

render1980

Moscow

mixei4

mixei4

КГУ

Изначально машина двигалась к центру тайла. То есть точка притяжения машины - центр тайла. Код switch на поворотных тайлах смещает точку притяжения ближе к апексу поворота. Поэтому для LEFT_TOP_CORNER смещать надо вправо и вниз независимо от направления движения или ещё чего.

Да, это так. Я уже сам понял, что ошибся. Спасибо.

Nov 18, 2015 12:17:21 PM
danmerey

danmerey

niceplay games

Про Local Runner добавили пункт, молодцы! Теперь народ быстрее сможет освоиться :)

Nov 18, 2015 6:44:28 PM
artur0513

artur0513

Москва

А можно ли найти координаты ближайшего бонуса?

Nov 18, 2015 7:12:53 PM
Valdemar

Valdemar

СПбГУТ им. Бонч-Бруевича

artur0513

artur0513

Москва

А можно ли найти координаты ближайшего бонуса?

Конечно. Получаем все бонусы, перебираем в цикле и определяем ближайший.

Nov 18, 2015 8:59:46 PM
artur0513

artur0513

Москва

Точно! Спасибо! Я как-то немного туплю)))

Nov 19, 2015 3:07:31 PM
oldoldspice

oldoldspice

Таврическая Академия Крымского Федерального Университета

Где можно (и можно ли вообще) посмотреть список названий всех трасс в песочнице?

Nov 19, 2015 11:39:47 PM
Hamster

Hamster

Мелитополь

Возможно ли определить причину по которой стратегия была посчитана “павшей”? Проход в репитере не показал каких-либо исключений, потребление процессом памяти небольшое, т.е. скорее всего сняли по ограничению на процессорное время, но как убедиться в этом?

Nov 19, 2015 11:44:49 PM
SladeThe

SladeThe

Команда Russian AI Cup

Hamster

Hamster

Мелитополь

Возможно ли определить причину по которой стратегия была посчитана “павшей”? Проход в репитере не показал каких-либо исключений, потребление процессом памяти небольшое, т.е. скорее всего сняли по ограничению на процессорное время, но как убедиться в этом?

На странице игры кликните на значок языка программирования рядом с вашей стратегией.

Nov 19, 2015 11:49:30 PM
Hamster

Hamster

Мелитополь

SladeThe

SladeThe

Команда Russian AI Cup

На странице игры кликните на значок языка программирования рядом с вашей стратегией.

Спасибо, помогло

Nov 19, 2015 11:58:04 PM
TongoHiti

TongoHiti

СберТех

SladeThe

SladeThe

Команда Russian AI Cup

На странице игры кликните на значок языка программирования рядом с вашей стратегией.

Стратегия непредвиденно завершается. Кликаю на значок языка программирования. Вижу такое сообщение:

Процесс стратегии непредвиденно завершился на тике 563.

Вывод runner'а в stdout:
Program successfully terminated
  exit code:    11
  time consumed: 0.70 sec
  time passed:  5.98 sec
  peak memory:  116764672 bytes

Что означает exit code 11? При прогоне в репитере ничего подозрительного не вижу, стратегия работает нормально, после 563 тика раннер закрывает сокет и завершается.

Вдогонку: что означает time passed / time consumed? Значение 5.98 здесь как трактовать?

Nov 20, 2015 3:29:28 AM
AntonK

AntonK

Харьков

Сделайте, пожалуйста, вывод версии рядом с игроком при просмотре игры на сайте. Что бы играя с собой другими версиями и сравнивая, вообще не понятно какая из машинок под какой ревизией шла ((. Исправьте пожалуйста.

Nov 20, 2015 4:01:16 AM
Hohol

Hohol

Maxifier

AntonK

AntonK

Харьков

Сделайте, пожалуйста, вывод версии рядом с игроком при просмотре игры на сайте. Что бы играя с собой другими версиями и сравнивая, вообще не понятно какая из машинок под какой ревизией шла ((. Исправьте пожалуйста.

Когда создаешь бой, перечисляешь игроков в том же порядке, в каком они будут расположены на старте. Если, расставлять их, к примеру, всегда по возрастанию версии, то даже запоминать ничего не надо.
Просто я подозреваю, что многим эта фича не нужна, а UI чуть-чуть загромождать будет.

Nov 20, 2015 8:29:31 AM
dimir

dimir

СПбГЭТУ (ЛЭТИ)

oldoldspice

oldoldspice

Таврическая Академия Крымского Федерального Университета

Где можно (и можно ли вообще) посмотреть список названий всех трасс в песочнице?

открываешь localrunner.jar как архив, там в папка Maps лежат все карты, от default до map012. Их в блокноте посмотреть можно. Только LocalRunner самый последний с сайта бери

Nov 20, 2015 9:11:32 AM
Vergiliy

Vergiliy

ДГТУ

vitaly.kuliev

vitaly.kuliev

Доктор Тариф

У меня в браузере игры не показываются. появляется окно, скачивается игра, играет музыка, но картинки нет. Нужны какие-то расширения в браузере? chromium, linux mint 17.2

Сбросить куки и кеш в браузере.

Nov 20, 2015 9:55:10 AM
artur0513

artur0513

Москва

getCars - это список кодемобилей в случайном порядке?

Nov 20, 2015 11:52:03 AM
alevlaber

alevlaber

Костанай

artur0513

artur0513

Москва

getCars - это список кодемобилей в случайном порядке?

Да. Каждый тик в случайном порядке возвращает. И пересоздает, так что ссылку на машину между тиками не получится сохранить. МОжете использовать car.getId() , чтобы запомнить

Nov 20, 2015 11:56:46 AM
artur0513

artur0513

Москва

Точно не знаю, возможно у тебя было использовано слишком много памяти на программу. Проверь, нет ли у тебя циклов типа “пока”, у меня из за них крашится стратегия

Nov 20, 2015 11:58:15 AM
artur0513

artur0513

Москва

alevlaber

alevlaber

Костанай

Да. Каждый тик в случайном порядке возвращает. И пересоздает, так что ссылку на машину между тиками не получится сохранить. МОжете использовать car.getId() , чтобы запомнить

Спасибо

Nov 20, 2015 11:59:25 AM
artur0513

artur0513

Москва

И ещё один вопрос, в игровом мире углы измеряются в радианах?

Nov 20, 2015 12:39:43 PM
griboedov

griboedov

Севастополь

artur0513

artur0513

Москва

И ещё один вопрос, в игровом мире углы измеряются в радианах?

да от -пи до +пи

Nov 20, 2015 1:03:41 PM
Jysed12

Jysed12

Krasnodar

вопрос: есть ли положение чужих машинок, или как получить доступ к совоим хотяб

Nov 20, 2015 1:52:51 PM
SladeThe

SladeThe

Команда Russian AI Cup

TongoHiti

TongoHiti

СберТех

Стратегия непредвиденно завершается. Кликаю на значок языка программирования. Вижу такое сообщение: Процесс стратегии непредвиденно завершился на тике 563. Вывод runner’а в stdout: Program successfully terminated exit code: 11 time consumed: 0.70 sec time passed: 5.98 sec peak memory: 116764672 bytes …

Exit code 11 означает, что ваша стратегия сгенерировала исключение и упала. Time consumed — использованное процессорное время, time passed — время жизни процесса вашей стратегии.

Nov 20, 2015 2:23:06 PM
TongoHiti

TongoHiti

СберТех

SladeThe

SladeThe

Команда Russian AI Cup

Exit code 11 означает, что ваша стратегия сгенерировала исключение и упала. Time consumed — использованное процессорное время, time passed — время жизни процесса вашей стратегии.

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

Nov 20, 2015 2:50:19 PM
SladeThe

SladeThe

Команда Russian AI Cup

TongoHiti

TongoHiti

СберТех

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

К сожалению, подобная функциональность доступна только для верификационных игр.

  1. Это дополнительная мера безопасности, чтобы стратегия не могла вывести какую-то информацию о системе или, что хуже, о стратегиях соперников.
  2. С другой стороны, это не создаёт особого преимущества для конкретных языков программирования. Например, в C++ вообще нет никакого stacktrace.

Как workaround, вы можете обернуть логику move в глобальный try-catch, и в зависимости от полученной ошибки, завершать программу с разными статусами.

Nov 20, 2015 3:04:48 PM
TongoHiti

TongoHiti

СберТех

SladeThe

SladeThe

Команда Russian AI Cup

К сожалению, подобная функциональность доступна только для верификационных игр. Это дополнительная мера безопасности, чтобы стратегия не могла вывести какую-то информацию о системе или, что хуже, о стратегиях соперников. С другой стороны, это не создаёт особого преимущества для конкретных языков программирования. Например, в C++ вообще нет никакого stacktrace. …

Понятно, спасибо.

Nov 20, 2015 4:02:56 PM
artur0513

artur0513

Москва

griboedov

griboedov

Севастополь

да от -пи до +пи

32.0D / PI а в такой записи что будет означать 32 D , которые мы делим на PI

Nov 20, 2015 10:28:58 PM
GLAUBEROV

GLAUBEROV

Уфа

можно ли в класс MyStrategy, добавлять поля?

Nov 21, 2015 7:19:52 PM
amurushkin

amurushkin

ХНУРЭ (бывш. ХИРЭ, ХТУРЭ)

GLAUBEROV

GLAUBEROV

Уфа

можно ли в класс MyStrategy, добавлять поля?

конечно

Nov 21, 2015 8:33:23 PM
art926

art926

ОмГТУ

Очень интересует вот какой вопрос - доступны ли для MyStrategy какие либо функции для отрисовки примитивов на карте? Например, если я вычисляю кривую движения и хочу ее отобразить на карте (для себя, в тестовом режиме). Или просто подсветить очередной waypoint, или любую другую точку. Это было бы очень кстати.

Nov 25, 2015 1:40:10 AM
art926

art926

ОмГТУ

Еще вопрос - можно ли пользоваться сторонними библиотеками? Например Qt (без сигнал/слотов и qApp, конечно).

Nov 25, 2015 1:41:49 AM
Dxoid

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

Nov 26, 2015 3:50:42 PM
sildc

sildc

ActionPay.ru

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

да, по чекпоинтам строить свои пути

Nov 26, 2015 4:26:14 PM
ColorPrint

ColorPrint

ВолгГТУ

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

Nov 26, 2015 10:29:00 PM
Wierus

Wierus

Череповец

ColorPrint

ColorPrint

ВолгГТУ

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

Да, в открытом виде таких данных в игре нет. Чтобы заранее узнать, в которую сторону поворачивать, нужно строить маршрут от текущего положения до следующего вэйпоинта, используя данные массивов World.getTilesXY() и World.getWaypoints( ).

Nov 26, 2015 11:30:04 PM
Findz

Findz

Калининград

Рассчитываю угол поворота на следующем вейпоинте.В консоль пишу этот угол.Там чётко -1. Авто поворачивает и в определённый момент(редко) тупо резко поворачивает в другую сторону. Причём в консоле угол все равно -1,да и не может он поменяться ибо поворот ещё не закончен. render-to-screen-sync включен.

Я так понимаю это баг? Ибо у меня нету предположения почему это происходит.

Nov 27, 2015 12:57:09 AM
Vark

Vark

Черкассы

getCarWidth возвращает 210, а getCarHeight возвращает 140. Т.е. ширина больше высоты.

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

Nov 28, 2015 2:04:53 PM
SKolotienko

SKolotienko

ABBYY

width - измерение вдоль оси X, height - измерение вдоль оси Y при угле равным 0 (т.е. когда автомобиль смотрит вдоль оси X) всё норм.

Nov 28, 2015 2:05:51 PM
Vark

Vark

Черкассы

SKolotienko

SKolotienko

ABBYY

width - измерение вдоль оси X, height - измерение вдоль оси Y при угле равным 0 (т.е. когда автомобиль смотрит вдоль оси X) всё норм.

Ясно. Спасибо. Но вызывает когнитивный диссонанс.

Nov 28, 2015 6:36:49 PM
ColorPrint

ColorPrint

ВолгГТУ

Есть ли способ проверить наличие стены между тайлами?

Dec 1, 2015 9:05:02 PM
AndreaB330

AndreaB330

КНУ им. Т. Шевченко

ColorPrint

ColorPrint

ВолгГТУ

Есть ли способ проверить наличие стены между тайлами?

Да, написать свою функцию проверки, все данные для этого есть в getTilesXY()

Dec 1, 2015 9:36:42 PM
ColorPrint

ColorPrint

ВолгГТУ

AndreaB330

AndreaB330

КНУ им. Т. Шевченко

Да, написать свою функцию проверки, все данные для этого есть в getTilesXY()

getTilesXY() возвращает просто массив тайлов… если между двумя соседними тайлами есть стена - в этом массиве ее нигде не видно вроде :( Т.е. именно когда тонкая стена между соседними тайлами…

Dec 1, 2015 10:29:43 PM
ColorPrint

ColorPrint

ВолгГТУ

AndreaB330

AndreaB330

КНУ им. Т. Шевченко

Да, написать свою функцию проверки, все данные для этого есть в getTilesXY()

Извиняюсь, торможу что-то - по типу тайла это видно )

Dec 1, 2015 10:34:51 PM