Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove states #101

Merged
merged 7 commits into from
Apr 2, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion agario/RULES.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ speed_y += (ny * max_speed - speed_y) * INERTION_FACTOR / mass;

1. **Поедание (Eat)** - приводит к накоплению массы и уничтожению съеденного объекта. Игроки поедают еду, выбросы и других игроков. Вирусы поедают выбросы. Масса съеденного объекта приплюсовывается к массе хищника. За один тик можно съесть неограниченное кол-во других объектов, главное чтобы они попали во внутреннюю зону съедающего и по массе были меньше в 1.2 раза. Перекрытие не обязательно должно быть полным. Достаточно, чтобы хищник закрывал жертву на 2/3 его диаметра.

2. **Выбрасывание массы (Eject)** - могут делать только игроки. Выполняется по команде от **бота**. За один тик можно выполнить один раз. При этом масса игрока уменьшается на величину массы выброса (15 единиц). Если у игрока много фрагментов, то команду выполнит каждый из них, имеющий достаточную массу (хотя бы 40 единиц). Выброс улетит вдоль текущего вектора скорости с фиксированной начальной скоростью (= 8.0). Вязкость среды через некоторое количество тиков затормозит выброс: ```speed -= VISCOSITY``` до тех пор, пока скорость не станет 0. Аналогично вязкость работает и для других неуправляемых игровых объектов (игроки и вирусы после деления).
2. **Выбрасывание массы (Eject)** - могут делать только игроки. Выполняется по команде от **бота** (Eject **игнорируется**, если команда содержит Split=true). За один тик можно выполнить один раз. При этом масса игрока уменьшается на величину массы выброса (15 единиц). Если у игрока много фрагментов, то команду выполнит каждый из них, имеющий достаточную массу (хотя бы 40 единиц). Выброс улетит вдоль текущего вектора скорости с фиксированной начальной скоростью (= 8.0). Вязкость среды через некоторое количество тиков затормозит выброс: ```speed -= VISCOSITY``` до тех пор, пока скорость не станет 0. Аналогично вязкость работает и для других неуправляемых игровых объектов (игроки и вирусы после деления).

3. **Деление (Split) и слияние (Fuse)** - деление выполняется игроками по команде от **бота** либо вирусом, после достижения критической массы. Игрок делится на два равных по массе фрагмента, причем новый фрагмент приобретает дополнительный фиксированный импульс (нач. скорость равна 8.0 независимо от массы) вдоль текущего вектора скорости. Пока этот импульс не исчерпался из-за вязкости среды, фрагмент игнорирует команды, которые к нему приходят и летит по прямой. При этом он может поедать игровые объекты или взрываться на вирусах.
Деление вирусов почти такое же, как и у игроков. Они вылетают с импульсом (= 8.0), вдоль направления последней "подкормки" и останавливаются из-за вязкости среды. Во время движения вирусы могут взрывать игроков и поедать выбросы, которые встретятся им на пути. Друг с другом вирусы не взаимодействуют.
Expand Down
18 changes: 4 additions & 14 deletions agario/local_runner/entities/ejection.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,6 @@

class Ejection : public Circle
{
public:
enum State { CREATED, EATEN, MOVING };
State logical;

protected:
int color;
int player;
Expand All @@ -19,7 +15,6 @@ class Ejection : public Circle
public:
explicit Ejection(int _id, double _x, double _y, double _radius, double _mass, int player) :
Circle(_id, _x, _y, _radius, _mass),
logical(State::CREATED),
speed(0.0),
angle(0.0),
player(player)
Expand Down Expand Up @@ -57,10 +52,12 @@ class Ejection : public Circle
void set_impulse(double _speed, double _angle) {
speed = qAbs(_speed);
angle = _angle;
logical = State::MOVING;
}

bool move(int max_x, int max_y) {
if (speed == 0.0) {
return false;
}
double rB = x + radius, lB = x - radius;
double dB = y + radius, uB = y - radius;

Expand All @@ -77,14 +74,7 @@ class Ejection : public Circle
changed = true;
}

double visc = Constants::instance().VISCOSITY;
if (speed > visc) {
speed -= visc;
}
else {
speed = 0.0;
logical = State::CREATED;
}
speed = std::max(0.0, speed - Constants::instance().VISCOSITY);
return changed;
}

Expand Down
7 changes: 1 addition & 6 deletions agario/local_runner/entities/food.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,12 @@

