first steps

This commit is contained in:
2023-11-08 06:52:20 +01:00
commit 0ef034f14f
8 changed files with 604 additions and 0 deletions

7
src/game.rs Normal file
View 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
View 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
View 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
View 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
View 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,
}
}
}