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

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

Проект

Песочница

Раунд 1

Раунд 2

Финал

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

Специально для удобства разработки стратегий мы опубликовали несколько утилит:

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

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

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

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

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

#include "MyStrategy.h"
using namespace model;

void MyStrategy::Move(Tank self, World world, model::Move& move) {
}

TankType MyStrategy::SelectTank(int tank_index, int team_size) {
    return MEDIUM;
}

Теперь заставим танк просто ехать вперед с максимальной скоростью и одновременно постоянно стрелять. Для этого необходимо установить уровень мощности левой и правой гусеницы. Метод Move примет вид:

void MyStrategy::Move(Tank self, World world, model::Move& move) {
    move.set_left_track_power(1);
    move.set_right_track_power(1);
    move.set_fire_type(PREMIUM_PREFERRED);
}

Строка “move.set_fire_type(PREMIUM_PREFERRED)” означает, что если в наличии есть премиумный снаряд, то он будет использован, а иначе — стандартный. Значение 1 для set_left_track_power и set_right_track_power обозначают “полный вперед” для каждой из гусениц.

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

#include "MyStrategy.h"

#define _USE_MATH_DEFINES
#include <cmath>
#include <vector>

using namespace model;
using namespace std;

const double MIN_ANGLE = M_PI / 180.0; // угол в один градус

void MyStrategy::Move(Tank self, World world, model::Move& move) {
    vector<Tank> all_tanks = world.tanks();                     // получим список всех танков
    double min_angle_to_enemy = 1E20;
    size_t selected_tank = all_tanks.size();
    for(size_t i = 0; i < all_tanks.size(); ++i) {              // перебираем танк из списка
        Tank tank = all_tanks[i];
        if (!tank.teammate()) {                                 // в свои танки стрелять не будем :) 
            double angle_to_enemy = fabs(self.GetTurretAngleTo(tank)); // найдем модуль угла от башни до танка
            if (angle_to_enemy < min_angle_to_enemy) {          // выберем минимум
                min_angle_to_enemy = angle_to_enemy;
                selected_tank = i;
            }
        }
    }

    if (selected_tank != all_tanks.size()) {
        double angle_to_enemy = self.GetTurretAngleTo(all_tanks[selected_tank]); // найдем угол от башни до танка

        if (angle_to_enemy > MIN_ANGLE) {         // если угол сильно положительный
            move.set_turret_turn(1.0);              
        } else if (angle_to_enemy < -MIN_ANGLE) {  // если угол сильно отрицательный
            move.set_turret_turn(-1.0);
        } else {
            move.set_fire_type(PREMIUM_PREFERRED); // если угол невелик, то выстрелим
        }
    }
}

TankType MyStrategy::SelectTank(int tank_index, int team_size) {
    return MEDIUM;
}

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

#include "MyStrategy.h"

#define _USE_MATH_DEFINES
#include <cmath>
#include <vector>

using namespace model;
using namespace std;

const double MIN_ANGLE = M_PI / 6.0; // угол в 30 градусов

void MyStrategy::Move(Tank self, World world, model::Move& move) {
    vector<Bonus> all_bonuses = world.bonuses();             // получим список всех бонусов
    double min_dist_to_bonus = 1E20;
    size_t selected_bonus = all_bonuses.size();
    for(size_t i = 0; i < all_bonuses.size(); ++i) {         // перебираем бонус из списка
       Bonus bonus = all_bonuses[i];
       double dist_to_bonus = self.GetDistanceTo(bonus);    // найдем расстояние до бонуса
       if (dist_to_bonus < min_dist_to_bonus) {             // найдем ближайший
         min_dist_to_bonus = dist_to_bonus;
         selected_bonus = i;
       }
    }

    if (selected_bonus != all_bonuses.size()) {
       double angle_to_bonus = self.GetAngleTo(all_bonuses[selected_bonus]); // найдем угол до бонуса

       if (angle_to_bonus > MIN_ANGLE) {         // если угол сильно положительный,
         move.set_left_track_power(0.75);      // то будем разворачиваться,
         move.set_right_track_power(-1.0);        // поставив противоположные силы гусеницам.
       } else if (angle_to_bonus < -MIN_ANGLE) {  // если угол сильно отрицательный,
         move.set_left_track_power(-1.0);         // будем разворачиваться
         move.set_right_track_power(0.75);     // в противоположную сторону.
       } else {
         move.set_left_track_power(1.0);         // если угол не больше 30 градусов
         move.set_right_track_power(1.0);        // поедем максимально быстро вперед 
       }
    }
}

