diff --git a/dungeonbattle/interfaces.py b/dungeonbattle/interfaces.py index 02bf5eb..a312d34 100644 --- a/dungeonbattle/interfaces.py +++ b/dungeonbattle/interfaces.py @@ -3,6 +3,10 @@ from enum import Enum class Map: + """ + Object that represents a Map with its width, height + and the whole tiles, with their custom properties. + """ width: int height: int tiles: list @@ -14,12 +18,18 @@ class Map: @staticmethod def load(filename: str): + """ + Read a file that contains the content of a map, and build a Map object. + """ with open(filename, "r") as f: file = f.read() return Map.load_from_string(file) @staticmethod def load_from_string(content: str): + """ + Load a map represented by its characters and build a Map object. + """ lines = content.split("\n") lines = [line for line in lines if line] height = len(lines) @@ -29,6 +39,10 @@ class Map: return Map(width, height, tiles) def draw_string(self) -> str: + """ + Draw the current map as a string object that can be rendered + in the window. + """ return "\n".join("".join(tile.value for tile in line) for line in self.tiles) @@ -42,6 +56,9 @@ class Tile(Enum): return self == Tile.WALL def can_walk(self) -> bool: + """ + Check if an entity (player or not) can move in this tile. + """ return not self.is_wall() diff --git a/dungeonbattle/interfaces_test.py b/dungeonbattle/interfaces_test.py index dc8932a..34a50f9 100644 --- a/dungeonbattle/interfaces_test.py +++ b/dungeonbattle/interfaces_test.py @@ -5,6 +5,9 @@ from dungeonbattle.interfaces import Map class TestInterfaces(unittest.TestCase): def test_map(self) -> None: + """ + Create a map and check that it is well parsed. + """ m = Map.load_from_string(".#\n#.\n") self.assertEqual(m.width, 2) self.assertEqual(m.height, 2) diff --git a/dungeonbattle/proof_of_concept.py b/dungeonbattle/proof_of_concept.py index 8db5aeb..2034cbf 100644 --- a/dungeonbattle/proof_of_concept.py +++ b/dungeonbattle/proof_of_concept.py @@ -1,22 +1,29 @@ -#!/usr/bin/env python from .interfaces import Map from .term_manager import TermManager def proof_of_concept() -> None: + """ + Read an example map, parse it, then the (squirrel) player can move freely. + """ + # Load the example map m = Map.load("example_map.txt") + # Create the context manager to manipulate the screen with TermManager() as term_manager: stdscr = term_manager.screen + # Draw the full map stdscr.addstr(0, 0, m.draw_string()) stdscr.refresh() cur = [1, 6] # (y,x) + # We are a squirrel stdscr.addstr(1, 6, '🐿️') stdscr.refresh() while True: + # Get movements of the user key = stdscr.getkey() stdscr.addstr(cur[0], cur[1], '.') next_pos = cur[:] @@ -28,8 +35,11 @@ def proof_of_concept() -> None: next_pos[1] = cur[1] - 1 if key == 'd' or key == 'KEY_RIGHT': next_pos[1] = cur[1] + 1 + # Check if we stay in the bounds if 0 <= next_pos[0] < m.height and 0 <= next_pos[0] < m.width: next_tile = m.tiles[next_pos[0]][next_pos[1]] + # Check if the new position is valid if next_tile.can_walk(): cur = next_pos + # Draw the squirrel stdscr.addstr(cur[0], cur[1], '🐿️')