diff --git a/include/Bot.hpp b/include/Bot.hpp index 983c1c6..6603b37 100644 --- a/include/Bot.hpp +++ b/include/Bot.hpp @@ -1,6 +1,60 @@ #pragma once -class Bot { +#include + +#include "Map.hpp" +#include "Snake.hpp" + +class Bot : public Snake, public GameObject { public: + struct Config { + float time_between_targets; + double speed; + float move_interval; + }; + + Bot(canvas::SnakeObject obj, Config config, Map &map) + : Snake(obj), config_(config), map_(map), real_pos_(obj.pos) {} + + void act(float dt) override { + time_from_target_set_ += dt; + + int eaten = map_.eat(utils::to_world_coord(pos), 20); + inc_length(eaten); + + if (not target_.has_value() or + time_from_target_set_ >= config_.time_between_targets or + (target_.value() - real_pos_).len_sq() < radius * radius) { + time_from_target_set_ = 0; + + target_ = map_.find_nearest_food(real_pos_); // TODO + } + + direction_ = (Vecf(target_.value()) - real_pos_).norm(); + // TODO: manually change direction + + move(dt); + } + + void draw(Veci offset) override { Snake::draw(offset); } + +protected: + void move(float dt) { + real_pos_ += direction_ * dt * config_.speed; + move_time_delta_ += dt; + if (move_time_delta_ > config_.move_interval) { + move_time_delta_ -= config_.move_interval; + add(Veci(real_pos_)); + } + } + private: + const Config config_; + Map &map_; + + Vecf real_pos_; + Vecf direction_ = {}; + std::optional target_ = {}; + float time_from_target_set_ = 0; + float move_time_delta_ = 0; }; diff --git a/include/Map.hpp b/include/Map.hpp index 24d344e..c18cc32 100644 --- a/include/Map.hpp +++ b/include/Map.hpp @@ -90,7 +90,7 @@ private: } private: - Config config_; + const Config config_; double time_from_last_gen_ = 0; size_t current_gen_ = 0; std::deque food_ = {}; diff --git a/include/Snake.hpp b/include/Snake.hpp index aff7176..760f53b 100644 --- a/include/Snake.hpp +++ b/include/Snake.hpp @@ -6,16 +6,16 @@ namespace canvas { -struct WormObject : public Object { +struct SnakeObject : public Object { size_t length; int radius; }; } // namespace canvas -class Worm : protected canvas::WormObject { +class Snake : protected canvas::SnakeObject { public: - Worm(canvas::WormObject obj) : WormObject(obj), track_{pos} {} + Snake(canvas::SnakeObject obj) : SnakeObject(obj), track_{pos} {} void add(Veci pos); @@ -41,7 +41,7 @@ public: // - bool touches(const Worm &other); + bool touches(const Snake &other); protected: std::deque track_; diff --git a/src/Game.cpp b/src/Game.cpp index c3a3956..74766f8 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -53,7 +53,7 @@ Map map{{ // std::vector bots; // TODO -auto snake = Worm(canvas::WormObject{ +auto snake = Snake(canvas::SnakeObject{ {.pos = Veci(player.pos), .color = {color::GREEN}}, 10, 10,