class Food : public Circle
{
public:
enum State { CREATED, EATEN };
State logical;

protected:
int color;

public:
explicit Food(int _id, double _x, double _y, double _radius, double _mass) :
Circle(_id, _x, _y, _radius, _mass),
logical(State::CREATED)
Circle(_id, _x, _y, _radius, _mass)
{
color = rand() % 14 + 4;
}
Expand Down
34 changes: 2 additions & 32 deletions agario/local_runner/entities/player.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
class Player : public Circle
{
public:
enum State { CREATED, EATEN, EATER, BURST, FUSED, FUSER, SPLIT, EJECT, EATER_N_SPLIT, EATER_N_EJECT };
State logical;
bool is_fast;
int fuse_timer;

Expand All @@ -24,7 +22,6 @@ class Player : public Circle
public:
explicit Player(int _id, double _x, double _y, double _radius, double _mass, const int fId=0) :
Circle(_id, _x, _y, _radius, _mass),
logical(State::CREATED),
is_fast(false),
speed(0), angle(0),
fragmentId(fId),
Expand Down Expand Up @@ -184,13 +181,6 @@ class Player : public Circle

void eat(Circle *food, bool is_last=false) {
mass += food->getM();
if (logical == State::SPLIT) {
logical = State::EATER_N_SPLIT;
} else if (logical == State::EJECT) {
logical = State::EATER_N_EJECT;
} else {
logical = State::EATER;
}

if (food->is_my_eject(this)) {
return;
Expand Down Expand Up @@ -231,7 +221,6 @@ class Player : public Circle
}
mass += BURST_BONUS;
score += SCORE_FOR_BURST;
logical = State::BURST;
}

QVector<Player*> burst_now(int max_fId, int yet_cnt) {
Expand All @@ -255,7 +244,6 @@ class Player : public Circle
new_fragment->set_impulse(BURST_START_SPEED, burst_angle);
}
set_impulse(BURST_START_SPEED, angle + BURST_ANGLE_SPECTRUM / 2);
logical = State::CREATED;

fragmentId = max_fId + new_frags_cnt + 1;
mass = new_mass;
Expand All @@ -265,9 +253,6 @@ class Player : public Circle
}

bool can_split(int yet_cnt) {
if (logical != State::CREATED) {
return false;
}
if (yet_cnt + 1 <= Constants::instance().MAX_FRAGS_CNT) {
if (mass > MIN_SPLIT_MASS) {
return true;
Expand All @@ -289,7 +274,6 @@ class Player : public Circle
mass = new_mass;
radius = new_radius;

logical = State::CREATED;
return new_player;
}

Expand Down Expand Up @@ -373,17 +357,10 @@ class Player : public Circle
speed = qSqrt(dX * dX + dY * dY);

mass += frag->getM();
logical = State::FUSER;
}

bool can_eject() {
if (logical != State::CREATED) {
return false;
}
if (mass > MIN_EJECT_MASS) {
return true;
}
return false;
return mass > MIN_EJECT_MASS;
}

Ejection *eject_now(int eject_id) {
Expand All @@ -395,7 +372,6 @@ class Player : public Circle

mass -= EJECT_MASS;
radius = Constants::instance().RADIUS_FACTOR * qSqrt(mass);
logical = State::CREATED;
score += SCORE_FOR_EJECT;
return new_eject;
}
Expand Down Expand Up @@ -430,7 +406,6 @@ class Player : public Circle
changed = true;
}

logical = State::CREATED;
return changed;
}

Expand Down Expand Up @@ -509,12 +484,7 @@ class Player : public Circle
}

bool can_shrink() {
if (mass > MIN_SHRINK_MASS) {
if (logical == State::CREATED) {
return true;
}
}
return false;
return mass > MIN_SHRINK_MASS;
}

void shrink_now() {
Expand Down
27 changes: 5 additions & 22 deletions agario/local_runner/entities/virus.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,13 @@

class Virus : public Circle
{
public:
enum State { CREATED, HURT, EATER, MOVING, SPLIT };
State logical;

protected:
double speed;
double angle, split_angle;

public:
explicit Virus(int _id, double _x, double _y, double _radius, double _mass) :
Circle(_id, _x, _y, _radius, _mass),
logical(State::CREATED),
speed(0.0),
angle(0.0),
split_angle(0.0)
Expand Down Expand Up @@ -65,16 +60,10 @@ class Virus : public Circle
void eat(Ejection *eject) {
mass += eject->getM();
split_angle = eject->getA();
logical = State::EATER;
}

bool can_split() {
if (logical == State::CREATED || logical == State::MOVING || logical == State::EATER) {
if (mass > Constants::instance().VIRUS_SPLIT_MASS) {
return true;
}
}
return false;
return mass > Constants::instance().VIRUS_SPLIT_MASS;
}

Virus *split_now(int new_id) {
Expand All @@ -84,18 +73,19 @@ class Virus : public Circle
new_virus->set_impulse(new_speed, new_angle);

mass = VIRUS_MASS;
logical = State::CREATED;
return new_virus;
}

public:
void set_impulse(double _speed, double _angle) {
speed = qAbs(_speed);
angle = _angle;
logical = State::MOVING;
}

bool move(int max_x, int max_y) {
if (speed == 0.0) {
return false;
}
double rB = x + radius, lB = x - radius;
double dB = y + radius, uB = y - radius;

Expand All @@ -112,14 +102,7 @@ class Virus : public Circle
changed = true;
}

double visc = Constants::instance().VISCOSITY;
if (speed > visc) {
speed -= visc;
}
else {
speed = 0.0;
logical = State::CREATED;
}
speed = std::max(0.0, speed - Constants::instance().VISCOSITY);
return changed;
}

Expand Down
Loading