TankType MyStrategy::SelectTank(int tank_index, int team_size) {
    return MEDIUM;
}

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



admin

admin

Команда Russian AI Cup

cups_17467

cups_17467

Калининград

Помните, что в стартовом пакете вы можете менять только файл MyStrategy.${ext} (${ext} — расширение используемого вам языка), и даже если вы измените какой-то другой файл и тоже приложите его в архив, то все равно при тестировании он будет заменен на стандартный. Это получается что .h файлы для C++ менять нельзя?

да, это так

01.11.2012 7:38:56
ns_serg

ns_serg

ООО "Продстар Торговый Дом"

BoxAtBox

BoxAtBox

Ростов-на-Дону

На каком процессоре будет происходить игра, т.к. ограничения по мс процессорного времени в правилах:

Просто возьми показания часов. Универсально в паскале - now() function DateTimeToMilliseconds(aDateTime: TDateTime): Int64; var TimeStamp: TTimeStamp; begin {Call DateTimeToTimeStamp to convert DateTime to TimeStamp:} TimeStamp:= DateTimeToTimeStamp (aDateTime); {Multiply and add to complete the conversion:} Result:= TimeStamp.Time; end; … lTimeStart:=now(); … Тут тратишь процессорное время … DateTimeToMilliseconds(Now() - lTimeStart) - время потраченное программой на тик в миллисекундах.

04.11.2012 15:16:18
admin

admin

Команда Russian AI Cup

M18_HELLCAT

M18_HELLCAT

ИГЭУ

