Feature: Add skeleton for the tank.
This commit is contained in:
parent
38b2677ed1
commit
02282901fa
6 changed files with 88 additions and 60 deletions
17
src/main.rs
17
src/main.rs
|
@ -5,23 +5,13 @@ use rand::Rng;
|
||||||
|
|
||||||
use crate::Direction::Left;
|
use crate::Direction::Left;
|
||||||
use crate::movable::Movable;
|
use crate::movable::Movable;
|
||||||
use crate::ufo::Ufo;
|
use crate::movable::tank::Tank;
|
||||||
|
use crate::movable::ufo::Ufo;
|
||||||
|
|
||||||
mod movable;
|
|
||||||
mod terminal;
|
mod terminal;
|
||||||
mod ufo;
|
mod movable;
|
||||||
mod tank;
|
|
||||||
|
|
||||||
const WIDTH: u16 = 160;
|
|
||||||
const HEIGHT: u16 = 40;
|
|
||||||
const HEADER_ROW: u16 = 0;
|
|
||||||
const FOOTER_ROW: u16 = HEIGHT - 1;
|
|
||||||
const TANK_ROW: u16 = FOOTER_ROW - 1;
|
|
||||||
const MIN_UFO_ROW: u16 = 1;
|
|
||||||
const MAX_UFO_ROW: u16 = TANK_ROW - 5;
|
|
||||||
const DELAY: Duration = Duration::from_millis(10);
|
const DELAY: Duration = Duration::from_millis(10);
|
||||||
const UFO_STR: &str = "<=000=>";
|
|
||||||
const TANK_STR: &str = "⊆≡≣🠭≣≡⊇";
|
|
||||||
|
|
||||||
const VERSION: &str = env!("CARGO_PKG_VERSION");
|
const VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||||
|
|
||||||
|
@ -29,6 +19,7 @@ fn main() {
|
||||||
let terminal = terminal::setup();
|
let terminal = terminal::setup();
|
||||||
|
|
||||||
const MAX_UFOS: u8 = 100;
|
const MAX_UFOS: u8 = 100;
|
||||||
|
let mut tank = Tank::create();
|
||||||
let mut ufos = vec![Ufo::create(), Ufo::create(), Ufo::create(), Ufo::create(), Ufo::create()];
|
let mut ufos = vec![Ufo::create(), Ufo::create(), Ufo::create(), Ufo::create(), Ufo::create()];
|
||||||
let mut n_ufos = ufos.len() as u8;
|
let mut n_ufos = ufos.len() as u8;
|
||||||
loop {
|
loop {
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
use crate::Direction;
|
use crate::Direction;
|
||||||
|
|
||||||
|
pub mod ufo;
|
||||||
|
pub mod tank;
|
||||||
|
|
||||||
pub trait Movable<T> {
|
pub trait Movable<T> {
|
||||||
fn create() -> T;
|
fn create() -> T;
|
||||||
fn mov(&mut self, direction: Direction);
|
fn mov(&mut self, direction: Direction);
|
54
src/movable/tank.rs
Normal file
54
src/movable/tank.rs
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
use Direction::{Left, Right};
|
||||||
|
|
||||||
|
use crate::Direction;
|
||||||
|
use crate::movable::Movable;
|
||||||
|
use crate::terminal::{clear_pos, print_str_at, TANK_ROW, WIDTH};
|
||||||
|
|
||||||
|
const TANK_STR: &str = "⊆≡≣🠭≣≡⊇";
|
||||||
|
|
||||||
|
pub struct Tank {
|
||||||
|
column: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Movable<Tank> for Tank {
|
||||||
|
fn create() -> Tank {
|
||||||
|
let column = (WIDTH - (TANK_STR.len() as u16)) / 2;
|
||||||
|
let tank = Tank { column };
|
||||||
|
tank.draw();
|
||||||
|
tank
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mov(&mut self, direction: Direction) {
|
||||||
|
clear(self, &direction);
|
||||||
|
match direction {
|
||||||
|
Left => { todo!("Implement moving left") }
|
||||||
|
Right => { todo!("Implement moving right") }
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw(&self) {
|
||||||
|
print_str_at(self.column, TANK_ROW, TANK_STR);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_on_screen(&self) -> bool {
|
||||||
|
todo!("Implement tank visibility check")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn clear(tank: &Tank, direction: &Direction) {
|
||||||
|
match direction {
|
||||||
|
Left => {
|
||||||
|
let right_col = tank.column + (TANK_STR.len() as u16) - 1;
|
||||||
|
if right_col >= TANK_STR.len() as u16 && right_col < WIDTH {
|
||||||
|
clear_pos(right_col, TANK_ROW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Right => {
|
||||||
|
if tank.column < WIDTH - (TANK_STR.len() as u16) {
|
||||||
|
clear_pos(tank.column, TANK_ROW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,10 +2,12 @@ use std::cmp::{max, min};
|
||||||
|
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
use crate::{Direction, MAX_UFO_ROW, MIN_UFO_ROW, UFO_STR, WIDTH};
|
use crate::Direction;
|
||||||
use crate::Direction::{Down, Left, Right};
|
use crate::Direction::{Left, Right};
|
||||||
use crate::movable::Movable;
|
use crate::movable::Movable;
|
||||||
use crate::terminal::{clear_pos, print_str_at};
|
use crate::terminal::{clear_pos, MAX_UFO_ROW, MIN_UFO_ROW, print_str_at, WIDTH};
|
||||||
|
|
||||||
|
const UFO_STR: &str = "<=000=>";
|
||||||
|
|
||||||
pub struct Ufo {
|
pub struct Ufo {
|
||||||
row: u16,
|
row: u16,
|
||||||
|
@ -31,27 +33,22 @@ impl Movable<Ufo> for Ufo {
|
||||||
ufo
|
ufo
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mov(&mut self, direction: Direction) {
|
fn mov(&mut self, _direction: Direction) {
|
||||||
clear(self);
|
clear(self);
|
||||||
|
|
||||||
match direction {
|
match self.direction {
|
||||||
Down => { todo!("Implement crash movement (down + direction)") }
|
Left => {
|
||||||
_ => {
|
let ufo_str_len = UFO_STR.len() as i16;
|
||||||
match self.direction {
|
if self.column >= -ufo_str_len {
|
||||||
Left => {
|
self.column -= 1;
|
||||||
let ufo_str_len = UFO_STR.len() as i16;
|
}
|
||||||
if self.column >= -ufo_str_len {
|
|
||||||
self.column -= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Right => {
|
|
||||||
if self.column <= WIDTH as i16 {
|
|
||||||
self.column += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => { /* Ignore, this can't be the case. */ }
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
Right => {
|
||||||
|
if self.column <= WIDTH as i16 {
|
||||||
|
self.column += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => { /* Ignore, this can't be the case. */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
self.draw();
|
self.draw();
|
25
src/tank.rs
25
src/tank.rs
|
@ -1,25 +0,0 @@
|
||||||
use crate::movable::Movable;
|
|
||||||
use crate::{Direction, TANK_STR, WIDTH};
|
|
||||||
|
|
||||||
pub struct Tank {
|
|
||||||
column: u16,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Movable<Tank> for Tank {
|
|
||||||
fn create() -> Tank {
|
|
||||||
let column = (WIDTH - TANK_STR.len() as u16) / 2;
|
|
||||||
Tank { column }
|
|
||||||
}
|
|
||||||
|
|
||||||
fn mov(&mut self, direction: Direction) {
|
|
||||||
todo!("Implement tank movement")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn draw(&self) {
|
|
||||||
todo!("Implement drawing tank")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn is_on_screen(&self) -> bool {
|
|
||||||
todo!("Implement tank visibility check")
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -5,7 +5,15 @@ use crossterm::cursor::{Hide, MoveTo, RestorePosition, SavePosition, Show};
|
||||||
use crossterm::style::Print;
|
use crossterm::style::Print;
|
||||||
use crossterm::terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, SetSize, size};
|
use crossterm::terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, SetSize, size};
|
||||||
|
|
||||||
use crate::{FOOTER_ROW, HEADER_ROW, HEIGHT, VERSION, WIDTH};
|
use crate::VERSION;
|
||||||
|
|
||||||
|
pub const WIDTH: u16 = 160;
|
||||||
|
pub const HEIGHT: u16 = 40;
|
||||||
|
const HEADER_ROW: u16 = 0;
|
||||||
|
const FOOTER_ROW: u16 = HEIGHT - 1;
|
||||||
|
pub const TANK_ROW: u16 = FOOTER_ROW - 1;
|
||||||
|
pub const MIN_UFO_ROW: u16 = 1;
|
||||||
|
pub const MAX_UFO_ROW: u16 = TANK_ROW - 5;
|
||||||
|
|
||||||
pub struct Terminal {
|
pub struct Terminal {
|
||||||
cols: u16,
|
cols: u16,
|
||||||
|
|
Loading…
Reference in a new issue