kill beam
This commit is contained in:
parent
596db89430
commit
17551f2ae2
1 changed files with 38 additions and 6 deletions
|
|
@ -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<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 {
|
||||
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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue