first steps
This commit is contained in:
7
src/game.rs
Normal file
7
src/game.rs
Normal file
@@ -0,0 +1,7 @@
|
||||
use crate::level::Level;
|
||||
use crate::player::Player;
|
||||
|
||||
pub struct Game {
|
||||
pub player: Player,
|
||||
pub levels: [Level; 25]
|
||||
}
|
||||
38
src/level.rs
Normal file
38
src/level.rs
Normal file
@@ -0,0 +1,38 @@
|
||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||
enum LevelElement {
|
||||
Wall,
|
||||
Floor,
|
||||
StairDown,
|
||||
StairUp,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||
pub struct Level {
|
||||
structure: [[LevelElement; 25]; 80],
|
||||
}
|
||||
|
||||
impl Level {
|
||||
pub fn new() -> Level {
|
||||
let mut s = [[LevelElement::Wall; 25]; 80];
|
||||
s[4][4] = LevelElement::StairDown;
|
||||
s[75][20] = LevelElement::StairUp;
|
||||
Level {
|
||||
structure: s
|
||||
}
|
||||
}
|
||||
pub fn get_element(&self, x: usize, y: usize) -> Option<LevelElement> {
|
||||
if x >= 80 || y >= 25 {
|
||||
return None;
|
||||
}
|
||||
Some(self.structure[x][y])
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_element() {
|
||||
let l = Level::new();
|
||||
assert_eq!(l.get_element(0, 0).unwrap(), LevelElement::Wall);
|
||||
assert_eq!(l.get_element(4, 4).unwrap(), LevelElement::StairDown);
|
||||
assert_eq!(l.get_element(79, 24).unwrap(), LevelElement::Wall);
|
||||
assert_eq!(l.get_element(80, 25), None);
|
||||
}
|
||||
16
src/main.rs
Normal file
16
src/main.rs
Normal file
@@ -0,0 +1,16 @@
|
||||
use crate::game::Game;
|
||||
use crate::level::Level;
|
||||
use crate::player::Player;
|
||||
|
||||
mod game;
|
||||
mod player;
|
||||
mod level;
|
||||
mod position;
|
||||
|
||||
fn main() {
|
||||
let g = Game {
|
||||
player: Player::new("Teddy Tester", 10),
|
||||
levels: [Level::new();25]
|
||||
};
|
||||
println!("{}",g.player.get_name());
|
||||
}
|
||||
54
src/player.rs
Normal file
54
src/player.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
use std::cmp::{max, min};
|
||||
use crate::position::Position;
|
||||
|
||||
pub struct Player {
|
||||
name: String,
|
||||
position: Position,
|
||||
life: i16,
|
||||
max_life: i16,
|
||||
}
|
||||
|
||||
impl Player {
|
||||
pub fn new(name: &str, max_life: i16) -> Player {
|
||||
Player {
|
||||
name: name.to_string(),
|
||||
position: Position::new(0, 1, 1),
|
||||
life: max_life,
|
||||
max_life,
|
||||
}
|
||||
}
|
||||
pub fn get_name(&self) -> String {
|
||||
return self.name.clone();
|
||||
}
|
||||
pub fn change_life(&mut self, by: i16) {
|
||||
self.life = max(0, min(self.max_life, self.life + by));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_name() {
|
||||
let p = Player {
|
||||
name: "Teddy Tester".to_string(),
|
||||
position: Position::new(0, 1, 1),
|
||||
life: 5,
|
||||
max_life: 10,
|
||||
};
|
||||
assert_eq!(p.get_name(), "Teddy Tester");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_change_life() {
|
||||
let mut p = Player {
|
||||
name: "Teddy Tester".to_string(),
|
||||
position: Position::new(0, 1, 1),
|
||||
life: 5,
|
||||
max_life: 10,
|
||||
};
|
||||
assert_eq!(p.life, 5);
|
||||
p.change_life(-2);
|
||||
assert_eq!(p.life, 3);
|
||||
p.change_life(10);
|
||||
assert_eq!(p.life, 10);
|
||||
p.change_life(-12);
|
||||
assert_eq!(p.life, 0);
|
||||
}
|
||||
15
src/position.rs
Normal file
15
src/position.rs
Normal file
@@ -0,0 +1,15 @@
|
||||
pub struct Position {
|
||||
level: u8,
|
||||
x: u8,
|
||||
y: u8,
|
||||
}
|
||||
|
||||
impl Position {
|
||||
pub fn new(level: u8, x: u8, y: u8) -> Self {
|
||||
Self {
|
||||
level,
|
||||
x,
|
||||
y,
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user