Флейм
GameDev.ru / Флейм / Форум / MiniAiCup#2. AgarIO

MiniAiCup#2. AgarIO

Страницы: 1 2 3 4 Следующая »
kiparУчастникwww21 мар. 201810:49#1
Прикольно что рандомные характеристики мира сделали. Но я и обычный агарио не осилил, так что нет.
AdlerПостоялецwww1 апр. 201814:45#2
class Player{
    ...
    void apply_direct(Direct direct, int max_x, int max_y) {
        ...
        speed_x += (nx * max_speed - speed_x) * inertion / mass;
        speed_y += (ny * max_speed - speed_y) * inertion / mass;

        angle = qAtan2(speed_y, speed_x);
        ...
    }
    ...
    bool move(int max_x, int max_y) {
        ...
        double dx = speed * qCos(angle);
        double dy = speed * qSin(angle);
        ...
    }
    ...
};
facepalm.jpg

вот нафига angle и speed вообще нужен? нельзя просто speed_x и speed_y  хранить?

added:

virtual ~Circle() {} // - предлагаю удалить, а всех наследников Circle хранить в QVector по значению
    virtual bool is_food() const // - удалить, можно на этапе компиляции всё разрулить
    virtual bool is_virus() const // - удалить, можно на этапе компиляции всё разрулить
    virtual bool is_player() const // - удалить, можно на этапе компиляции всё разрулить

typedef QVector<Food*> FoodArray; // - указетель тут не нужен, можно хранить по значению.

struct Mechanic{
    ...
    StrategyArray strategy_array; // - вынести наружу из Mechanic.
    ...
    QMap<int, int> player_scores; // - заменить на std::vector<int>? кстати, player_scores похоже не прислыается стратегиям :(

Правка: 1 апр. 2018 15:19

ud1Постоялецwww1 апр. 201816:42#3
Опять жависты писали код. Теперь надо сидеть и выковыривать из кода их Qt и их мозголомную тригонометрию, и пытаться сделать по нормальному через векторы. Да вообще по хорошему половину кода их надо переписать.
AdlerПостоялецwww1 апр. 201816:55#4
AdlerПостоялецwww1 апр. 201817:04#5
https://github.com/MailRuChamps/miniaicups/blob/d7e4cd03b961e4cd9… player.h#L464
    bool move(int max_x, int max_y) {
        double rB = x + radius, lB = x - radius;
        double dB = y + radius, uB = y - radius;

        double dx = speed * qCos(angle);
        double dy = speed * qSin(angle);

        bool changed = false;
        if (rB + dx < max_x && lB + dx > 0) {
            x += dx;
            changed = true;
        }
        else {
            // зануляем проекцию скорости по dx
            double speed_y = speed * qSin(angle);
            speed = qAbs(speed_y);
            angle = (speed_y >= 0)? M_PI / 2 : -M_PI / 2;
        }
        if (dB + dy < max_y && uB + dy > 0) {
            y += dy;
            changed = true;
        }
        else {
            // зануляем проекцию скорости по dy
            double speed_x = speed * qCos(angle);
            speed = qAbs(speed_x);
            angle = (speed_x >= 0)? 0 : M_PI;
        }

        if (is_fast) {
            double max_speed = Constants::instance().SPEED_FACTOR / qSqrt(mass);
            apply_viscosity(max_speed);
        }
        if (fuse_timer > 0) {
            fuse_timer--;
        }
        return changed;
    }
запостите на г*код.

Правка: 1 апр. 2018 20:30

ud1Постоялецwww1 апр. 201817:49#6
Adler
Тяжело у них все с углами, вот что здесь происходит?
    void burst_on(Circle *virus) {
        double dist = calc_dist(virus->getX(), virus->getY());
        double dy = y - virus->getY(), dx = x - virus->getX();
        double new_angle = 0.0;

        if (dist > 0) {
            new_angle = qAsin(dy / dist);
            if (dx < 0) {
                new_angle = M_PI - new_angle;
            }
        }
        angle = new_angle;
        double max_speed = Constants::instance().SPEED_FACTOR / qSqrt(mass);
        if (speed < max_speed) {
            speed = max_speed;
        }
        mass += BURST_BONUS;
        score += SCORE_FOR_BURST;
        logical = State::BURST;
    }

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

AdlerПостоялецwww1 апр. 201819:47#7
самое горячее место у них:
can_see | MiniAiCup#2. AgarIO
не удивительно:
    bool can_see(const Circle *circle) {
        double xVisionCenter = x + qCos(angle) * VIS_SHIFT;
        double yVisionCenter = y + qSin(angle) * VIS_SHIFT;
        double qdist = circle->calc_qdist(xVisionCenter, yVisionCenter);

        return (qdist < (vision_radius + circle->getR()) * (vision_radius + circle->getR()));
    }

calc_qdist - доставляет, типа они пытались оптимизировать это место и избавились от корня, но вот жирный sincos сверху убрать(закэшировать в player) не догадались :)

