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))
|
.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 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue