Selection au hasard dans un tableau pas si au hasard

Mammouth du PHP | 555 Messages

30 juil. 2007, 19:14

Bonjour à tous,
Toujours dans le cadre de ma nouvelle fonction de combat pour mon jeu en ligne je vient demander votre aide.
Alors voila il faudrait selectionner un id au hasard dans un tableau en fonction qu'une des variable soit dans tel était
Ca serait comme l'équivalent de SELECT $ar[x] FROM $ar WHERE $ar[X][3] = 1 ORDER BY RAND() pour les array où l'on voudrait un X bien entendu...
En fait ca serait pour mettre dans cette fonction qui en arrive à boucler à l'infini à cause de la selection au hasard par rand (elle ne trouve pas les derniers résultats restants)
function atq_confront2 ($ar1, $ar2, $nu1, $nu2)
{
 $nbd1 = 0;
 $nbd2 = 0;
 while($nbd1 < $nu1 AND $nbd2 < $nu2)
 {
  $rand1 = rand(0, $nu1);
  $rand2 = rand(0, $nu2);
  if($ar2[$rand2][3] == 1)
  {
   if($ar1[$rand1][3] == 1)
   {
    $ar2[$rand2][2] -= $ar1[$rand1][1];
    $ar1[$rand1][2] -= $ar2[$rand2][1];
    if($ar2[$rand2][2] <= 0) { $ar2[$rand2][3] = 0; $nbd2++;}
    if($ar1[$rand1][2] <= 0) { $ar1[$rand1][3] = 0; $nbd1++;}
   }
  }
 }
 $arfinal = array();
 $arfinal[1] = $ar1;
 $arfinal[2] = $ar2;
 return ($arfinal);
}
Merci à tous de votre aide!


------------------------------------ Edit
La solution se trouverai peut être dans ce vieu code que quelqu'un d'ici m'avais concocté il y a quelques années. On pourrait faire une liste des id des deux côtés et à chaque fois qu'une unité meurt on retire son id de la liste. (info une unité meurt quand $nbd1 ou $nbd2 sont incrémentés)

Voila le bout de code en question dont j'ai du mal à saisir le concept.
$nb           = 6;  // Longueur du mot de passe
$carAutorises = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$max          = strlen($carAutorises)-1;
$motDePasse   = null;
for($i=0; $i < $nb; $i++) {
  $motDePasse .= $carAutorises{mt_rand(0, $max)};
}
A+ et bon surf!!!!

Eléphant du PHP | 52 Messages

31 juil. 2007, 10:58

Hello,

moi je le ferai en 2 temps d'abord la détection des éléments qui ont la propriété qui t'intéresse et en faire un tableau temporaire puis le melanger avec shuffle().
PHP5 Zend certified Engineer

Mammouth du PHP | 555 Messages

31 juil. 2007, 12:15

Salut,
Le truc c'est que c'est dans une boucle et que je retire la condition qui m'intéresse aux éléments au fur et à mesure de la progression de la boucle, mais il arrive à un moment ou les éléments ayant la bonne condition sont si rares que le rand ne fait que tomber sur ceux qui ne m'intéressent pas et boucle sur l'infini. En somme à la fin ce n'est qu'une question de proba très infime...
Merci à tous!


-------------------------------------------Edit

Voila je pense avoir trouvé la solution, enfin il m'aura tout de même fallu un jour pour corriger les bugs et trouver une solution sur une si petite fonction...
Pour ceux que ca intéresse
function atq_confront3 ($ar1, $ar2, $nu1, $nu2)
{
 $nbd1 = 0;
 $nbd2 = 0;
 while($nbd1 < $nu1 AND $nbd2 < $nu2)
 {
  $mark = 0;
  while($mark = 0)
  {
   $rand1 = rand(0, $nu1);
   if($ar1[$rand1][3] == 1) {$mark++;}
  }
  $mark = 0;
  while($mark = 0)
  {
   $rand2 = rand(0, $nu2);
   if($ar2[$rand2][3] == 1) {$mark++;}
  }
  $ar2[$rand2][2] -= $ar1[$rand1][1];
  $ar1[$rand1][2] -= $ar2[$rand2][1];
  if($ar2[$rand2][2] <= 0) { $ar2[$rand2][3] = 0; $nbd2++;}
  if($ar1[$rand1][2] <= 0) { $ar1[$rand1][3] = 0; $nbd1++;}
 }
 $arfinal = array();
 $arfinal[1] = $ar1;
 $arfinal[2] = $ar2;
 return ($arfinal);
}
Ca donne 34 secondes d'éxécution sur mon server de test local (win 98SE + Easyphp + servuftp sur 64Mo de ram EDO et un PI@ 133Mhz) Il reste encore des bugs sur la fonction principale mais je m'en occupe...
Merci à tous!
A+ et bon surf!!!!