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

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

Проект

Песочница

Раунд 1

Раунд 2

Финал

Песочница (на 19 октября 2014 г.)

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

3 ноября 19:39: alevlaber написал комментарий в посте Закрытие Russian AI Cup 2014
3 ноября 19:36: andrey.chernov написал комментарий в посте Закрытие Russian AI Cup 2014
3 ноября 19:33: alevlaber написал комментарий в посте Закрытие Russian AI Cup 2014
3 ноября 19:30: andrey.chernov написал комментарий в посте Закрытие Russian AI Cup 2014
3 ноября 19:26: alevlaber написал комментарий в посте Закрытие Russian AI Cup 2014
1 октября 13:18: andrey.chernov написал комментарий в посте Закрытие Russian AI Cup 2014
29 сентября 10:26: alevlaber написал комментарий в посте Закрытие Russian AI Cup 2014
4 сентября 14:57: steleal написал комментарий в посте Закрытие Russian AI Cup 2014
4 сентября 14:56: steleal написал комментарий в посте Закрытие Russian AI Cup 2014
4 сентября 08:24: zavod написал комментарий в посте Закрытие Russian AI Cup 2014

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

 

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

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

Разумеется, для участия необходимо зарегистрироваться. Мы рекомендуем пользоваться авторизацией через социальные сети (поддерживаются Mail.Ru, Одноклассники, ВКонтакте, Google, Facebook, Twitter, OpenID и Яндекс). Также мы убедительно просим всех участников использовать достоверные и полные данные о себе. Загружайте аватарки — всем интересно знать противников в лицо.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

import model.*;

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

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

public void move(Hockeyist self, World world, Game game, Move move) {
    move.setSpeedUp(1.0D);
    move.setAction(ActionType.STRIKE);
}

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

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

import model.*;

import static java.lang.StrictMath.PI;
import static java.lang.StrictMath.abs;

public final class MyStrategy implements Strategy {
    private static final double STRIKE_ANGLE = 1.0D * PI / 180.0D;

    @Override
    public void move(Hockeyist self, World world, Game game, Move move) {
        if (world.getPuck().getOwnerHockeyistId() == self.getId()) {
            Player opponentPlayer= world.getOpponentPlayer();

            double netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
            double netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());

            double angleToNet = self.getAngleTo(netX, netY);
            move.setTurn(angleToNet);

            if (abs(angleToNet) < STRIKE_ANGLE) {
                move.setAction(ActionType.STRIKE);
            }
        } else {
            move.setSpeedUp(1.0D);
            move.setTurn(self.getAngleTo(world.getPuck()));
            move.setAction(ActionType.TAKE_PUCK);
        }
    }
}

Сперва проверим, владеет ли текущий хоккеист шайбой. Для этого получаем идентификатор владельца шайбы и сравниваем его с идентификатором хоккеиста.

Если результат положительный, мы получаем из мира информацию о противнике и вычисляем координаты центра его ворот netX и netY. Определяем угол до цели и поворачиваемся к ней. Если угол стал меньше 1 градуса (константа STRIKE_ANGLE), пора нанести удар! Конечно, это не самый лучший способ определения точности удара, но зато он простой.

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

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

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

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

import model.*;

import static java.lang.StrictMath.*;

public final class MyStrategy implements Strategy {
    private static final double STRIKE_ANGLE = 1.0D * PI / 180.0D;

    @Override
    public void move(Hockeyist self, World world, Game game, Move move) {
        if (self.getState() == HockeyistState.SWINGING) {
            move.setAction(ActionType.STRIKE);
            return;
        }

        if (world.getPuck().getOwnerPlayerId() == self.getPlayerId()) {
            if (world.getPuck().getOwnerHockeyistId() == self.getId()) {
                Player opponentPlayer = world.getOpponentPlayer();

                double netX = 0.5D * (opponentPlayer.getNetBack() + opponentPlayer.getNetFront());
                double netY = 0.5D * (opponentPlayer.getNetBottom() + opponentPlayer.getNetTop());
                netY += (self.getY() < netY ? 0.5D : -0.5D) * game.getGoalNetHeight();

                double angleToNet = self.getAngleTo(netX, netY);
                move.setTurn(angleToNet);

                if (abs(angleToNet) < STRIKE_ANGLE) {
                    move.setAction(ActionType.SWING);
                }
            } else {
                Hockeyist nearestOpponent = getNearestOpponent(self.getX(), self.getY(), world);
                if (nearestOpponent != null) {
                    if (self.getDistanceTo(nearestOpponent) > game.getStickLength()) {
                        move.setSpeedUp(1.0D);
                    } else if (abs(self.getAngleTo(nearestOpponent)) < 0.5D * game.getStickSector()) {
                        move.setAction(ActionType.STRIKE);
                    }
                    move.setTurn(self.getAngleTo(nearestOpponent));
                }
            }
        } else {
            move.setSpeedUp(1.0D);
            move.setTurn(self.getAngleTo(world.getPuck()));
            move.setAction(ActionType.TAKE_PUCK);
        }
    }

