Open AI Championship

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

Project

Sandbox

Round 1

Round 2

Finals

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

Recent comments

3 november 19:39: alevlaber wrote comment on post Закрытие Russian AI Cup 2014
3 november 19:33: alevlaber wrote comment on post Закрытие Russian AI Cup 2014
3 november 19:26: alevlaber wrote comment on post Закрытие Russian AI Cup 2014
29 september 10:26: alevlaber wrote comment on post Закрытие Russian AI Cup 2014
4 september 14:57: steleal wrote comment on post Закрытие Russian AI Cup 2014
4 september 14:56: steleal wrote comment on post Закрытие Russian AI Cup 2014
4 september 08:24: zavod wrote comment on post Закрытие Russian AI Cup 2014

VK Group

 

Ниже мы расскажем, как присоединиться к 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

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

Sep 8, 2014 12:38:17 PM
HiVaccessdenied

HiVaccessdenied

ООО "Мера НН"

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

Sep 8, 2014 12:55:15 PM
SkyMen

SkyMen

Cinimex

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

Sep 8, 2014 2:26:44 PM
GreenTea

GreenTea

ISDDesign

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

Sep 8, 2014 2:30:56 PM
sergey_tihon

sergey_tihon

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

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

Sep 8, 2014 3:03:04 PM
admin

admin

Команда Russian AI Cup

georgevolkov

georgevolkov

Paylink

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

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

Sep 8, 2014 3:31:38 PM
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

Sep 8, 2014 4:16:22 PM
ky78

ky78

ООО

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

Sep 8, 2014 5:05:19 PM
Kirill_Tim

Kirill_Tim

NRU ITMO

ky78

ky78

ООО

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

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

Sep 8, 2014 5:36:32 PM
MiXaeL

MiXaeL

МФТИ(ГУ)

Kirill_Tim

Kirill_Tim

NRU ITMO

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

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

Sep 8, 2014 7:26:27 PM
Garykom

Garykom

Архангельск

MiXaeL

MiXaeL

МФТИ(ГУ)

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

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

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

Sep 8, 2014 10:27:47 PM
Kirill_Tim

Kirill_Tim

NRU ITMO

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

Sep 8, 2014 11:23:55 PM
andheroe_12

andheroe_12

DataRobot

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

Sep 8, 2014 11:25:25 PM
Cooler

Cooler

Минск

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

Sep 8, 2014 11:36:03 PM
turbotankist

turbotankist

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

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

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

Sep 9, 2014 4:39:24 PM
amurushkin

amurushkin

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

turbotankist

turbotankist

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

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

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

Sep 9, 2014 5:22:00 PM
superbellermail

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

Sep 9, 2014 5:31:55 PM
turbotankist

turbotankist

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

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

Sep 9, 2014 5:33:34 PM
kipar

kipar

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

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

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

Sep 9, 2014 5:35:31 PM
superbellermail
kipar

kipar

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

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

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

Sep 9, 2014 5:46:21 PM
Templar

Templar

НИУ ИТМО

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

Sep 9, 2014 5:53:48 PM
Wato

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

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

Sep 9, 2014 5:55:32 PM
superbellermail

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

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

Sep 9, 2014 6:09:40 PM
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” ?

Sep 9, 2014 8:38:05 PM
Ox1

Ox1

Пермь

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

Sep 9, 2014 8:39:16 PM
chapaev28

chapaev28

Белгород

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

Sep 10, 2014 2:21:18 AM
dantistus

dantistus

Student

chapaev28

chapaev28

Белгород

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

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

Sep 10, 2014 2:32:45 AM
chapaev28

chapaev28

Белгород

dantistus

dantistus

Student

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

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

Sep 10, 2014 2:35:51 AM
dantistus

dantistus

Student

chapaev28

chapaev28

Белгород

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

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

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

Sep 10, 2014 3:01:42 AM
davvol

davvol

БСС

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

Sep 10, 2014 12:51:50 PM
JackOfShadow

JackOfShadow

КвантумСофт

davvol

davvol

БСС

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

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

Sep 10, 2014 1:28:05 PM
SladeThe

SladeThe

Команда Russian AI Cup

DVS

DVS

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

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

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

Sep 10, 2014 2:15:17 PM
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)” Вот я и решил что надо создавать экземпляр предварительно.

Sep 10, 2014 3:34:35 PM
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)

Sep 10, 2014 3:47:42 PM
tema1_1_2

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

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

Sep 10, 2014 6:38:25 PM
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 или вообще их выкинуть за ненадобностью :)

Sep 10, 2014 7:13:57 PM
chapaev28

chapaev28

Белгород

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

Sep 10, 2014 7:46:39 PM
tema1_1_2
chapaev28

chapaev28

Белгород

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

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

Sep 10, 2014 7:51:32 PM
chapaev28

chapaev28

Белгород

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

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

Sep 10, 2014 7:57:27 PM
imbeat

imbeat

МИЭТ

JackOfShadow

JackOfShadow

КвантумСофт

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

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

