La classe Map permet de créer et gérer des cartes composées d'hexagones (damier hexagonal). Chaque hexagone peut contenir une tuile avec des propriétés arbitraires (type, ressources, température, élévation, etc.).
Représente une tuile avec des propriétés arbitraires :
getProperty(), setProperty(), hasProperty()getType(), getResources(), getTemperature(), etc.Le système utilise des coordonnées axiales où :
q : axe horizontal (est-ouest)r : axe diagonal (nord-est - sud-ouest)s : coordonnée calculée (-q - r) pour les coordonnées cubiques// Créer une carte 10x10
$map = new Map("Ma Carte", 10, 10);
// Créer une tuile avec des propriétés
$castleTile = new Tile([
'type' => 'castle',
'resources' => ['gold' => 100, 'stone' => 50],
'temperature' => 20.5,
'elevation' => 100
]);
// Placer la tuile
$map->setTile(0, 0, $castleTile);
// Créer une tuile simple
$forestTile = new Tile(['type' => 'forest', 'resources' => ['wood' => 200]]);
$map->setTile(1, 1, $forestTile);
// Récupérer une tuile
$tile = $map->getTile(0, 0);
if ($tile) {
// Accès direct aux propriétés
$type = $tile->getType();
$resources = $tile->getResources();
$temperature = $tile->getTemperature();
// Accès générique
$customProperty = $tile->getProperty('custom_prop', 'default');
$tile->setProperty('new_prop', 'value');
}
$stats = $map->getStatistics();
// Retourne:
// - total_hexagons: nombre total
// - width, height: dimensions
// - tile_type_counts: répartition par type
// - empty_count, empty_percentage: cases vides
// - filled_count, filled_percentage: cases remplies
{
"name": "Ma Carte",
"width": 5,
"height": 5,
"created_at": "2025-10-12 15:30:00",
"updated_at": "2025-10-12 15:30:00",
"hexagons": [
{
"q": 0,
"r": 0,
"tile": {
"type": "castle",
"resources": {"gold": 100, "stone": 50},
"temperature": 20.5
}
}
]
}
// Sauvegarder
$map->saveToFile('storage/maps/ma_carte.json');
// Charger
$loadedMap = Map::fromFile('storage/maps/ma_carte.json');
$tile = new Tile();
$tile->setType('factory');
$tile->setResources(['iron' => 50, 'coal' => 30]);
$tile->setTemperature(15.0);
$tile->setElevation(50);
$tile->setProperty('owner', 'player1');
$tile->setProperty('production_rate', 10);
$map->setTile(5, 5, $tile);
$totalResources = [];
foreach ($map->getAllHexagons() as $row) {
foreach ($row as $hexagon) {
$tile = $hexagon->getTile();
if ($tile && !$tile->isEmpty()) {
$resources = $tile->getResources();
foreach ($resources as $resource => $amount) {
$totalResources[$resource] = ($totalResources[$resource] ?? 0) + $amount;
}
}
}
}
$hotTiles = [];
for ($q = 0; $q < $map->getWidth(); $q++) {
for ($r = 0; $r < $map->getHeight(); $r++) {
$tile = $map->getTile($q, $r);
if ($tile && $tile->getTemperature() > 25.0) {
$hotTiles[] = ['q' => $q, 'r' => $r, 'tile' => $tile];
}
}
}
Pour tester la classe, exécutez :
php app/Tests/MapTest.php
Cela exécute 37 tests validant toutes les fonctionnalités.
Voir le fichier app/Examples/MapExample.php pour un exemple complet d'utilisation avec propriétés complexes.