    private static Hockeyist getNearestOpponent(double x, double y, World world) {
        Hockeyist nearestOpponent = null;
        double nearestOpponentRange = 0.0D;

        for (Hockeyist hockeyist : world.getHockeyists()) {
            if (hockeyist.isTeammate() || hockeyist.getType() == HockeyistType.GOALIE
                    || hockeyist.getState() == HockeyistState.KNOCKED_DOWN
                    || hockeyist.getState() == HockeyistState.RESTING) {
                continue;
            }

            double opponentRange = hypot(x - hockeyist.getX(), y - hockeyist.getY());

            if (nearestOpponent == null || opponentRange < nearestOpponentRange) {
                nearestOpponent = hockeyist;
                nearestOpponentRange = opponentRange;
            }
        }

        return nearestOpponent;
    }
}

Пропустим пока описание первой проверки (if (self.getState() == …) и перейдём к основному блоку кода (if (world.getPuck().getOwnerPlayerId() == …), частично напоминающему блок из предыдущего примера. Мы проверяем подконтрольность шайбы любому из наших хоккеистов. Для этого получаем идентификатор игрока, владеющего шайбой, и сравниваем его с идентификатором нашего игрока.

При отрицательном результате запускаем уже имеющийся алгоритм подбора шайбы.

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

Если да, то запускаем уже имеющийся алгоритм удара по воротам с двумя небольшими модификациями. Мы сравниваем нашу Y-координату со значением netY и в соответствии с этим добавляем или отнимаем от этого значения половину высоты ворот. Таким образом мы получили координаты штанги ворот, дальней от нашего хоккеиста. Удар по ней значительно усложнит вратарю задачу защиты ворот. Помимо этого, действие “удар” меняется на “замах”, что позволит нам через несколько тиков нанести более сильный удар. Возвращаемся к описанию первого блока кода. Он как раз и производит удар, если наш хоккеист сейчас замахивается.

Даже, если шайба находится у другого хоккеиста из нашей команды, это не повод сидеть без дела. С помощью дополнительной функции getNearestOpponent мы можем найти ближайшего хоккеиста из другой команды и “мешать” ему. (Попробуйте разобрать самостоятельно принцип работы этого блока кода и функции getNearestOpponent.)

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



SkyMen

SkyMen

Cinimex

Если я буду коэффициенты записывать в файл, а потом из него считывать - это будет считаться нарушением правил?

08.09.2014 12:38:17
HiVaccessdenied

HiVaccessdenied

ООО "Мера НН"

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

08.09.2014 12:55:15
SkyMen

SkyMen

Cinimex

Спасибо за ответ

08.09.2014 14:26:44
GreenTea

GreenTea

ISDDesign

Вопрос.. Почему не java 8 ?

08.09.2014 14:30:56
sergey_tihon

sergey_tihon

Беларусский ГУ

А почему нету F#?

08.09.2014 15:03:04
admin

admin

Команда Russian AI Cup

georgevolkov

georgevolkov

Paylink

Напишите пример простейшей программы на шарпе, а то у меня ошибка компиляции

Простейшая программа на C# содержится в соответствующем пакете.

08.09.2014 15:31:38
Anarion

Anarion

Бишкек

Anarion

Anarion

Бишкек

c#, запускаю свежескачанный солюшн, падает: An unhandled exception of type ‘System.Net.Sockets.SocketException’ occurred in System.dll Additional information: No connection could be made because the target machine actively refused it

Нужно было запустить local runner

08.09.2014 16:16:22
ky78

ky78

ООО

Можно ли писать две стратегии и запустить их одновременно используя локальный runner? или хотябы запустить со стратегией оппонента которая ничего не делает?

08.09.2014 17:05:19
Kirill_Tim

Kirill_Tim

NRU ITMO

ky78

ky78

ООО

Можно ли писать две стратегии и запустить их одновременно используя локальный runner? или хотябы запустить со стратегией оппонента которая ничего не делает?

Можно. В файле .properties можно изменять типы стратегий, которые будет запускать local runner. При запуски двух локальных стратегий нужно не забыть в файле Runner. изменить порт подключения(увеличить на 1)

08.09.2014 17:36:32
MiXaeL

MiXaeL

МФТИ(ГУ)

Kirill_Tim

Kirill_Tim

NRU ITMO

Можно. В файле .properties можно изменять типы стратегий, которые будет запускать local runner. При запуски двух локальных стратегий нужно не забыть в файле Runner. изменить порт подключения(увеличить на 1)

Неужели в этом году сразу добавили и не нужно реверсить? Чудеса. Еще бы физику раскрыли.

08.09.2014 19:26:27
Garykom

Garykom

Архангельск

MiXaeL

MiXaeL

МФТИ(ГУ)

Неужели в этом году сразу добавили и не нужно реверсить? Чудеса. Еще бы физику раскрыли.

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

Но при этом игра выходит дико скучная с точки зрения зрителя. Может потому что никаких тактик нет с 2-мя хоккеистами, никаких последовательных пасов и т.д.

08.09.2014 22:27:47
Kirill_Tim

Kirill_Tim

NRU ITMO

Будут ли доступны участникам формулы, описывающие физическую модель мира?

08.09.2014 23:23:55
andheroe_12

andheroe_12

DataRobot

Не могу посмотреть бои, отображается только нижняя полоса, браузер - Safari, в Chrome таких проблем нет.

08.09.2014 23:25:25
Cooler

Cooler

Минск

Ух, всего день с открытия, а уже столько вменяемых стратегий играет! Скорострельность впечатляет! :)

08.09.2014 23:36:03
turbotankist

turbotankist

Санкт-Петербург

учу питон и пишу аи на нём! вот загвоздка: при запросе if (world.tick-passtick) > 50 : passtick = world.tick

стратегия падает(((

09.09.2014 16:39:24
amurushkin

amurushkin

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

turbotankist

turbotankist

Санкт-Петербург

учу питон и пишу аи на нём! вот загвоздка: при запросе if (world.tick-passtick) > 50 : passtick = world.tick стратегия падает(((

падает с какой ошибкой?

09.09.2014 17:22:00
superbellermail

Не знаю, куда следует писать, но в коде на С# вылезло два бага: 1) количество хоккеистов в массиве world.Hockeyists необъяснимым образом падает с 6 до 4 иногда (из списка исчезают вратари) 2) world.Puck.OwnerHockeyistId возвращает странные цифры (17, 18, 20), хотя игроков всего шесть

09.09.2014 17:31:55
turbotankist

turbotankist

Санкт-Петербург

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

09.09.2014 17:33:34
kipar

kipar

ООО Доминанта

Не знаю, куда следует писать, но в коде на С# вылезло два бага: 1) количество хоккеистов в массиве world.Hockeyists необъяснимым образом падает с 6 до 4 иногда (из списка исчезают вратари) 2) world.Puck.OwnerHockeyistId возвращает странные цифры (17, 18, 20), хотя игроков всего шесть

Вратари исчезают во второе дополнительное время. id вроде не обязаны быть с единицы.

09.09.2014 17:35:31
superbellermail
kipar

kipar

ООО Доминанта

Вратари исчезают во второе дополнительное время. id вроде не обязаны быть с единицы.

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

09.09.2014 17:46:21
Templar

Templar

НИУ ИТМО

Здесь можно взять Makefile для C++, чтобы при изменениях MyStrategy.cpp не приходилось заново компилировать кучу лишних файлов.

09.09.2014 17:53:48
Wato

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

В примере же есть всё, что нужно for (Hockeyist hockeyist : world.getHockeyists()) { if(world.getPuck().getOwnerHockeyistId() == self.getId()) { … } }

09.09.2014 17:55:32
superbellermail

В примере же есть всё, что нужно for (Hockeyist hockeyist : world.getHockeyists()) { if(world.getPuck().getOwnerHockeyistId() == self.getId()) { … } }

А, понял. По ходу сквозная нумерация.

09.09.2014 18:09:40
JilkaVaSe

public void Move(Hockeyist self, World world, Game game, Move move) { if (self.getState() == HockeyistState.SWINGING) { move.setAction(ActionType.STRIKE); return; } [C#] я новичок. почему у меня Ошибка 1 “Com.CodeGame.CodeHockey2014.DevKit.CSharpCgdk.Model.Hockeyist” не содержит определение для “getState” ?

09.09.2014 20:38:05
Ox1

Ox1

Пермь

Почему compilation.log записывается Unable to find classes\Runner.class , хотя скаченный архив не изменял?

09.09.2014 20:39:16
chapaev28

chapaev28

Белгород

а скорость от отрицательных до положительных значений?? или только положительные?

10.09.2014 2:21:18
dantistus

dantistus

Freelance Web & Graphic Designer

chapaev28

chapaev28

Белгород

а скорость от отрицательных до положительных значений?? или только положительные?

public void setSpeedUp( double speedUp ) Устанавливает ускорение хоккеиста. Ускорение является относительным и должно лежать в интервале от -1.0 до 1.0.

10.09.2014 2:32:45
chapaev28

chapaev28

Белгород

dantistus

dantistus

Freelance Web & Graphic Designer

public void setSpeedUp( double speedUp ) Устанавливает ускорение хоккеиста. Ускорение является относительным и должно лежать в интервале от -1.0 до 1.0.

да, но это ускорение, а не скорость.

10.09.2014 2:35:51
dantistus

dantistus

Freelance Web & Graphic Designer

chapaev28

chapaev28

Белгород

да, но это ускорение, а не скорость.

getSpeedX Возвращает X-составляющую скорости объекта. Ось абсцисс направлена слева направо.

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

10.09.2014 3:01:42
davvol

davvol

БСС

Добрый день! Есть тупой вопрос по Python 2.7 Для создания экземпляра класса Unit, нам нужно в init передать параметры: mass, radius, x, y, speed_x, speed_y, angle, angular_speed Откуда их взять? Не нашел места которое может предоставить эти данные.

10.09.2014 12:51:50
JackOfShadow

JackOfShadow

КвантумСофт

davvol

davvol

БСС

Добрый день! Есть тупой вопрос по Python 2.7 Для создания экземпляра класса Unit, нам нужно в init передать параметры: mass, radius, x, y, speed_x, speed_y, angle, angular_speed Откуда их взять? Не нашел места которое может предоставить эти данные.

Зачем вам создавать юнит? Все юниты и так уже созданы.

10.09.2014 13:28:05
SladeThe

SladeThe

Команда Russian AI Cup

DVS

DVS

здесь может быть Ваша компания! :)

Включите пожалуйста опцию компилятора /unsafe для .NET Благодаря этому расчет столкновений физических тел выполняется в два раза быстрее (но все равно медленнее чем на C++)

Мы запускаем C# в специальной .NET песочнице и не можем контролировать безопасность unsafe кода. Что касается производительности, то очевидно, что в C# этот вопрос стоит не более остро, чем в той же Java или вообще языках с динамической типизацией.

10.09.2014 14:15:17
davvol

davvol

БСС

JackOfShadow

JackOfShadow

КвантумСофт

Зачем вам создавать юнит? Все юниты и так уже созданы.

Если обращаться к методам Unit напрямую, например, Unit.get_angle_to(x, y), то интерпретатор выдает ошибку о том что метод нужно вызывать с экземпляром класса. “unbound method get_angle_to() must be called with Unit instance as first argument (got float instance instead)” Вот я и решил что надо создавать экземпляр предварительно.

10.09.2014 15:34:35
JackOfShadow

JackOfShadow

КвантумСофт

davvol

davvol

БСС

Если обращаться к методам Unit напрямую, например, Unit.get_angle_to(x, y), то интерпретатор выдает ошибку о том что метод нужно вызывать с экземпляром класса. “unbound method get_angle_to() must be called with Unit instance as first argument (got float instance instead)” Вот я и решил что надо создавать экземпляр предварительно.

простейший пример: me.get_angle_to(world.puck)

10.09.2014 15:47:42
tema1_1_2

Хорошо бы в конструкторе MyStrategy иметь доступ к world и game. Для c++ как-то так, например:

MyStrategy(const World &world, const Game &game) { }

10.09.2014 18:38:25
MagAlex

MagAlex

Нижний Новгород

Хорошо бы в конструкторе MyStrategy иметь доступ к world и game. Для c++ как-то так, например: MyStrategy(const World &world, const Game &game) { }

Поддерживаю, но с небольшим замечанием: объект world, наверное нет смысла передавать в конструктор MyStrategy, т.к. его содержимое (да и адрес в памяти) меняются при каждом тике, кроме полей width и height. А вот объект game, однозначно следует использовать в конструкторе и в метод move каждый раз не передавать. При этом напрашивается поля width и height и методы getWidth и getHeight из класса World перенести в класс Game или вообще их выкинуть за ненадобностью :)

10.09.2014 19:13:57
chapaev28

chapaev28

Белгород

ребят а есть какие либо координат поля??? в процентам или статика. синяя линяя, точки вбрасывания и т.д.?

10.09.2014 19:46:39
tema1_1_2
chapaev28

chapaev28

Белгород

ребят а есть какие либо координат поля??? в процентам или статика. синяя линяя, точки вбрасывания и т.д.?

Если ты внимательно посмотришь разделы сайта, то найдешь ссылку на “pdf” документ. Там есть картинки с циферками. ))

10.09.2014 19:51:32
chapaev28

chapaev28

Белгород

Если ты внимательно посмотришь разделы сайта, то найдешь ссылку на “pdf” документ. Там есть картинки с циферками. ))

так там расстановка хоккеистов , а не синей линии и точек вбрасываний. не ?

10.09.2014 19:57:27
imbeat

imbeat

МИЭТ

JackOfShadow

JackOfShadow

КвантумСофт

Зачем вам создавать юнит? Все юниты и так уже созданы.

Например для тестов!

10.09.2014 20:21:09
tema1_1_2
chapaev28

chapaev28

Белгород

так там расстановка хоккеистов , а не синей линии и точек вбрасываний. не ?

Вбрасывание по центру, а синюю линию можно самому разметить, наверное, если что.

10.09.2014 20:29:08
sildc

sildc

СберТех

chapaev28

chapaev28

Белгород

так там расстановка хоккеистов , а не синей линии и точек вбрасываний. не ?

в коде есть набор констант

10.09.2014 20:47:35
m4shell

Есть небольшой вопрос касательно Python-а. Запускаю локальную игру с Empty в качестве противника. В коде хочу проверить владеет ли мой хоккеист шайбой : world.puck.owner_hockeyist_id == me.id Визуально хоккеист моей команды забирает шайбу, однако, такое впечатление, что вышеуказанное сравнение никогда не проходит. Попробовал распечатать в консоле значения… print(world.puck.owner_hockeyist_id) print(me.id)
print(“—————”)

На первом шаге он выдает странное : 17

18

А дальше идут сплошные: -1

17

-1 18

По идее world.puck.owner_hockeyist_id “-1” означает, что шайбой никто не владеет.. но визуально она у моего игрока… Не может ли кто-нибудь подсказать в чем дело?

10.09.2014 20:54:53
m4shell

Хм…. ну или, можно сформулировать вопрос иначе, как узнать владеет твой хоккеист шайбой или нет? ;-)

Python 2.7 если что…

10.09.2014 21:08:13
alladdin

alladdin

МФТИ (ГУ)

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

10.09.2014 21:09:24
alladdin

alladdin

МФТИ (ГУ)

alladdin

alladdin

МФТИ (ГУ)

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

Прошу прощения, это я протупил, извините

10.09.2014 21:11:04
m4shell

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

10.09.2014 21:14:44
mr.antonsilin

mr.antonsilin

ИП Силин

Ребят, нигде не нашел (плохо смотрел?) инфы про трение в игре. Вот летит шайба, по какой формуле уменьшается ее скорость? Или скорость шайбы уменьшается только после столкновения с бортами? То же самое про хоккеиста, его скорость постепенно уменьшается, когда speed_up == 0 ? А когда замахивается?

10.09.2014 22:36:14
DVS

DVS

здесь может быть Ваша компания! :)

mr.antonsilin

mr.antonsilin

ИП Силин

Ребят, нигде не нашел (плохо смотрел?) инфы про трение в игре. Вот летит шайба, по какой формуле уменьшается ее скорость? Или скорость шайбы уменьшается только после столкновения с бортами? То же самое про хоккеиста, его скорость постепенно уменьшается, когда speed_up == 0 ? А когда замахивается?

это закрытая информация: http://russianaicup.ru/forum/index.php?topic=230.0

10.09.2014 23:29:33
tyrus

Было бы круто если бы можно было прогать еще и на js.

10.09.2014 23:37:39
bovykingmail.co

Люди 500 лет назад камни с Пизанской башни кидали, время измеряли, дифференциальное счисление придумали, яблоки на голову ловили - а вам все по-простому: “дайте физику”.

10.09.2014 23:50:46
DVS

DVS

здесь может быть Ваша компания! :)