Sep 10, 2014 8:21:09 PM
tema1_1_2
chapaev28

chapaev28

Белгород

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

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

Sep 10, 2014 8:29:08 PM
sildc

sildc

Москва

chapaev28

chapaev28

Белгород

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

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

Sep 10, 2014 8:47:35 PM
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” означает, что шайбой никто не владеет.. но визуально она у моего игрока… Не может ли кто-нибудь подсказать в чем дело?

Sep 10, 2014 8:54:53 PM
m4shell

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

Python 2.7 если что…

Sep 10, 2014 9:08:13 PM
alladdin

alladdin

МФТИ (ГУ)

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

Sep 10, 2014 9:09:24 PM
alladdin

alladdin

МФТИ (ГУ)

alladdin

alladdin

МФТИ (ГУ)

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

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

Sep 10, 2014 9:11:04 PM
m4shell

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

Sep 10, 2014 9:14:44 PM
mr.antonsilin

mr.antonsilin

ИП Силин

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

Sep 10, 2014 10:36:14 PM
DVS

DVS

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

mr.antonsilin

mr.antonsilin

ИП Силин

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

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

Sep 10, 2014 11:29:33 PM
tyrus

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

Sep 10, 2014 11:37:39 PM
bovykingmail.co

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

Sep 10, 2014 11:50:46 PM
DVS

DVS

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

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

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

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

Sep 11, 2014 12:30:27 AM
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 – мой массив хоккеистов. То есть всё вроде бы нормально, но сайт стратегию не принимает. Объясните, в чём дело?

Sep 11, 2014 1:13:22 AM
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 …

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

Sep 11, 2014 2:05:45 AM
Yaptro

Yaptro

БГУ

LeeT

LeeT

Мурино

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

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

Sep 11, 2014 2:20:28 AM
prospero78su

prospero78su

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

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

Sep 11, 2014 2:13:19 PM
-Frost-

-Frost-

Точка

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

Sep 11, 2014 3:08:53 PM
davvol

davvol

БСС

JackOfShadow

JackOfShadow

КвантумСофт

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

Спасибо!

Sep 11, 2014 3:14:05 PM
vladimirzorin

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

Sep 11, 2014 3:44:55 PM
hamstergene

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

Sep 11, 2014 9:15:57 PM
hamstergene

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

Sep 11, 2014 10:07:30 PM
vladimirzorin

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

Sep 12, 2014 7:30:20 AM
Yom

Yom

Россия

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

Sep 12, 2014 11:41:41 AM
SladeThe

SladeThe

Команда Russian AI Cup

DVS

DVS

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

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

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

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

Sep 12, 2014 11:54:21 AM
SladeThe

SladeThe

Команда Russian AI Cup

DVS

DVS

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

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

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

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

Sep 12, 2014 11:57:20 AM
snike

snike

Wargaming

MagAlex

MagAlex

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

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

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

Sep 12, 2014 12:12:35 PM
imbeat

imbeat

МИЭТ

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

Sep 12, 2014 12:50:39 PM
SladeThe

SladeThe

Команда Russian AI Cup

LeeT

LeeT

Мурино

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

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

Sep 12, 2014 2:27:23 PM
SladeThe

SladeThe

Команда Russian AI Cup

alevlaber

alevlaber

Костанай

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

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

Sep 12, 2014 2:41:49 PM
Valdemar

Valdemar

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

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

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

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

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

Sep 12, 2014 5:01:03 PM
DVS

DVS

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

SladeThe

SladeThe

Команда Russian AI Cup

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

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

Sep 12, 2014 11:07:08 PM
MagAlex

MagAlex

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

snike

snike

Wargaming

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

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

Sep 12, 2014 11:20:14 PM
algogol

algogol

МФТИ(ГУ)

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

Sep 13, 2014 1:33:08 AM
alevlaber

alevlaber

Костанай

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

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

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

Sep 13, 2014 7:53:08 PM
imbeat

imbeat

МИЭТ

alevlaber

alevlaber

Костанай

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

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

Sep 14, 2014 12:19:50 PM
dantistus

dantistus

Student

alevlaber

alevlaber

Костанай

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

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

Sep 14, 2014 4:12:58 PM
floder

floder

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

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

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

Sep 14, 2014 5:22:17 PM
dantistus

dantistus

Student

floder

floder

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

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

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

Sep 14, 2014 5:30:46 PM
feniks

feniks

Украина

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

Sep 14, 2014 10:13:13 PM
muodov

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

Sep 17, 2014 11:07:24 AM
dimoc

dimoc

Минск

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

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

Sep 17, 2014 11:15:53 AM
alevlaber

alevlaber

Костанай

SmileWithSmile

SmileWithSmile

ПФМЛ 239

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

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

http://russianaicup.ru/p/localrunner

Sep 18, 2014 7:17:48 AM
sergyn15

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

Sep 22, 2014 9:42:20 PM
vitsum

vitsum

ТПУ

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

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

Sep 22, 2014 10:14:44 PM