1
Fork 0

kill beam

This commit is contained in:
Andy Killorin 2026-11-09 16:14:41 -05:00
parent 596db89430
commit 17551f2ae2
Signed by: ank
GPG key ID: 23F9463ECB67FE8C

View file

@ -83,13 +83,33 @@ impl Robot {
.map(|contact| contact.point1.distance(self.pose.translation)).reduce(|x: f32,y: f32| x.min(y)) .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<Item = &'a dyn Mortal>) {
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 { match sensor {
Sensor::Food => self.move_step(1.0, 0.0), Sensor::Food => self.move_step(1.0, 0.0),
Sensor::Kin => self.move_step(-0.3, 0.02), 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), Sensor::None => self.move_step(0.3, 0.01),
} }
return *sensor == Sensor::NonKin;
} }
} }
@ -99,6 +119,7 @@ struct Food {
alive: AtomicBool, alive: AtomicBool,
} }
#[derive(PartialEq, Eq)]
enum Sensor { enum Sensor {
Food, Food,
Kin, Kin,
@ -171,7 +192,7 @@ async fn run_simulation() -> (i32, i32) {
let mut loo = 0; let mut loo = 0;
loop { loop {
let rendered = loo %100 == 0; let rendered = loo %1 == 0;
clear_background(LIGHTGRAY); clear_background(LIGHTGRAY);
for food in &mut food{ for food in &mut food{
@ -182,10 +203,10 @@ async fn run_simulation() -> (i32, i32) {
} }
} }
if rendered { food.draw(); } if rendered { food.draw(); }
// TODO: die upon collision with robot
} }
food = food.into_iter().filter(Mortal::living).collect(); // remove dead food 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(); let mut sensors = Vec::new();
for robot in &*robots { for robot in &*robots {
@ -210,8 +231,19 @@ async fn run_simulation() -> (i32, i32) {
sensors.push(sensor); sensors.push(sensor);
} }
for (idx, robot) in robots.iter_mut().enumerate() { for idx in 0..robots.len() {
robot.policy(&sensors[idx]); 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 { robot.draw();}
} }
if rendered { if rendered {