Люди 500 лет назад камни с Пизанской башни кидали, время измеряли, дифференциальное счисление придумали, яблоки на голову ловили - а вам все по-простому: “дайте физику”.

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

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

11.09.2014 0:30:27
Yaptro

Yaptro

БГУ

Где найти форму обратной связи? Как сообщить разработчикам о баге? У меня такая проблема: на Local Runner стратегия запускается и работает без проблем, при загрузке сайт ругается:

Ваша стратегия «упала» в коротком проверочном бою 2x2. Процесс стратегии непредвиденно завершился на тике 201.

Вывод runner’а в stdout: Program successfully terminated exit code: 239 time consumed: 0.03 sec time passed: 0.61 sec peak memory: 2215936 bytes

Вывод стратегии в stdout: Exception occured: type=EAccessViolation, message=“Access violation”.

Причём тик всегда 201м тике. Как я слышал, короткие игры для теста вообще по 200 тиков, на 201м тике что-то происходит и сайт не принимает стратегию. Потом выяснилось почему – из-за строки MyHockeyists[world.GetHockeyists[i].GetTeammateIndex]:=world.GetHockeyists[i] , где MyHockeyists – мой массив хоккеистов. То есть всё вроде бы нормально, но сайт стратегию не принимает. Объясните, в чём дело?

