JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
core::GridDistanceField Class Reference

Distance de plus court chemin en nombre de cases (4-connexité, respectant les cases statiquement solides d'un core::TileMap), pré-calculée une fois par BFS multi-source depuis une case cible. More...

#include <GridDistanceField.h>

Public Member Functions

 GridDistanceField (const core::TileMap &tileMap, const core::GridPosition &target)
 Calcule le champ par BFS à partir de l'unique case target.
 GridDistanceField (const core::TileMap &tileMap, const std::vector< core::GridPosition > &targets)
 Calcule le champ par BFS multi-source à partir de targets.
int distance (const core::GridPosition &position) const noexcept
 Distance de plus court chemin, en nombre de cases, depuis position jusqu'à la case cible passée au constructeur.
bool isReachable (const core::GridPosition &position) const noexcept
 La cible est-elle atteignable depuis position par un chemin de cases non solides ?
int unreachableDistance () const noexcept

Private Attributes

int _width
int _height
std::vector< int > _distances

Detailed Description

Distance de plus court chemin en nombre de cases (4-connexité, respectant les cases statiquement solides d'un core::TileMap), pré-calculée une fois par BFS multi-source depuis une case cible.

Sert de base à la récompense de progression (EX-IA-023). La propriété recherchée est que tout pas rapprochant du but sur un chemin réellement empruntable soit récompensé, y compris un détour imposé par un mur : une distance à vol d'oiseau pénaliserait ce détour, et dirigerait donc l'agent contre la seule solution disponible.

Le coût est borné par construction : un unique BFS à quatre voisins, sans pondération ni replanification, puis des lectures O(1). La distance se compte en nombre de cases, jamais en coût de déplacement – il n'y a pas de planificateur de chemin ici.

Accepte n'importe quelle core::TileMap, et c'est le choix de cette grille qui fixe ce que « empruntable » veut dire :

Une porte verrouillée encore fermée doit être vue comme un mur, sans quoi le champ mesure la progression le long d'un chemin qui n'existe pas et la clé qui l'ouvre ne raccourcit rien.

Constructor & Destructor Documentation

◆ GridDistanceField() [1/2]

core::GridDistanceField::GridDistanceField ( const core::TileMap & tileMap,
const core::GridPosition & target )

Calcule le champ par BFS à partir de l'unique case target.

Parameters
tileMapGrille de collision (cases solides/non-solides) – core::MechanismController:: collisionMap() pour respecter l'état courant des portes, core::Level::tileMap() pour la seule solidité statique.
targetCase cible (typiquement core::Level::exit()), point de départ du BFS.

◆ GridDistanceField() [2/2]

core::GridDistanceField::GridDistanceField ( const core::TileMap & tileMap,
const std::vector< core::GridPosition > & targets )

Calcule le champ par BFS multi-source à partir de targets.

Généralise le constructeur à cible unique : la distance renvoyée par distance() est celle au plus proche élément de targets, ce qui permet de faire cohabiter la sortie du niveau avec les positions des déclencheurs (core::Mechanism::switchPosition) pas encore résolus comme cibles concurrentes – l'objectif immédiat le plus proche, sans hiérarchie ni connaissance de l'ordre de résolution attendu.

Parameters
tileMapGrille de collision (voir constructeur à cible unique).
targetsCases cibles ; une case hors-grille ou solide est simplement ignorée (garde défensive, ne fait pas échouer les autres cibles). Vide -> champ entièrement inatteignable.

Member Function Documentation

◆ distance()

int core::GridDistanceField::distance ( const core::GridPosition & position) const
nodiscardnoexcept

Distance de plus court chemin, en nombre de cases, depuis position jusqu'à la case cible passée au constructeur.

Parameters
positionCase dont on veut la distance ; hors-grille traitée comme inatteignable.
Returns
La distance en cases, ou la sentinelle largeur * hauteur (borne supérieure stricte de toute distance atteignable sur la grille) si position est hors-grille ou ne peut atteindre la cible par aucun chemin de cases non solides.

◆ isReachable()

bool core::GridDistanceField::isReachable ( const core::GridPosition & position) const
nodiscardnoexcept

La cible est-elle atteignable depuis position par un chemin de cases non solides ?

Distingue une distance réelle de la sentinelle rendue par distance(), que rien ne permet sinon de reconnaître : la sentinelle vaut largeur × hauteur, soit 576 sur une grille 24 × 24, et une progression calculée entre une case atteignable et une case qui ne l'est pas vaudrait donc ±576 sur un seul pas.

Parameters
positionCase à tester ; hors-grille traitée comme inatteignable.

◆ unreachableDistance()

int core::GridDistanceField::unreachableDistance ( ) const
inlinenodiscardnoexcept
Returns
La sentinelle rendue par distance() pour une case inatteignable (largeur × hauteur), borne supérieure stricte de toute distance atteignable — donc aussi la seule constante de normalisation qui ne dépende pas du niveau chargé.

Member Data Documentation

◆ _distances

std::vector<int> core::GridDistanceField::_distances
private

◆ _height

int core::GridDistanceField::_height
private

◆ _width

int core::GridDistanceField::_width
private

The documentation for this class was generated from the following files: