Alors j'ai aidé un de mes vieux contacts a faire un algo de combat Ogame like maintenant j'ai un peu "baclé" le travail c'est une implémentation très naive et peu efficace (et pour cause après on peut difficilement lui demander de gérer des combat de dizaines milliers de vaisseaux).
Le code n'est pas commenté mais relativement claire, je suis disponible pour toutes questions et je mettrais une version plus optimisé en ligne dès que j'aurai le temps.
Je me suis basé sur un texte en français trouver sur un forum pour le faire :
- J'ai fait quelque ajustement par fainéantise (le bouclier se recharge contre chaque nouvel attaquant et non pas chaque tour)
- le Rapid fire permet de tier un nombre plus élevé que deux fois mais j'ai limité volontairement à deux (je corrigerai dans la prochaine version).
- L'attaquant à un grand avantage car toute sa flotte tir en premier, Alors que j'aurais dû alterner les tir mais cela aussi sera corrigé.
Voilà le code php :
Je répète que ce n'est pas optimisé mais cela peut toujours aider (surtout que c'est une question relativement souvent posé). J'en mettrai un mieux plus tard. Je trouve le résultat relativement satisfaisant si l'on ne tient pas compte des piètre performance.
Cordialement Melimelo
ps: n'hésiter pas à faire des suggestion ou a proposer vous même un script optimiser à partir du texte ^^
Le code n'est pas commenté mais relativement claire, je suis disponible pour toutes questions et je mettrais une version plus optimisé en ligne dès que j'aurai le temps.
Je me suis basé sur un texte en français trouver sur un forum pour le faire :
Citation :Un combat se déroule toujours de la même manière :
- On calcule la valeur d'attaque ("valeur d'attaque" dans la fiche de chaque vaisseau), de coque ("points de structure" divisés par 10), et le bouclier ("puissance du bouclier"), pour chaque vaisseau en y ajoutant l'effet des technologies (+10% par niveau).
- On lance le combat, à chaque tour :
=> - On recharge les boucliers
=> - Chaque vaisseau tire sur un vaisseau ennemi aléatoirement. Si ce dernier à du rapidfire contre sa cible, il a un probabilité de continuer à tirer. Le bouclier de la cible absorbe les dégâts reçus, sauf s'ils sont inférieurs à 1% du bouclier dans quel cas aucun dommage n'est causé. Si le bouclier est détruit, la coque de la cible absorbe les dégâts.
=> - Chaque vaisseau endommagé à une probabilité d'exploser proportionelle aux dommages qu'il a subis s'ils sont supérieurs à 30% de la valeur de sa coque (60% de dommages donneront 60% de chances de destruction).
- A la fin du combat, on compte les pertes de l'attaquant et du défenseur.
- Un champ de débris contenant 30% du métal des vaisseaux détruits et 30% du cristal se forme en orbite de la planète.
- Un lune à un probabilité de se créer égale à l'arrondi inférieur de la valeur totale du champ de débris (métal + cristal) divisée par 100 000.
Le rapidfire désigne la possibilité pour certains vaisseaux de continuer à tirer lorsqu'ils atteignent certaines cibles, cf Déroulement d'un combat.
Le rapidfire de chaque vaisseau sur chaque cible est indiqué dans sa fiche.
La probabilité d'un vaisseau à continuer à tirer lorsqu'il touche un vaisseau sur lequel il a du rapidfire vaut 100-100/rapidfire %.
Par exemple, un Croiseur attaquant un Chasseur Léger (rapidfire de 6), aura 100-100/6 = 83,33% de chances de continuer à tirer. On voit donc bien que plus le rapidfire est élevé, plus ces chances augmentent et le vaisseau pourra causer des dégâts plus importants si la flotte ennemi est composée de bon nombre de ces vaisseaux.
- J'ai fait quelque ajustement par fainéantise (le bouclier se recharge contre chaque nouvel attaquant et non pas chaque tour)
- le Rapid fire permet de tier un nombre plus élevé que deux fois mais j'ai limité volontairement à deux (je corrigerai dans la prochaine version).
- L'attaquant à un grand avantage car toute sa flotte tir en premier, Alors que j'aurais dû alterner les tir mais cela aussi sera corrigé.
Voilà le code php :
<?php
$Vaisseau = array('Chasseur' => array('Nom' => 'Chasseur', 'Structure' => 400, 'Bouclier' => 10, 'Attaque' => 10, 'RapidFire' => array()),
'Croiseur' => array('Nom' => 'Croiseur', 'Structure' => 2700, 'Bouclier' => 50, 'Attaque' => 400, 'RapidFire' => array('Chasseur' => 6)),
'Traqueur' => array('Nom' => 'Traqueur', 'Structure' => 7000, 'Bouclier' => 400, 'Attaque' => 700, 'RapidFire' => array('Chasseur' => 10, 'Croiseur' => 2)));
$Joueur1 = array('Chasseur' => 2000, 'Croiseur' => 2000, 'Traqueur' => 2000);
$Joueur2 = array('Chasseur' => 2000, 'Croiseur' => 2000, 'Traqueur' => 2000);
function CalculArmee($param)
{
global $Vaisseau;
$Armee_Joueur = array();
reset($param);
for($i=0;$i < count($param); $i++)
{
$max = current($param);
for($j=0;$j < $max; $j++)
{
$Armee_Joueur[] = array('Nom' => $Vaisseau[Key($param)]['Nom'], 'Structure' => $Vaisseau[Key($param)]['Structure']);
}
next($param);
}
return $Armee_Joueur;
}
function Tir($Bouclier, $Attaque, $Structure, $Cible)
{
global $Vaisseau;
if(0 < $Bouclier-$Attaque)
{
$Bouclier -= $Attaque;
return $Structure;
}
else
{
$Structure -= ($Attaque-$Bouclier);
$Bouclier = 0;
$ratio = 1-$Structure/$Vaisseau[$Cible['Nom']]['Structure'];
if($ratio >= 0.4)
{
if(mt_rand(0, getrandmax()/getrandmax()) < $ratio)
{
return False;
}
else
{
if($Structure <= 0)
{
return false;
}
else
{
return $Structure;
}
}
}
else
{
return $Structure;
}
}
}
function Combat($Attaquant, $Defenseur)
{
global $Vaisseau;
$count = count($Defenseur)-1;
foreach($Attaquant as $element)
{
if($count+1 <= 0)
{
break;
}
$Cible = round(mt_rand(0, getrandmax()/getrandmax())*$count);
$Attaque = $Vaisseau[$element['Nom']]['Attaque'];
$Structure = $Defenseur[$Cible]['Structure'];
$Bouclier = $Vaisseau[$Defenseur[$Cible]['Nom']]['Bouclier'];
$Tir = Tir($Bouclier, $Attaque, $Structure, $Defenseur[$Cible]);
if($Tir)
{
$Structure = $Tir;
}
else
{
unset($Defenseur[$Cible]);
$Defenseur = array_values($Defenseur);
$count--;
}
if(!empty($Defenseur[$Cible]) && !empty($Vaisseau[$element['Nom']]['RapidFire'][$Defenseur[$Cible]['Nom']]))
{
if(mt_rand(0, getrandmax()/getrandmax()) <= 1-1/$Vaisseau[$element['Nom']]['RapidFire'][$Defenseur[$Cible]['Nom']])
{
$Tir = Tir($Bouclier, $Attaque, $Structure, $Defenseur[$Cible]);
if($Tir)
{
$Structure = $Tir;
}
else
{
unset($Defenseur[$Cible]);
$Defenseur = array_values($Defenseur);
$count--;
}
}
}
if(isset($Defenseur[$Cible]))
{
$Defenseur[$Cible]['Structure'] = $Structure;
}
}
return $Defenseur;
}
function CalculReste($param)
{
$Reste = array('Chasseur' => 0, 'Croiseur' => 0, 'Traqueur' => 0);
foreach($param as $element)
{
$Reste[$element['Nom']]++;
}
return $Reste;
}
$Armee_Joueur1_Attaquant = CalculArmee($Joueur1);
$Armee_Joueur2_Defenseur = CalculArmee($Joueur2);
for($i=0; $i < 6; $i++)
{
$Armee_Joueur2_Defenseur = Combat($Armee_Joueur1_Attaquant, $Armee_Joueur2_Defenseur);
$Armee_Joueur1_Attaquant = Combat($Armee_Joueur2_Defenseur, $Armee_Joueur1_Attaquant);
if(count($Armee_Joueur2_Defenseur) <= 0 || count($Armee_Joueur1_Attaquant) <= 0)
{
break;
}
}
$Joueur1 = CalculReste($Armee_Joueur1_Attaquant);
$Joueur2 = CalculReste($Armee_Joueur2_Defenseur);
print '<pre>';
print_r($Joueur1);
print '</pre><br/><br/>';
print '<pre>';
print_r($Joueur2);
print '</pre>';
?>
Je répète que ce n'est pas optimisé mais cela peut toujours aider (surtout que c'est une question relativement souvent posé). J'en mettrai un mieux plus tard. Je trouve le résultat relativement satisfaisant si l'on ne tient pas compte des piètre performance.
Cordialement Melimelo
ps: n'hésiter pas à faire des suggestion ou a proposer vous même un script optimiser à partir du texte ^^