но это всё server-side так что пофиг.


added:
словил забавный баг - иногда стратегия ёрзает и почти не двигается с места.
в общем оказалось, что почти все метрики отправляются в оценочную функцию только из конца и начала траектории(всегда так делал).
и это не правильно, особенно когда траектория не прямая.

похоже для каждой метрики нужно брать интеграл по всей траектории.

вроде у смайла в 2015 похожий баг был.

Правка: 5 апр. 2018 0:34

PlusMinusУчастникwww6 апр. 201810:55#8
я врываюсь :P

http://aicups.ru/session/106809/

AdlerПостоялецwww6 апр. 201815:13#9
PlusMinus
Респект за Node JS.
+ del

Правка: 6 апр. 2018 15:14

AdlerПостоялецwww8 апр. 20184:39#10
сделал скрипт для создания игр из консоли браузера
function xhr(method,url,callback){
  var x=new XMLHttpRequest();
  x.onreadystatechange=function(){if(x.readyState===4){callback(x.responseText,x.status,url);}};
  x.open(method,url);return x;
}
var z=xhr("POST","http://aicups.ru/run_solutions/",s=>console.log(s));
z.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var getCook=cookiename=>{
  var cookiestring=RegExp(""+cookiename+"[^;]+").exec(document.cookie);
  return decodeURIComponent(!!cookiestring ? cookiestring.toString().replace(/^[^=]+./,"") : "");
}
var solutions=[9535,9321,9868]; // <=========== версии стратегий
z.send(solutions.map(e=>"solutions_id%5B%5D="+e).join("&")+"&contest_id=2&csrfmiddlewaretoken="+getCook('csrftoken')+"&additional_params=%7B%7D");

Правка: 11 апр. 2018 19:12

ХаусПостоялецwww8 апр. 201821:14#11
Adler
> запостите на г*код.

покажи как надо плз

ud1Постоялецwww8 апр. 201822:40#12
Хаус
> покажи как надо плз

После рефакторинга у меня выглядит так:

void PlayerFragment::move(int max_x, int max_y) {
  P oldPos = pos;
  pos = clampP(pos + speed, P(radius, radius), P(max_x - radius, max_y - radius));
  this->speed = pos - oldPos;

    if (is_fast) {
        double max_speed = Constants::instance().SPEED_FACTOR / std::sqrt(mass);
        apply_viscosity(max_speed);
    }
    if (fuse_timer > 0) {
        fuse_timer--;
    }
}
AdlerПостоялецwww9 апр. 201823:01#13
отправил им PR171 чтобы закрыть баг возникающий когда поехавшая стратегия шлёт несколько ответов вместо одного.
они проигнорировали и выкатили вот этот вот:
https://github.com/MailRuChamps/miniaicups/commit/6b6e6819c1f944a… 70554d66ea461

теперь вот тут:
https://github.com/MailRuChamps/miniaicups/blob/85af1a0e9bfb2c02f… server.h#L190
можно безнаказанно и незаметно юзать speed-hack тупо отправляя несколько ответов.

отправил ещё один PR173

AdlerПостоялецwww10 апр. 20181:45#14
Изображение
Страницы: 1 2 3 4 Следующая »

/ Форум / Флейм / Программирование

2001—2018 © GameDev.ru — Разработка игр