chamber func, falling is valid move

sideways
Rostyslav Hnatyshyn 9 months ago
parent 6508b51fb3
commit b718397682
  1. 2
      src/lib/ai.rs
  2. 6
      src/lib/point.rs
  3. 67
      src/lib/world.rs
  4. 8
      src/main.rs

@ -63,7 +63,7 @@ impl AI for Ant {
if w.cleared.contains(&pos) { if w.cleared.contains(&pos) {
self.pos = pos; self.pos = pos;
} else { } else {
if w.is_safe_to_dig(&self.pos, &pos, &b) { if w.is_safe_to_dig(&pos, &b) {
w.clear(pos); w.clear(pos);
} }
} }

@ -14,6 +14,10 @@ impl Point {
Point(self.0 - 1, self.1) Point(self.0 - 1, self.1)
} }
pub fn is_below(&self, other: Point) -> bool {
other.down() == *self
}
pub fn right(&self) -> Point { pub fn right(&self) -> Point {
Point(self.0 + 1, self.1) Point(self.0 + 1, self.1)
} }
@ -99,7 +103,7 @@ pub fn astar(start: &Point, goal: &Point, w: Option<&World>, s: Option<&Screen>)
Some(w) => current Some(w) => current
.get_neighbors() .get_neighbors()
.iter() .iter()
.filter(|p| w.is_valid_movement(p, s.unwrap())) .filter(|p| w.is_valid_movement(&current, p, s.unwrap()))
.map(|e| e.clone()) .map(|e| e.clone())
.collect(), .collect(),
None => current.get_neighbors(), None => current.get_neighbors(),

@ -21,44 +21,28 @@ impl World {
self.cleared.insert(pos); self.cleared.insert(pos);
} }
// make sure that this is as simple & robust as possible pub fn create_chamber(&mut self, center: Point, radius: i32) {
// then, use this set of rules when digging let cx = center.0;
// call astar from the suggested dig site to origin (or whatever "home" coordinate") let cy = center.1;
// if route does not exist, do not dig
pub fn is_valid_movement(&self, target: &Point, b: &Screen) -> bool { for i in cx-radius..cx+radius {
let safe = for j in cy-radius..cy+radius {
self.clear(Point(i,j));
}
}
}
pub fn is_valid_movement(&self, current: &Point, target: &Point, b: &Screen) -> bool {
// should allow down movements always
let safe = target.is_below(*current) || (
!self.cleared.contains(&target.down()) !self.cleared.contains(&target.down())
|| !self.cleared.contains(&target.left()) || !self.cleared.contains(&target.left())
|| !self.cleared.contains(&target.right()) || !self.cleared.contains(&target.right())
|| !self.cleared.contains(&target.bldiag()) || !self.cleared.contains(&target.bldiag())
|| !self.cleared.contains(&target.uldiag()) || !self.cleared.contains(&target.uldiag())
|| !self.cleared.contains(&target.brdiag()) || !self.cleared.contains(&target.brdiag())
|| !self.cleared.contains(&target.urdiag()); || !self.cleared.contains(&target.urdiag()));
// can only go to target if
// its above or left or right of a not cleared space
/*
if target.is_above(current_pos) {
safe =
(!self.cleared.contains(&target.left()) || !self.cleared.contains(&target.right()))
|| (!self.cleared.contains(&current_pos.right()) && self.cleared.contains(&target.right()))
|| (!self.cleared.contains(&current_pos.left()) && self.cleared.contains(&target.left()));
}
if target.is_adjacent(current_pos) {
let target_down = target.down();
if self.cleared.contains(&target_down) {
safe = !self.cleared.contains(&target_down.left())
|| !self.cleared.contains(&target_down.right());
} else {
safe = !self.cleared.contains(&target.down());
}
}
if target.is_below(current_pos) {
safe = true;
}*/
// of course, its only a valid move if you can walk there! // of course, its only a valid move if you can walk there!
b.is_in_bounds(target) && self.cleared.contains(target) && safe b.is_in_bounds(target) && self.cleared.contains(target) && safe
@ -68,25 +52,10 @@ impl World {
self.cleared.contains(pos) self.cleared.contains(pos)
} }
pub fn is_safe_to_dig(&self, current_pos: &Point, target: &Point, b: &Screen) -> bool { pub fn is_safe_to_dig(&self, target: &Point, b: &Screen) -> bool {
// create a scenario in which this has been dug out
let mut hypothetical_world = self.clone(); let mut hypothetical_world = self.clone();
hypothetical_world.clear(*target); hypothetical_world.clear(*target);
// test if we can return from the target to the beginning
// if yes, dig
let result = astar(target, &Point(0, 0), Some(&hypothetical_world), Some(b)); let result = astar(target, &Point(0, 0), Some(&hypothetical_world), Some(b));
//let to_current_pos = astar(target, current_pos, Some(&hypothetical_world), Some(b));
/*if target.is_above(current_pos) {
safe = !self.cleared.contains(&target.up());
}
if target.is_adjacent(current_pos) {
safe = !self.cleared.contains(&target.up()) && !self.cleared.contains(&target.down());
}
if target.is_below(current_pos) {
safe = !self.cleared.contains(&target.down()) && !self.cleared.contains(&target.left()) && !self.cleared.contains(&target.right());
}*/
b.is_in_bounds(target) && result.is_ok() b.is_in_bounds(target) && result.is_ok()
} }
@ -108,7 +77,7 @@ impl World {
let moves = b.get_valid_movements(pos); let moves = b.get_valid_movements(pos);
let mut ans: Vec<Point> = moves let mut ans: Vec<Point> = moves
.iter() .iter()
.filter(|p| self.is_valid_movement(p, b)) .filter(|p| self.is_valid_movement(pos, p, b))
.map(|p| p.clone()) .map(|p| p.clone())
.collect(); .collect();

@ -24,14 +24,10 @@ fn main() {
let mut world = World::new(); let mut world = World::new();
let mut entities = Entities::new(); let mut entities = Entities::new();
let q = Queen::new(3,0); let q = Queen::new(board.center.0,board.center.1);
entities.add_entity(&q); entities.add_entity(&q);
for i in 0..6 { world.create_chamber(Point(board.center.0, board.center.1), 3);
for j in 0..1 {
world.clear(Point(i, j));
}
}
loop { loop {
// TODO: add way to break out of the loop by hitting a random key // TODO: add way to break out of the loop by hitting a random key

Loading…
Cancel
Save