Spawn a random amount of squirrels on the map
This commit is contained in:
		@@ -1,4 +1,5 @@
 | 
			
		||||
import sys
 | 
			
		||||
from random import randint
 | 
			
		||||
from typing import Any
 | 
			
		||||
 | 
			
		||||
from .entities.player import Player
 | 
			
		||||
@@ -51,6 +52,7 @@ class Game:
 | 
			
		||||
        self.player = Player()
 | 
			
		||||
        self.player.move(1, 6)
 | 
			
		||||
        self.map.add_entity(self.player)
 | 
			
		||||
        self.map.spawn_random_entities(randint(1, 5))
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def load_game(filename: str) -> None:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
from enum import Enum, auto
 | 
			
		||||
from random import randint
 | 
			
		||||
from typing import List
 | 
			
		||||
 | 
			
		||||
from dungeonbattle.display.texturepack import TexturePack
 | 
			
		||||
 | 
			
		||||
@@ -11,7 +13,7 @@ class Map:
 | 
			
		||||
    """
 | 
			
		||||
    width: int
 | 
			
		||||
    height: int
 | 
			
		||||
    tiles: list
 | 
			
		||||
    tiles: List[List["Tile"]]
 | 
			
		||||
    # coordinates of the point that should be
 | 
			
		||||
    # on the topleft corner of the screen
 | 
			
		||||
    currentx: int
 | 
			
		||||
@@ -30,8 +32,16 @@ class Map:
 | 
			
		||||
        self.entities.append(entity)
 | 
			
		||||
        entity.map = self
 | 
			
		||||
 | 
			
		||||
    def is_free(self, y: int, x: int) -> bool:
 | 
			
		||||
        """
 | 
			
		||||
        Indicates that the case at the coordinates (y, x) is empty.
 | 
			
		||||
        """
 | 
			
		||||
        return 0 <= y < self.height and 0 <= x < self.width and \
 | 
			
		||||
            self.tiles[y][x].can_walk() and \
 | 
			
		||||
            not any(entity.x == x and entity.y == y for entity in self.entities)
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def load(filename: str):
 | 
			
		||||
    def load(filename: str) -> "Map":
 | 
			
		||||
        """
 | 
			
		||||
        Read a file that contains the content of a map, and build a Map object.
 | 
			
		||||
        """
 | 
			
		||||
@@ -40,7 +50,7 @@ class Map:
 | 
			
		||||
        return Map.load_from_string(file)
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def load_from_string(content: str):
 | 
			
		||||
    def load_from_string(content: str) -> "Map":
 | 
			
		||||
        """
 | 
			
		||||
        Load a map represented by its characters and build a Map object.
 | 
			
		||||
        """
 | 
			
		||||
@@ -61,6 +71,22 @@ class Map:
 | 
			
		||||
        return "\n".join("".join(tile.char(pack) for tile in line)
 | 
			
		||||
                         for line in self.tiles)
 | 
			
		||||
 | 
			
		||||
    def spawn_random_entities(self, count: int) -> None:
 | 
			
		||||
        """
 | 
			
		||||
        Put randomly {count} squirrels on the map, where it is available.
 | 
			
		||||
        """
 | 
			
		||||
        for _ in range(count):
 | 
			
		||||
            y, x = 0, 0
 | 
			
		||||
            while True:
 | 
			
		||||
                y, x = randint(0, self.height - 1), randint(0, self.width - 1)
 | 
			
		||||
                tile = self.tiles[y][x]
 | 
			
		||||
                if tile.can_walk():
 | 
			
		||||
                    break
 | 
			
		||||
            from dungeonbattle.entities.monsters import Squirrel
 | 
			
		||||
            squirrel = Squirrel()
 | 
			
		||||
            squirrel.move(y, x)
 | 
			
		||||
            self.add_entity(squirrel)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Tile(Enum):
 | 
			
		||||
    EMPTY = auto()
 | 
			
		||||
@@ -84,7 +110,7 @@ class Tile(Enum):
 | 
			
		||||
        """
 | 
			
		||||
        Check if an entity (player or not) can move in this tile.
 | 
			
		||||
        """
 | 
			
		||||
        return not self.is_wall()
 | 
			
		||||
        return not self.is_wall() and self != Tile.EMPTY
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Entity:
 | 
			
		||||
@@ -99,10 +125,10 @@ class Entity:
 | 
			
		||||
 | 
			
		||||
    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:
 | 
			
		||||
        free = self.map.is_free(y, x)
 | 
			
		||||
        if free and move_if_possible:
 | 
			
		||||
            self.move(y, x)
 | 
			
		||||
        return tile.can_walk()
 | 
			
		||||
        return free
 | 
			
		||||
 | 
			
		||||
    def move(self, y: int, x: int) -> None:
 | 
			
		||||
        self.y = y
 | 
			
		||||
 
 | 
			
		||||
@@ -31,5 +31,5 @@ class TestInterfaces(unittest.TestCase):
 | 
			
		||||
        self.assertFalse(Tile.EMPTY.is_wall())
 | 
			
		||||
        self.assertTrue(Tile.FLOOR.can_walk())
 | 
			
		||||
        self.assertFalse(Tile.WALL.can_walk())
 | 
			
		||||
        self.assertTrue(Tile.EMPTY.can_walk())
 | 
			
		||||
        self.assertFalse(Tile.EMPTY.can_walk())
 | 
			
		||||
        self.assertRaises(ValueError, Tile.from_ascii_char, 'unknown')
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user