From 17551f2ae293b29d604f23ba918d76d71a5f3e4c Mon Sep 17 00:00:00 2001 From: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Mon, 9 Nov 2026 16:14:41 -0500 Subject: [PATCH] kill beam --- simulator/src/main.rs | 44 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/simulator/src/main.rs b/simulator/src/main.rs index 34d4a08..7e96dfe 100644 --- a/simulator/src/main.rs +++ b/simulator/src/main.rs @@ -83,13 +83,33 @@ impl Robot { .map(|contact| contact.point1.distance(self.pose.translation)).reduce(|x: f32,y: f32| x.min(y)) } - pub fn policy(&mut self, sensor: &Sensor){ + fn draw_weapon(&self) { + let tl = self.pose.translation; + draw_circle(tl.x, tl.y, 80.0, ORANGE); + } + + fn weapon<'a>(&self, peers: impl Iterator) { + let weapon = Ball::new(80.0); + + for peer in peers { + let (p_p, p_c) = peer.collider(); + + if let Some(_) = contact(&self.pose, &weapon, p_p , p_c, 0.0).unwrap() { + peer.kill(); + } + + } + } + + pub fn policy(&mut self, sensor: &Sensor) -> bool{ match sensor { Sensor::Food => self.move_step(1.0, 0.0), Sensor::Kin => self.move_step(-0.3, 0.02), - Sensor::NonKin => self.move_step(-0.3, 1.02), + Sensor::NonKin => self.move_step(-0.3, 0.02), Sensor::None => self.move_step(0.3, 0.01), } + + return *sensor == Sensor::NonKin; } } @@ -99,6 +119,7 @@ struct Food { alive: AtomicBool, } +#[derive(PartialEq, Eq)] enum Sensor { Food, Kin, @@ -171,7 +192,7 @@ async fn run_simulation() -> (i32, i32) { let mut loo = 0; loop { - let rendered = loo %100 == 0; + let rendered = loo %1 == 0; clear_background(LIGHTGRAY); for food in &mut food{ @@ -182,10 +203,10 @@ async fn run_simulation() -> (i32, i32) { } } if rendered { food.draw(); } - // TODO: die upon collision with robot } food = food.into_iter().filter(Mortal::living).collect(); // remove dead food + robots = robots.into_iter().filter(Mortal::living).collect(); // remove dead robots let mut sensors = Vec::new(); for robot in &*robots { @@ -210,8 +231,19 @@ async fn run_simulation() -> (i32, i32) { sensors.push(sensor); } - for (idx, robot) in robots.iter_mut().enumerate() { - robot.policy(&sensors[idx]); + for idx in 0..robots.len() { + let (before, after) = robots.split_at_mut(idx); + let (robot, after) = after.split_first_mut().unwrap(); + let robots = before.iter().chain(after.iter()); + + let robots = robots.map(|r| r as &dyn Mortal); + let peers = robots.chain(food.iter().map(|f| f as &dyn Mortal)); + + let death = robot.policy(&sensors[idx]); + if death { + if rendered {robot.draw_weapon();} + robot.weapon(peers); + } if rendered { robot.draw();} } if rendered {