MapExample.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. /**
  3. * Exemple d'utilisation de la classe Map
  4. *
  5. * Ce fichier montre comment créer, modifier et sauvegarder une carte.
  6. */
  7. // Inclure les classes nécessaires
  8. require_once __DIR__ . '/../Models/Map.php';
  9. /**
  10. * Fonction principale d'exemple
  11. */
  12. function runMapExample()
  13. {
  14. echo "=== Exemple d'utilisation de la classe Map ===\n\n";
  15. // 1. Créer une nouvelle carte
  16. echo "1. Création d'une nouvelle carte 5x5...\n";
  17. $map = new Map("Carte d'exemple", 5, 5);
  18. echo "Carte créée: {$map->getName()}\n";
  19. echo "Dimensions: {$map->getWidth()} x {$map->getHeight()}\n\n";
  20. // 2. Modifier quelques tuiles
  21. echo "2. Modification de quelques tuiles...\n";
  22. $map->setTile(0, 0, new Tile(['type' => 'castle', 'resources' => ['gold' => 100, 'stone' => 50], 'temperature' => 20.5])); // Château au coin supérieur gauche
  23. $map->setTile(2, 2, new Tile(['type' => 'river', 'resources' => ['water' => 1000], 'temperature' => 15.0])); // Rivière au centre
  24. $map->setTile(4, 4, new Tile(['type' => 'mountain', 'elevation' => 1500, 'resources' => ['iron' => 75], 'temperature' => 5.0])); // Montagne au coin inférieur droit
  25. $map->setTile(1, 1, new Tile(['type' => 'forest', 'resources' => ['wood' => 200], 'temperature' => 18.0])); // Forêt
  26. $map->setTile(3, 3, new Tile(['type' => 'field', 'resources' => ['wheat' => 150], 'temperature' => 22.0])); // Champ
  27. $map->setTile(0, 4, new Tile(['type' => 'road', 'temperature' => 25.0])); // Route
  28. echo "Tuiles modifiées avec succès\n\n";
  29. // 3. Afficher les statistiques
  30. echo "3. Statistiques de la carte:\n";
  31. $stats = $map->getStatistics();
  32. echo "Total d'hexagones: {$stats['total_hexagons']}\n";
  33. echo "Hexagones vides: {$stats['empty_count']} ({$stats['empty_percentage']}%)\n";
  34. echo "Hexagones remplis: {$stats['filled_count']} ({$stats['filled_percentage']}%)\n";
  35. echo "Répartition des types de tuiles:\n";
  36. foreach ($stats['tile_type_counts'] as $type => $count) {
  37. echo " - " . ucfirst($type) . ": $count\n";
  38. }
  39. echo "\n";
  40. // 4. Sauvegarder la carte
  41. echo "4. Sauvegarde de la carte...\n";
  42. $filePath = __DIR__ . '/../../storage/maps/example_map.json';
  43. $directory = dirname($filePath);
  44. // Créer le dossier s'il n'existe pas
  45. if (!is_dir($directory)) {
  46. mkdir($directory, 0755, true);
  47. }
  48. if ($map->saveToFile($filePath)) {
  49. echo "Carte sauvegardée dans: $filePath\n\n";
  50. } else {
  51. echo "Erreur lors de la sauvegarde\n\n";
  52. }
  53. // 5. Charger la carte depuis le fichier
  54. echo "5. Chargement de la carte depuis le fichier...\n";
  55. $loadedMap = Map::fromFile($filePath);
  56. if ($loadedMap) {
  57. echo "Carte chargée: {$loadedMap->getName()}\n";
  58. echo "Dimensions: {$loadedMap->getWidth()} x {$loadedMap->getHeight()}\n";
  59. // Vérifier que les données sont identiques
  60. $originalStats = $map->getStatistics();
  61. $loadedStats = $loadedMap->getStatistics();
  62. if ($originalStats['tile_type_counts'] === $loadedStats['tile_type_counts']) {
  63. echo "✓ Les données de la carte chargée correspondent à l'originale\n";
  64. } else {
  65. echo "✗ Erreur: les données ne correspondent pas\n";
  66. }
  67. } else {
  68. echo "Erreur lors du chargement de la carte\n";
  69. }
  70. echo "\n";
  71. // 6. Afficher un aperçu de la carte
  72. echo "6. Aperçu de la carte (5x5):\n";
  73. for ($r = 0; $r < $map->getHeight(); $r++) {
  74. // Décalage pour l'affichage hexagonal
  75. $offset = str_repeat(' ', $r * 2);
  76. echo $offset;
  77. for ($q = 0; $q < $map->getWidth(); $q++) {
  78. $tile = $map->getTile($q, $r);
  79. $symbol = getTileSymbol($tile);
  80. echo "$symbol ";
  81. }
  82. echo "\n";
  83. }
  84. echo "\n";
  85. // 7. Exemple d'utilisation des coordonnées hexagonales
  86. echo "7. Exemple de calcul de distance hexagonale:\n";
  87. $hex1 = $map->getHexagon(0, 0);
  88. $hex2 = $map->getHexagon(2, 2);
  89. if ($hex1 && $hex2) {
  90. $distance = $hex1->distanceTo($hex2);
  91. echo "Distance entre (0,0) et (2,2): $distance\n";
  92. }
  93. echo "\n=== Exemple terminé ===\n";
  94. }
  95. /**
  96. * Retourne un symbole pour représenter une tuile
  97. *
  98. * @param Tile|null $tile La tuile
  99. * @return string Le symbole
  100. */
  101. function getTileSymbol(?Tile $tile): string
  102. {
  103. if ($tile === null || $tile->isEmpty()) {
  104. return '□';
  105. }
  106. $type = strtolower($tile->getType());
  107. $symbols = [
  108. 'grass' => '░',
  109. 'field' => '🌾',
  110. 'forest' => '🌲',
  111. 'mountain' => '⛰️',
  112. 'water' => '🌊',
  113. 'building' => '🏢',
  114. 'house' => '🏠',
  115. 'farm' => '🚜',
  116. 'road' => '🛣️',
  117. 'river' => '🌊',
  118. 'bridge' => '🌉',
  119. 'castle' => '🏰',
  120. 'tower' => '🏯',
  121. 'wall' => '🧱',
  122. 'mine' => '⛏️',
  123. 'quarry' => '⚒️',
  124. 'market' => '🏪',
  125. 'temple' => '⛩️',
  126. 'hospital' => '🏥',
  127. 'school' => '🏫',
  128. 'factory' => '🏭',
  129. 'power_plant' => '⚡',
  130. 'airport' => '✈️',
  131. 'port' => '⚓',
  132. 'railway' => '🚂',
  133. 'highway' => '🛣️'
  134. ];
  135. return $symbols[$type] ?? '?';
  136. }
  137. // Exécuter l'exemple si le fichier est appelé directement
  138. if (basename(__FILE__) === basename($_SERVER['PHP_SELF'] ?? '')) {
  139. runMapExample();
  140. }