Код IT
← Каталог

Python — диаблоид — `systems/ai_system.py`

Фрагмент из «Python — диаблоид»: `systems/ai_system.py`.

python spinoffencyclopedia9-04-razrabotka-igr-praktikum-razrabotki-igr-6 embed URL статья в энциклопедии
Python main.py
import math
import random

from core.config import ENEMIES_PER_FLOOR, ENEMY_BASE_DAMAGE, ENEMY_BASE_HP, floor_mult
from entities.enemy import EnemyEntity
from entities.player import PlayerEntity
from world.collision import can_occupy, move_slide
from world.map import GameMap


class AISystem:
    def spawn_enemies(self, game_map: GameMap, floor: int) -> list[EnemyEntity]:
        enemies: list[EnemyEntity] = []
        rng = random.Random(floor * 999)
        scale = floor_mult(floor)
        target = int(ENEMIES_PER_FLOOR * (1 + floor * 0.05))
        attempts = 0
        while len(enemies) < target and attempts < 400:
            attempts += 1
            tx = rng.randint(2, len(game_map.grid[0]) - 3)
            ty = rng.randint(2, len(game_map.grid) - 3)
            wx, wy = tx + 0.5, ty + 0.5
            if not can_occupy(game_map, wx, wy):
                continue
            if (tx, ty) in (game_map.start_tile, game_map.exit_tile):
                continue
            hp = ENEMY_BASE_HP * scale
            dmg = ENEMY_BASE_DAMAGE * scale
            enemies.append(EnemyEntity(wx, wy, hp=hp, max_hp=hp, damage=dmg))
        return enemies

    def update(
        self,
        enemies: list[EnemyEntity],
        player: PlayerEntity,
        game_map: GameMap,
        dt: float,
    ) -> None:
        for enemy in enemies:
            if not enemy.alive:
                continue
            dx, dy = player.x - enemy.x, player.y - enemy.y
            dist = math.hypot(dx, dy)
            if dist < 0.15:
                player.stats.hp -= enemy.damage * dt * 2.5
                continue
            if dist > 0.01:
                speed = 85.0 * dt * 0.012
                mx = (dx / dist) * speed
                my = (dy / dist) * speed
                enemy.x, enemy.y = move_slide(game_map, enemy.x, enemy.y, mx, my)
import math
import random

from core.config import ENEMIES_PER_FLOOR, ENEMY_BASE_DAMAGE, ENEMY_BASE_HP, floor_mult
from entities.enemy import EnemyEntity
from entities.player import PlayerEntity
from world.collision import can_occupy, move_slide
from world.map import GameMap


class AISystem:
    def spawn_enemies(self, game_map: GameMap, floor: int) -> list[EnemyEntity]:
        enemies: list[EnemyEntity] = []
        rng = random.Random(floor * 999)
        scale = floor_mult(floor)
        target = int(ENEMIES_PER_FLOOR * (1 + floor * 0.05))
        attempts = 0
        while len(enemies) < target and attempts < 400:
            attempts += 1
            tx = rng.randint(2, len(game_map.grid[0]) - 3)
            ty = rng.randint(2, len(game_map.grid) - 3)
            wx, wy = tx + 0.5, ty + 0.5
            if not can_occupy(game_map, wx, wy):
                continue
            if (tx, ty) in (game_map.start_tile, game_map.exit_tile):
                continue
            hp = ENEMY_BASE_HP * scale
            dmg = ENEMY_BASE_DAMAGE * scale
            enemies.append(EnemyEntity(wx, wy, hp=hp, max_hp=hp, damage=dmg))
        return enemies

    def update(
        self,
        enemies: list[EnemyEntity],
        player: PlayerEntity,
        game_map: GameMap,
        dt: float,
    ) -> None:
        for enemy in enemies:
            if not enemy.alive:
                continue
            dx, dy = player.x - enemy.x, player.y - enemy.y
            dist = math.hypot(dx, dy)
            if dist < 0.15:
                player.stats.hp -= enemy.damage * dt * 2.5
                continue
            if dist > 0.01:
                speed = 85.0 * dt * 0.012
                mx = (dx / dist) * speed
                my = (dy / dist) * speed
                enemy.x, enemy.y = move_slide(game_map, enemy.x, enemy.y, mx, my)