11.09.2014 1:13:22
LeeT

LeeT

Россия

Yaptro

Yaptro

БГУ

Где найти форму обратной связи? Как сообщить разработчикам о баге? У меня такая проблема: на Local Runner стратегия запускается и работает без проблем, при загрузке сайт ругается: Ваша стратегия «упала» в коротком проверочном бою 2x2. Процесс стратегии непредвиденно завершился на тике 201. Вывод runner’а в stdout: Program successfully terminated exit code: 239 time consumed: 0.03 sec time passed: 0.61 sec peak memory: 2215936 bytes …

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

11.09.2014 2:05:45
Yaptro

Yaptro

БГУ

LeeT

LeeT

Россия

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

Исправил, теперь i меняется только в пределах от 0 до длины случайного массива игроков. Теперь тестирование завершается на 0 тике :)

11.09.2014 2:20:28
prospero78su

prospero78su

ООО "КБК Техника"

Какая ось на серверах? Хотелось бы написать расширение в формате dll или so для python, но что именно нужно делать – не понимаю (нет информации)

11.09.2014 14:13:19
-Frost-

-Frost-

Точка

Можно как-то в локал ранере установить другое время матча?

11.09.2014 15:08:53
davvol

davvol

БСС

JackOfShadow

JackOfShadow

КвантумСофт

простейший пример: me.get_angle_to(world.puck)

Спасибо!

11.09.2014 15:14:05
vladimirzorin

Помогите разобраться. при конвертации строк из примера явы в С++ if (nearestOpponent != null)
Hockeyist nearestOpponent = null; на if (nearestOpponent != NULL)
Hockeyist nearestOpponent = NULL; код не принимается и ошибки компиляции. подскажите, может както по другому в С++ класс взаимодействует с NULL

11.09.2014 15:44:55
hamstergene

“Быстрый старт” для C++ не компилируется под OS X, из-за строчки #include <linux/if_packet.h> !!! Очень иронично для конкурса, где разыгрываются Маки :)

11.09.2014 21:15:57
hamstergene

(в скриптах компиляции жестко прописано -D_LINUX — для исправления надо заменить на -D_DARWIN, или еще лучше — написать нормальный Makefile)

11.09.2014 22:07:30
vladimirzorin

перефразирую свой вопрос. в С++ как проверить имеет ли класс какиенть данные, пустой он или нет. по тех документации строка < if (класс == NULL) > правильна, а здесь не работает. может я чего не допонимаю. подскажите.

12.09.2014 7:30:20
Yom

Yom

Россия

Пишу на С++. Взял стратегию из примера, перевёл с Java на С++, у меня она компилируется. Пытаюсь выслать её - выскакивает ошибка компиляции: ‘model::HockeyistType’ is not a class or namespace как будто не распознаётся namespase “model”. В чём дело, как бороться?

12.09.2014 11:41:41
SladeThe

SladeThe

Команда Russian AI Cup

DVS

DVS

здесь может быть Ваша компания! :)

Снизойдите пожалуйста до ответа, вдруг окажется что я не понимаю основ мирозданья в свои 40 лет?

Объясняю ещё раз. Те средства контроля безопасности, которые мы используем для языков, компилируемых в машинный код, не подходят для C# по многим причинам. Поэтому мы используем для его запуска .NET-песочницу, которая в свою очередь не может контролировать неуправляемый код.

Не нужно писать панические комментарии в разных темах. Это увеличивает время, которое требуется разработчикам на их просмотр и ответ.

12.09.2014 11:54:21
SladeThe

SladeThe

Команда Russian AI Cup

DVS

DVS

здесь может быть Ваша компания! :)

это закрытая информация: http://russianaicup.ru/forum/index.php?topic=230.0

Не вижу ничего закрытого. Исходники Phys2D есть в открытом доступе. Если вы хотите понять работу физике в игре, выписывайте и читайте.

Мы лишь ответили, что не можем предоставить вам физику в виде формул.

12.09.2014 11:57:20
snike

snike

Wargaming

MagAlex

MagAlex

Нижний Новгород

Поддерживаю, но с небольшим замечанием: объект world , наверное нет смысла передавать в конструктор MyStrategy , т.к. его содержимое (да и адрес в памяти) меняются при каждом тике, кроме полей width и height . А вот объект game , однозначно следует использовать в конструкторе и в метод move каждый раз не передавать. При этом напрашивается поля …

