From 8641e7d13db02cfd6b0896ace7e0fd66ab416879 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 6 Nov 2020 17:48:47 +0100 Subject: [PATCH 1/3] User player entity instead of temporary Player class --- dungeonbattle/entities/player.py | 12 ++++++++++++ dungeonbattle/game.py | 22 +++------------------- dungeonbattle/mapdisplay.py | 9 ++++----- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/dungeonbattle/entities/player.py b/dungeonbattle/entities/player.py index 9037236..8b5bc3a 100644 --- a/dungeonbattle/entities/player.py +++ b/dungeonbattle/entities/player.py @@ -4,3 +4,15 @@ from ..interfaces import FightingEntity class Player(FightingEntity): maxhealth = 20 strength = 5 + + def move_up(self) -> None: + self.y -= 1 + + def move_down(self) -> None: + self.y += 1 + + def move_left(self) -> None: + self.x -= 1 + + def move_right(self) -> None: + self.x += 1 diff --git a/dungeonbattle/game.py b/dungeonbattle/game.py index 197f0de..5e0acad 100644 --- a/dungeonbattle/game.py +++ b/dungeonbattle/game.py @@ -1,5 +1,6 @@ from typing import Any +from .entities.player import Player from .interfaces import Map from .mapdisplay import MapDisplay from .settings import Settings @@ -22,8 +23,8 @@ class Game: m = Map.load("example_map.txt") player = Player() self.player = player - player.y = 1 - player.x = 6 + m.entities.append(player) + player.move(1, 6) d = MapDisplay(m, player) while True: screen.clear() @@ -43,20 +44,3 @@ class Game: if key == 'd' or key == 'KEY_RIGHT': self.player.move_right() - -class Player: - # FIXME Should be elsewhere, only useful to don't break the previous code - y: int = 0 - x: int = 0 - - def move_up(self) -> None: - self.y -= 1 - - def move_down(self) -> None: - self.y += 1 - - def move_left(self) -> None: - self.x -= 1 - - def move_right(self) -> None: - self.x += 1 diff --git a/dungeonbattle/mapdisplay.py b/dungeonbattle/mapdisplay.py index 404e267..fdc87ba 100644 --- a/dungeonbattle/mapdisplay.py +++ b/dungeonbattle/mapdisplay.py @@ -1,22 +1,21 @@ #!/usr/bin/env python import curses -from typing import Any +from dungeonbattle.entities.player import Player from dungeonbattle.interfaces import Map class MapDisplay: - def __init__(self, m: Map, player: Any): - # TODO Type the player field with the good type + def __init__(self, m: Map, player: Player): self.map = m self.pad = curses.newpad(m.height, m.width + 1) self.player = player def update_pad(self) -> None: self.pad.addstr(0, 0, self.map.draw_string()) + # TODO Not all entities should be a player for e in self.map.entities: - self.pad.addch(e.y, e.x, e.img) - self.pad.addstr(self.player.getPosY(), self.player.getPosX(), '🐿') + self.pad.addstr(e.y, e.x, '🐿') def display(self, y: int, x: int) -> None: deltay, deltax = (curses.LINES // 2) + 1, (curses.COLS // 2) + 1 From 54bb2d14164ffd904a26e203c98981645eb241ed Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 6 Nov 2020 17:59:19 +0100 Subject: [PATCH 2/3] Collisions are working --- dungeonbattle/entities/player.py | 8 ++++---- dungeonbattle/game.py | 3 +-- dungeonbattle/interfaces.py | 22 ++++++++++++++++++---- dungeonbattle/tests/entities_test.py | 4 ++-- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/dungeonbattle/entities/player.py b/dungeonbattle/entities/player.py index 8b5bc3a..53f0ccf 100644 --- a/dungeonbattle/entities/player.py +++ b/dungeonbattle/entities/player.py @@ -6,13 +6,13 @@ class Player(FightingEntity): strength = 5 def move_up(self) -> None: - self.y -= 1 + self.check_move(self.y - 1, self.x, True) def move_down(self) -> None: - self.y += 1 + self.check_move(self.y + 1, self.x, True) def move_left(self) -> None: - self.x -= 1 + self.check_move(self.y, self.x - 1, True) def move_right(self) -> None: - self.x += 1 + self.check_move(self.y, self.x + 1, True) diff --git a/dungeonbattle/game.py b/dungeonbattle/game.py index 5e0acad..8f5bb5a 100644 --- a/dungeonbattle/game.py +++ b/dungeonbattle/game.py @@ -23,7 +23,7 @@ class Game: m = Map.load("example_map.txt") player = Player() self.player = player - m.entities.append(player) + m.add_entity(player) player.move(1, 6) d = MapDisplay(m, player) while True: @@ -43,4 +43,3 @@ class Game: self.player.move_left() if key == 'd' or key == 'KEY_RIGHT': self.player.move_right() - diff --git a/dungeonbattle/interfaces.py b/dungeonbattle/interfaces.py index 6546523..f9d177d 100644 --- a/dungeonbattle/interfaces.py +++ b/dungeonbattle/interfaces.py @@ -11,12 +11,18 @@ class Map: height: int tiles: list - def __init__(self, width: int, height: int, tiles: list, - entities: list = None): + def __init__(self, width: int, height: int, tiles: list): self.width = width self.height = height self.tiles = tiles - self.entities = entities or [] + self.entities = [] + + def add_entity(self, entity: "Entity") -> None: + """ + Register a new entity in the map. + """ + self.entities.append(entity) + entity.map = self @staticmethod def load(filename: str): @@ -39,7 +45,7 @@ class Map: tiles = [[Tile(c) for x, c in enumerate(line)] for y, line in enumerate(lines)] - return Map(width, height, tiles, []) + return Map(width, height, tiles) def draw_string(self) -> str: """ @@ -68,11 +74,19 @@ class Tile(Enum): class Entity: y: int x: int + map: Map def __init__(self): self.y = 0 self.x = 0 + def check_move(self, y: int, x: int, move_if_possible: bool = False)\ + -> bool: + tile = self.map.tiles[y][x] + if tile.can_walk() and move_if_possible: + self.move(y, x) + return tile.can_walk() + def move(self, y: int, x: int) -> None: self.y = y self.x = x diff --git a/dungeonbattle/tests/entities_test.py b/dungeonbattle/tests/entities_test.py index f7d75f1..043919a 100644 --- a/dungeonbattle/tests/entities_test.py +++ b/dungeonbattle/tests/entities_test.py @@ -59,8 +59,8 @@ class TestEntities(unittest.TestCase): """ item = Bomb() squirrel = Squirrel() - self.map.entities.append(item) - self.map.entities.append(squirrel) + self.map.add_entity(item) + self.map.add_entity(squirrel) squirrel.health = 2 squirrel.move(41, 42) item.act(self.map) From d06a42469a5fd53d9e9c76d4148d3e866fc3b417 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 6 Nov 2020 18:03:30 +0100 Subject: [PATCH 3/3] Collisions are working --- dungeonbattle/entities/player.py | 16 ++++++++-------- dungeonbattle/tests/entities_test.py | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/dungeonbattle/entities/player.py b/dungeonbattle/entities/player.py index 53f0ccf..df96b29 100644 --- a/dungeonbattle/entities/player.py +++ b/dungeonbattle/entities/player.py @@ -5,14 +5,14 @@ class Player(FightingEntity): maxhealth = 20 strength = 5 - def move_up(self) -> None: - self.check_move(self.y - 1, self.x, True) + def move_up(self) -> bool: + return self.check_move(self.y - 1, self.x, True) - def move_down(self) -> None: - self.check_move(self.y + 1, self.x, True) + def move_down(self) -> bool: + return self.check_move(self.y + 1, self.x, True) - def move_left(self) -> None: - self.check_move(self.y, self.x - 1, True) + def move_left(self) -> bool: + return self.check_move(self.y, self.x - 1, True) - def move_right(self) -> None: - self.check_move(self.y, self.x + 1, True) + def move_right(self) -> bool: + return self.check_move(self.y, self.x + 1, True) diff --git a/dungeonbattle/tests/entities_test.py b/dungeonbattle/tests/entities_test.py index 043919a..7b7902b 100644 --- a/dungeonbattle/tests/entities_test.py +++ b/dungeonbattle/tests/entities_test.py @@ -76,6 +76,22 @@ class TestEntities(unittest.TestCase): Test some random stuff with players. """ player = Player() + self.map.add_entity(player) + player.move(1, 6) self.assertEqual(player.strength, 5) self.assertEqual(player.health, player.maxhealth) self.assertEqual(player.maxhealth, 20) + + # Test movements and ensure that collisions are working + self.assertFalse(player.move_up()) + self.assertTrue(player.move_left()) + self.assertFalse(player.move_left()) + for i in range(8): + self.assertTrue(player.move_down()) + self.assertFalse(player.move_down()) + self.assertTrue(player.move_right()) + self.assertTrue(player.move_right()) + self.assertTrue(player.move_right()) + self.assertFalse(player.move_right()) + self.assertTrue(player.move_down()) + self.assertTrue(player.move_down())