#include "library.h" const int fieldw = 500, fieldh = 400, offset = 25; const double deltat = 0.1; struct Actor { double x, y, speed, reach; int colour; string success; }; Actor Create(double ix, double iy, double ispeed, int icolour, double ireach, string isuccess) { Actor a; a.x = ix; a.y = iy; a.speed = ispeed; a.colour = icolour; a.reach = ireach; a.success = isuccess; return a; } void draw_field() { set_pen_color(color::black); move_to(offset, offset); draw_to(fieldw + offset, offset); draw_to(fieldw + offset, fieldh + offset); draw_to(offset, fieldh + offset); draw_to(offset, offset); } void draw_actor(Actor a) { move_to(offset + a.x, offset + a.y); set_pen_color(a.colour); draw_point(); } void move_towards(Actor & mover, Actor target) { double alpha = atan2(target.x - mover.x, target.y - mover.y); double dx = mover.speed * deltat * sin(alpha); double dy = mover.speed * deltat * cos(alpha); mover.y += dy; mover.x += dx; } bool close_enough(Actor a, Actor b) { double dist = sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); if (dist < a.reach) return true; return false; } void succeed(Actor a) { set_pen_color(a.colour); move_to(a.x - 10, a.y - 10); write_string(a.success); } void main() { make_window(fieldw + 2 * offset, fieldh + 2 * offset); set_pen_width(3); Actor bull, boy, tree, dinosaur; bull = Create(offset + 250, offset + 50, 5, color::red, 3, "Boy eaten"); boy = Create(offset + 200, offset + fieldh - 50, 3, color::blue, 1.5, "Boy safe"); tree = Create(offset + fieldw - 50, offset + fieldh / 2, 0, color::green, 0, ""); dinosaur = Create(offset + fieldw, offset, 3, color::purple, 6, "Graaah!"); draw_field(); draw_actor(bull); draw_actor(boy); draw_actor(tree); draw_actor(dinosaur); while (true) { sleep(0.1 * deltat / 10); move_towards(bull, boy); move_towards(boy, tree); move_towards(dinosaur, bull); draw_actor(bull); if (close_enough(bull, boy)) { succeed(bull); break; } draw_actor(boy); if (close_enough(boy, tree)) { succeed(boy); break; } draw_actor(dinosaur); if (close_enough(dinosaur, bull)) { succeed(dinosaur); break; } draw_actor(tree); } }