Экономия на спичках, даже нет, на атомах от спичек.

12.09.2014 12:12:35
imbeat

imbeat

МИЭТ

Люди, пожалуйста, используйте официальный форум http://russianaicup.ru/forum/index.php?board=4.0, там можно темы создавать, а тут только одна большая простыня комментов.

12.09.2014 12:50:39
SladeThe

SladeThe

Команда Russian AI Cup

LeeT

LeeT

Россия

Что-то там я зарегистрироваться не могу

Сейчас есть проблемы с регистрацией на форуме новых участников. Разбираемся.

12.09.2014 14:27:23
SladeThe

SladeThe

Команда Russian AI Cup

alevlaber

alevlaber

Костанай

В прошлые года администрация периодически чистила эти портянки. Может и в этом году почистит, когда освободится и если попросим)

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

12.09.2014 14:41:49
Valdemar

Valdemar

Университет ИТМО

перефразирую свой вопрос. в С++ как проверить имеет ли класс какиенть данные, пустой он или нет. по тех документации строка < if (класс == NULL) > правильна, а здесь не работает. может я чего не допонимаю. подскажите.

В джаве объекты это ссылки на динамическую память, поэтому проверка и присваивание NULL корректна.

Используй указатель на объект в качестве возвращаемого значения функции и обращайся к нужным полям через селектор по указателю (->).

P.S Возможно не стоит писать стратегию на С++, если не до конца понимаешь указатели и организацию работы с памятью.

12.09.2014 17:01:03
DVS

DVS

здесь может быть Ваша компания! :)

SladeThe

SladeThe

Команда Russian AI Cup

Не вижу ничего закрытого. Исходники Phys2D есть в открытом доступе. Если вы хотите понять работу физике в игре, выписывайте и читайте. Мы лишь ответили, что не можем предоставить вам физику в виде формул.

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

12.09.2014 23:07:08
MagAlex

MagAlex

Нижний Новгород

snike

snike

Wargaming

Экономия на спичках, даже нет, на атомах от спичек.

Так я же с точки зрения архитектуры говорил :)

12.09.2014 23:20:14
algogol

algogol

МФТИ(ГУ)

под маком не компилится http://pastebin.com/KaDy5qKR :[ пробовал убирать -D_LINUX -static ничего не помогло

13.09.2014 1:33:08
alevlaber

alevlaber

Костанай

Игра по мотивам мультфильма)

p.s.:стратегию не осуждаю, кто как хочет, тот так и делает, просто мультик вспомнил

p.p.s: простите за оффтоп

13.09.2014 19:53:08
imbeat

imbeat

МИЭТ

alevlaber

alevlaber

Костанай

Игра по мотивам мультфильма ) p.s.:стратегию не осуждаю, кто как хочет, тот так и делает, просто мультик вспомнил p.p.s: простите за оффтоп

Класс! Спасибо за поднятое настроение с утра!

14.09.2014 12:19:50
dantistus

dantistus

Freelance Web & Graphic Designer

alevlaber

alevlaber

Костанай

Игра по мотивам мультфильма ) p.s.:стратегию не осуждаю, кто как хочет, тот так и делает, просто мультик вспомнил p.p.s: простите за оффтоп

Вот именно для обсуждения таких игр нужно дать возможность комментирования отдельных боев! Администрация, сделайте, пожалуйста! ^_^

14.09.2014 16:12:58
floder

floder

Семипалатинск

Как работает функция getAngleTo() ? У меня при ее вызове перед началом игры (self.getAngleTo(world.getPuck())) - выдает -8.742278012618954E-8

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

14.09.2014 17:22:17
dantistus

dantistus

Freelance Web & Graphic Designer

floder

floder

Семипалатинск

Как работает функция getAngleTo() ? У меня при ее вызове перед началом игры (self.getAngleTo(world.getPuck())) - выдает -8.742278012618954E-8 Хотя по логике должна возвращать 0 , так как все хоккеисты смотрят ровно на шайбу.

e-8 - это же очень-очень мало. Вообще при работе с Double надо сравнивать не с нулем, а с достаточно маленьком числом, потому что всякие там погрешности округления, машинного представления числа и т.д.

14.09.2014 17:30:46
feniks

feniks

Украина

Подскажите как понимать следующие утверждения Базовый шанс равен 150%. Что такое 150% ?

14.09.2014 22:13:13
muodov

Есть ли возможность узнать cooldown? Хочется узнать, получится ли совершить действие, перед тем, как назначить его.

17.09.2014 11:07:24
dimoc

dimoc

Минск

Есть ли возможность узнать cooldown? Хочется узнать, получится ли совершить действие, перед тем, как назначить его.

в документации все есть. Hockeyist.getRemainingCooldownTicks, Hockeyist.getLastActionTick , Game.getDefaultActionCooldownTicks и т.д.

17.09.2014 11:15:53
alevlaber

alevlaber

Костанай

SmileWithSmile

SmileWithSmile

ПФМЛ 239

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

"Создать локальную тестовую игру очень просто: запустите Local runner с помощью соответствующего скрипта запуска (для Windows или *n*x систем), затем запустите свою стратегию из среды разработки (или любым другим удобным вам способом) и смотрите игру."

http://russianaicup.ru/p/localrunner

18.09.2014 7:17:48
sergyn15

Добрый день ,а можно всетаки попросить простенький код на с++ (если кому не трудно),аналогичный java или хотябы кусок ,с захватом шайбы и ударом в нужные ворота. Заранее спасибо!

22.09.2014 21:42:20
vitsum

vitsum

ТПУ

Добрый день ,а можно всетаки попросить простенький код на с++ (если кому не трудно),аналогичный java или хотябы кусок ,с захватом шайбы и ударом в нужные ворота. Заранее спасибо!

Если знаешь язык то в чем проблема переписать? Я переписал с явы переписал на свой язык. Тут же ничего сложного если знаешь си++ , а если не знаешь java, то все равно легко догадаться что там происходит. API у разных языковых пакетов практически одинаков.

22.09.2014 22:14:44