|
@@ -1,21 +1,113 @@
|
|
|
use UbongoTrigoSolver::*;
|
|
|
+use std::io::Read;
|
|
|
+use std::io::Write;
|
|
|
+use console::Key;
|
|
|
|
|
|
-const B :Cell = Cell::Barrier;
|
|
|
+const B: Cell = Cell::Barrier;
|
|
|
const E: Cell = Cell::Empty;
|
|
|
|
|
|
fn main() {
|
|
|
+ console::set_colors_enabled(true);
|
|
|
+ let mut t = console::Term::stdout();
|
|
|
+ let mut running = true;
|
|
|
let mut map : Map = [
|
|
|
- [B, B, E, E, E, B, B, B, E, E, E, B, B, B, B, B],
|
|
|
- [B, E, E, E, E, E, B, B, B, E, E, E, B, B, B, B],
|
|
|
- [E, E, E, E, E, E, B, B, E, E, E, E, E, E, B, B],
|
|
|
- [E, E, E, B, E, B, B, B, E, E, E, E, E, B, B, B],
|
|
|
- [B, B, B, B, B, B, B, B, B, B, B, E, B, B, B, B],
|
|
|
+ [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
|
|
|
+ [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
|
|
|
+ [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
|
|
|
+ [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
|
|
|
+ [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
|
|
|
];
|
|
|
|
|
|
- let parts : Vec<(PartID, Part)> = generate_parts();
|
|
|
+ let mut cursor_x : i8= 0;
|
|
|
+ let mut cursor_y : i8= 0;
|
|
|
+ let mut unused_piece = 1;
|
|
|
+
|
|
|
+ while running {
|
|
|
+ t.clear_screen();
|
|
|
+ let mut map_clone = map.clone();
|
|
|
+ map_clone[cursor_y as usize][cursor_x as usize] = Cell::Occupied(1);
|
|
|
+ print_map(&mut t, &map_clone);
|
|
|
+ write!(&mut t, "\nUnused piece: {}\nW, A, S, D to navigate.\nSpace bar to toggle between empty and barrier.\n1-7 to choose unused piece.\nEnter to start calculation.\nq to quit.\n", unused_piece);
|
|
|
+
|
|
|
+ let pressed_key = t.read_key().expect("Input error");
|
|
|
+
|
|
|
+ match pressed_key {
|
|
|
+ Key::Char('d') => {
|
|
|
+ if cursor_x == MAP_WIDTH -1 {
|
|
|
+ cursor_y = (cursor_y + 1).rem_euclid(MAP_HEIGHT);
|
|
|
+ }
|
|
|
+
|
|
|
+ cursor_x = (cursor_x + 1).rem_euclid(MAP_WIDTH);
|
|
|
+ },
|
|
|
+ Key::Char('w') => {
|
|
|
+ cursor_y = (cursor_y - 1).rem_euclid(MAP_HEIGHT);
|
|
|
+ },
|
|
|
+ Key::Char('s') => {
|
|
|
+ cursor_y = (cursor_y + 1).rem_euclid(MAP_HEIGHT);
|
|
|
+ },
|
|
|
+ Key::Char('a') => {
|
|
|
+ if cursor_x == 0 {
|
|
|
+ cursor_y = (cursor_y - 1).rem_euclid(MAP_HEIGHT);
|
|
|
+ }
|
|
|
+
|
|
|
+ cursor_x = (cursor_x - 1).rem_euclid(MAP_WIDTH);
|
|
|
+ },
|
|
|
+ Key::Char(' ') => {
|
|
|
+ let current_cell = &mut map[cursor_y as usize][cursor_x as usize];
|
|
|
+ let updated_cell = match current_cell {
|
|
|
+ Cell::Empty => Cell::Barrier,
|
|
|
+ _ => Cell::Empty
|
|
|
+ };
|
|
|
+
|
|
|
+ *current_cell = updated_cell;
|
|
|
+ if cursor_x == MAP_WIDTH -1 {
|
|
|
+ cursor_y = (cursor_y + 1).rem_euclid(MAP_HEIGHT);
|
|
|
+ }
|
|
|
+
|
|
|
+ cursor_x = (cursor_x + 1).rem_euclid(MAP_WIDTH);
|
|
|
+ },
|
|
|
+ Key::Char('q') => {
|
|
|
+ running = false;
|
|
|
+ },
|
|
|
+ Key::Char('1') => { unused_piece = 1; println!("Unused: {}", unused_piece); }
|
|
|
+ Key::Char('2') => { unused_piece = 2; println!("Unused: {}", unused_piece); }
|
|
|
+ Key::Char('3') => { unused_piece = 3; println!("Unused: {}", unused_piece); }
|
|
|
+ Key::Char('4') => { unused_piece = 4; println!("Unused: {}", unused_piece); }
|
|
|
+ Key::Char('5') => { unused_piece = 5; println!("Unused: {}", unused_piece); }
|
|
|
+ Key::Char('6') => { unused_piece = 6; println!("Unused: {}", unused_piece); }
|
|
|
+ Key::Char('7') => { unused_piece = 7; println!("Unused: {}", unused_piece); }
|
|
|
+ Key::Enter => {
|
|
|
+ running = false;
|
|
|
+ let mut used_parts = vec!();
|
|
|
+ for (part_id, part) in generate_parts() {
|
|
|
+ if part_id != unused_piece {
|
|
|
+ used_parts.push((part_id, part));
|
|
|
+ println!("Adding {}", part_id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let result = solve(&mut map, &used_parts[..]);
|
|
|
+ print_map(&mut t, &map);
|
|
|
+ }
|
|
|
+ _ => {}
|
|
|
+ };
|
|
|
+ }
|
|
|
+ //let mut map : Map = [
|
|
|
+ // [B, B, E, E, E, B, B, B, E, E, E, B, B, B, B, B],
|
|
|
+ // [B, E, E, E, E, E, B, B, B, E, E, E, B, B, B, B],
|
|
|
+ // [E, E, E, E, E, E, B, B, E, E, E, E, E, E, B, B],
|
|
|
+ // [E, E, E, B, E, B, B, B, E, E, E, E, E, B, B, B],
|
|
|
+ // [B, B, B, B, B, B, B, B, B, B, B, E, B, B, B, B],
|
|
|
+ //];
|
|
|
+
|
|
|
+ //let parts : Vec<(PartID, Part)> = generate_parts();
|
|
|
+
|
|
|
+ //print_map(&map);
|
|
|
+ //let result = solve(&mut map, &parts[1..7], true);
|
|
|
+ //assert!(result.is_some());
|
|
|
+ //print_map(&map);
|
|
|
+ //
|
|
|
+
|
|
|
|
|
|
- print_map(&map);
|
|
|
- let result = solve(&mut map, &parts[1..]);
|
|
|
- assert!(result.is_some());
|
|
|
- print_map(&map);
|
|
|
}
|
|
|
+
|
|
|
+
|