Чтобы писать не /* найдем открытые для выстрела танки .* vector open_tanks(world.tanks()); open_tanks.clear(); а vector open_tanks(6); например. Первый вариант дает ошибку отсутствия конструктора.

Это специфичные вашему коду и стилю написания вещи, так что нет, не планируется.

05.11.2012 0:11:52
dantistus

dantistus

Freelance Web & Graphic Designer

Megabyte

Megabyte

ООО Сибтел-крипто

Дописал свою мега страту. : ) У меня есть 5-6 констант, которые управляют выбором поведения. Если бы сделать инкубатор с эволюционным отбором, когда от основного танка создаются 5 новых у которых настроечные константы рандомно отклоняются на небольшой процент, с небольшой вероятностью сильной мутации одного из параметров. Проводится 100 боев в этом составе, набравший наибольшее количество побед берется как новый основной танк. От него производятся 5 новых детей с мутацией и снова производится 100 боев естественного отбора. …

Дело говорите! У меня порядка 30 констант, из них 20 можно “тюнинговать” при помощи генетического алгоритма. Сейчас, с двумя боями за 5 минут, приходится полагаться на интуицию и удачу ^_^

05.11.2012 12:04:10
Raziel

Raziel

СПбНИУ ИТМО

dantistus

dantistus

Freelance Web & Graphic Designer

Дело говорите! У меня порядка 30 констант, из них 20 можно “тюнинговать” при помощи генетического алгоритма. Сейчас, с двумя боями за 5 минут, приходится полагаться на интуицию и удачу ^_^

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

05.11.2012 15:04:54
Kellendros

Kellendros

СПбГУ

Для теста скопировал стратегию из примера, попробовал скомпилировать выдало

1>—— Построение начато: проект: cpp-cgdk, Конфигурация: Debug Win32 ——

1>Построение начато 05.11.2012 15:58:22.

1>InitializeBuildStatus:

1> Обращение к “Debugcpp-cgdk.unsuccessfulbuild”.

1>ClCompile:

1> MyStrategy.cpp

1>ManifestResourceCompile:

1> Для всех выходных данных обновления не требуется.

1>Runner.obj : error LNK2019: ссылка на неразрешенный внешний символ “public: virtual _thiscall Strategy::~Strategy(void)“ (??1Strategy@@UAE@XZ) в функции ”public: virtual _thiscall MyStrategy::~MyStrategy(void)” (??1MyStrategy@@UAE@XZ)

1>E:workspacerussianaicupcpp-cgdkDebugcpp-cgdk.exe : fatal error LNK1120: 1 неразрешенных внешних элементов

1>

1>СБОЙ построения.

1>

1>Затраченное время: 00:00:01.09

========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Кто виноват, и что делать?

05.11.2012 15:59:02
Pe4enie

Pe4enie

ООО "МТ Клик"

solomidSF

solomidSF

PRO

а почему если не писать цикл в стратегии то все равно работает как в цикле?

Вам не нужно зацикливать вашу стратегию внутри себя. Каждый тик вызывается Ваш метод move().

07.11.2012 18:53:27
qulinxao

а почему если не писать цикл в стратегии то все равно работает как в цикле?

событийное программирование :)

посмотри как раннер реализован.

он получае через сокет состояние мира выполняет мув и отдаёт move через сокет

07.11.2012 19:08:21
qulinxao
MaxPayne

MaxPayne

Набережночелнинский КГАМТ

А как можно отлаживать стратегию на Паскале? Я имею ввиду ставить точки останова. Free Pascal не даёт такой возможности, а под Delphi XE2 стратегия не хочет компилиться (компилирую Runner.dpr).

??? у фри паскале вроде есть же пошаговый???

как обычно запускаеш локалранер затем пускаеш под отладчиком ранер и всё при проходе точки останова ide приостановит исполнение ранера

07.11.2012 22:33:23
MaxPayne

MaxPayne

Набережночелнинский КГАМТ

??? у фри паскале вроде есть же пошаговый??? как обычно запускаеш локалранер затем пускаеш под отладчиком ранер и всё при проходе точки останова ide приостановит исполнение ранера

Скомпилировал XE2, запускаю, Runner.exe вылетает с ошибкой. Стратегия тестовая.

07.11.2012 23:15:54
admin

admin

Команда Russian AI Cup

MaxPayne

MaxPayne

Набережночелнинский КГАМТ

Скомпилировал XE2, запускаю, Runner.exe вылетает с ошибкой. Стратегия тестовая.

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

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

08.11.2012 0:15:21
alevlaber

alevlaber

Костанай

hi guys i got Ошибка верификации errors! what is this verification errors??? i can’t fix it! by the way, i cleared all codes unless two nested loop like this: for(double i = s_x; i <= e_x; i += step) { for(double j = s_y; j <= e_y; i += step) { // some code :/ } } but again i’ve got an error! how can i fix this problem? :(

hi! try to click on “Ошибка верификации” text and maybe some message will be shown

11.11.2012 1:50:45
Pe4enie

Pe4enie

ООО "МТ Клик"

hi guys i got Ошибка верификации errors! what is this verification errors??? i can’t fix it! by the way, i cleared all codes unless two nested loop like this: for(double i = s_x; i <= e_x; i += step) { for(double j = s_y; j <= e_y; i += step) { // some code :/ } } but again i’ve got an error! how can i fix this problem? :(

It can be due to memory leak, inspect your code once again. There is limitation that process with your strategy is not allowed to exceed limit in 250 Mb. Or try to decrease amount of iterations in for-loops.

11.11.2012 1:56:18
alevlaber

alevlaber

Костанай

hi guys i got Ошибка верификации errors! what is this verification errors??? i can’t fix it! by the way, i cleared all codes unless two nested loop like this: for(double i = s_x; i <= e_x; i += step) { for(double j = s_y; j <= e_y; i += step) { // some code :/ } } but again i’ve got an error! how can i fix this problem? :(

Did you use http://russianaicup.ru/s/1352534864179/assets/local-runner/local-runner.zip?rnd (link from page http://russianaicup.ru/p/localrunner )? it is helpful for testing your code on local machine. Just start localRunner.jar and then start your project

11.11.2012 1:59:49
SiSa
alevlaber

alevlaber

Костанай

hi! try to click on “Ошибка верификации” text and maybe some message will be shown

just this msg! http://axgig.com/images/31195213738854367391.bmp

but i don’t understand what’s it mean!

11.11.2012 2:01:29
Pe4enie

Pe4enie

ООО "МТ Клик"

just this msg! http://axgig.com/images/31195213738854367391.bmp but i don’t understand what’s it mean!

It means “Your strategy was compiled, but on short test battles works incorrectly”

11.11.2012 2:03:14
alevlaber

alevlaber

Костанай

just this msg! http://axgig.com/images/31195213738854367391.bmp but i don’t understand what’s it mean!

“Your strategy has been successfully compiled, but in small battles is not working properly”. p.s. what about http://russianaicup.ru/post/2#comment-1390 ?

11.11.2012 2:04:13
SiSa
Pe4enie

Pe4enie

ООО "МТ Клик"

It can be due to memory leak, inspect your code once again. There is limitation that process with your strategy is not allowed to exceed limit in 250 Mb. Or try to decrease amount of iterations in for-loops.

yea, it’s because of changing amount of iterations thanks dude

11.11.2012 2:09:16
SiSa
alevlaber

alevlaber

Костанай

Did you use http://russianaicup.ru/s/1352534864179/assets/local-runner/local-runner.zip?rnd (link from page http://russianaicup.ru/p/localrunner )? it is helpful for testing your code on local machine. Just start localRunner.jar and then start your project

thanks you too i didn’t know how to use it!

11.11.2012 2:10:59
alevlaber

alevlaber

Костанай

thanks you too i didn’t know how to use it!

Here you can find some addon to localrunner http://russianaicup.ru/p/localrunner#comment-576 .

Download archive from any link and unpack to directory with your locanrunner.jar and then

start local-runner-five-dummies.bat or local-runner-five.bat if you use windows

or

local-runner-five-dummies.sh or local-runner-five.sh if you use linux

to get five enemy tanks

11.11.2012 2:20:35
BoxAtBox

BoxAtBox

Ростов-на-Дону

ns_serg

ns_serg

ООО "Продстар Торговый Дом"

Просто возьми показания часов. Универсально в паскале - now() function DateTimeToMilliseconds(aDateTime: TDateTime): Int64; var TimeStamp: TTimeStamp; begin {Call DateTimeToTimeStamp to convert DateTime to TimeStamp:} TimeStamp:= DateTimeToTimeStamp (aDateTime); {Multiply and add to complete the conversion:} Result:= TimeStamp.Time; end; … lTimeStart:=now(); … Тут тратишь процессорное время … DateTimeToMilliseconds(Now() - lTimeStart) - время потраченное программой на тик в миллисекундах.

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

12.11.2012 15:13:07
4fun

4fun

Зеленоград

Код примера передачи управления между стратегиями public final class TestMyStrategy implements Strategy {

    public static TestMyStrategy firstStrategy;
    public static TestMyStrategy secondStrategy;
    private int tick;

    private double leftTrackPower;
    private double rightTrackPower;

    @Override
    public void move(Tank self, World world, Move move)
    {
        if(tick == 0){
            if(firstStrategy == null){
                firstStrategy = this;
            }else{
                secondStrategy = this;
            }
        }

        move.setLeftTrackPower(leftTrackPower);
        move.setRightTrackPower(rightTrackPower);

        tick++;

        if(tick == 150 && this.equals(firstStrategy)){
            secondStrategy.setMoving(1.0D, 1.0D);
        }

        if(tick == 300 && this.equals(secondStrategy)){
            firstStrategy.setMoving(-1.0D, -1.0D);
        }
    }

    public void setMoving(double leftTrackPower, double rightTrackPower){
        this.leftTrackPower = leftTrackPower;
        this.rightTrackPower = rightTrackPower;
    }

    @Override
    public TankType selectTank(int tankIndex, int teamSize)
    {
        return TankType.MEDIUM;
    }
}

Результат запуска http://russianaicup.ru/game/view/229710

13.11.2012 17:36:46
admin

admin

Команда Russian AI Cup

BooL

BooL

Россия

А как выяснить длину и ширину танка?

У всех объектов есть методы, возвращающие их размеры. Посмотрите в классах Unit и Tank.

18.11.2012 18:33:07
Megabyte

Megabyte

ООО Сибтел-крипто

Пожалуйста сдлайте в списке попыток (отосланых стратегий) отображение не глобального ID а номера версии которая отображается в информации о бое. Очень трудно понять на какой версии после каких исправлений в коде происходит перелом в движении по рейтингу. На графике версия сменилась с 307 на 309 а вот в списке стратегий найти эту версию для меня настойщий геморрой. Много отправляю : )

18.11.2012 21:22:01
cheeser

cheeser

Glowbyte

Michael666-96

Michael666-96

Чистилище

А что происходит с танком, если его hullDurability == 0??? Он мёртв или всё ещё может стрелять или кататься??

Мёртв

18.11.2012 23:35:46
admin

admin

Команда Russian AI Cup

Michael666-96

Michael666-96

Чистилище

А с каждым тиком переменные в стратегии обновляются?? Можно ли создать переменную target и будет её значение обновляться с каждым тиком?

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

19.11.2012 22:34:12
BooL

BooL

Россия

Какое максимальное и минимальное значение возвращает функция getangleto?

21.11.2012 13:41:04
hilmekrhu

hilmekrhu

Positive Technologies

BooL

BooL

Россия

Какое максимальное и минимальное значение возвращает функция getangleto?

-Pi;Pi, логично же.

21.11.2012 14:47:57
nop

nop

БГУ

cheeser

cheeser

Glowbyte

Мёртв

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

21.11.2012 15:55:47
turbotankist

turbotankist

Reksoft

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

10.12.2012 20:56:28
GreenTea

GreenTea

ISDDesign

turbotankist

turbotankist

Reksoft

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

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

11.12.2012 4:28:40
dred112

dred112

нет

Можно нечто подобное увидеть для pascal? В отдельности интерисует определение угла башни до танка, и танка до ближайшего бонуса. Спасибо

19.12.2012 13:38:46
wtf.lisi4ka

wtf.lisi4ka

СамГТУ

Megabyte

Megabyte

ООО Сибтел-крипто

Пожалуйста сдлайте в списке попыток (отосланых стратегий) отображение не глобального ID а номера версии которая отображается в информации о бое. Очень трудно понять на какой версии после каких исправлений в коде происходит перелом в движении по рейтингу. На графике версия сменилась с 307 на 309 а вот в списке стратегий найти эту версию для меня настойщий геморрой. Много отправляю : )

А мне нравятся ваши изменения в вашем коде…Пожалуйста добавьте как вы это делали и для меня,ведь мне тоже хочется…

19.12.2012 21:21:46
Gvoin

Gvoin

Не могу

Почему полностью аналогичный код на Pascal как в этом примере(Танк, стреляющий в противников) дает нам просто крутящий башней танк и стреляющий тогда, когда перезарядился??? Дайте пожалуйста Эти 2 примера на Pascal, рабочие .

28.12.2012 20:32:36
Artamon

Танкисты, с наступающим! Возник вопрос: как увеличить изменчивость рейтинга? во время заливки кода протиснуть галочку не представляеться возможжным(

30.12.2012 22:52:47
GreenTea

GreenTea

ISDDesign

Танкисты, с наступающим! Возник вопрос: как увеличить изменчивость рейтинга? во время заливки кода протиснуть галочку не представляеться возможжным(

С наступающим) Ее вроде можно нажимать 1 раз в сутки.. Другие ограничений вроде нет, должно работать..

30.12.2012 23:46:18
Artamon

Спасибо Вроде не пользовался еще этой кнопкой, но не беда подожду денек другой

Меня веселит что узнав о АИ челенжах пару дней назад, начал ознакомление как раз с твоих игр в AI Ants =)

Молодцом

31.12.2012 0:08:23
GreenTea

GreenTea

ISDDesign

Спасибо Вроде не пользовался еще этой кнопкой, но не беда подожду денек другой Меня веселит что узнав о АИ челенжах пару дней назад, начал ознакомление как раз с твоих игр в AI Ants =) Молодцом

:) Кстати, только что заметил что SDil то в муравьях тоже участвовал.. На 13 месте в итоге, вот чертяка xD

31.12.2012 3:00:15