JeuWeb - Crée ton jeu par navigateur

Version complète : [Réglé]Valeurs aléatoires pour un remplissage de carte
Vous consultez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Bonjour à tous et meilleurs voeux,

Il est vrai que j'ai été longuement absent au niveau des post mais je passe toujours de temps en temps sur le forum, la fac me prend du temps.

Bref passons directement au vif du sujet.

Je souhaite remplir aléatoirement une carte de systemes stellaires ayant comme attributs :

- coordonnée absysse : x (entre 1 et 200)
- coordonnée ordonnée : y (entre 1 et 200)
- une image associé sur la carte (un simple INT) : skin (entre 1 et 6)

Le coin haut-gauche représente le zéro.

J'ai donc créé un script pour remplir aléatoirement cette carte de 40000 cases a 10% soit environ 4000 systèmes.

(tout les scripts ci-dessous sont au stade de broullion voir code panzani 2 )

Voici mon script :
creer_systemes.php
Code PHP :
<?php
mysql_connect
('localhost','root','') ;
mysql_select_db('elvetika') ;

for (
$i=0$i<25$i++) {
$sql 'insert into systeme (px, py, skin)
                select A,B,C
                from (
                select 
                truncate(rand()*200+1,0) A,
                truncate(rand()*200+1,0) B,
                truncate(rand()*6+1,0) C
                ) as rand
                where  not exists (select skin from systeme where px=rand.A and py=rand.B)'
;
mysql_unbuffered_query ($sql);
}

$req mysql_query("SELECT count(*) FROM systeme");
$total array_pop(mysql_fetch_row($req));

mysql_close();

if (
$total<4000header ("Refresh: 1;URL=creer_systemes.php");
  echo 
$total;
?>

Ensuite j'utilise la librairie GD pour visualiser ma création 10 , car bon pas évident pour un humain (même demi-dieu) d'interpréter une suite de coordonnée.

build_map.php
Code PHP :
<?php
header 
("Content-type: image/png");

$image_carte imagecreate(800,700)   or die ('Librairie GD non fonctionnelle');
$fond_carte=Imagecolorallocate($image_carte000);

$decx=22//decalage pour faire jolie ;p
$decy=22;

$bleu Imagecolorallocate($image_carte25500);
$vert Imagecolorallocate($image_carte2550255);
$jaune Imagecolorallocate($image_carte0255255);
$rose Imagecolorallocate($image_carte2552550);
$blanc Imagecolorallocate($image_carte255255255);
$noir Imagecolorallocate($image_carte12030255);

$x1=0+$decx;
$x2=0+$decx;

for (
$i=1;$i<=5;$i++) {
    
ImageLine ($image_carte$x1$decy$x2600+$decy$blanc);
    
$x1$x1+150;
    
$x2 =$x2+150;
}

$y1=0+$decy;
$y2=0+$decy;

for (
$i=1;$i<=5;$i++) {
    
ImageLine ($image_carte$decx$y1600+$decx$y2$blanc);
    
$y1$y1+150;
    
$y2 =$y2+150;
}

include(
'config.php'); // constantes HOST USER PWD BDD
include ('inc/class.mydb.php');// class mysql (si qqun veu je peu la poster mais je l'ai pas finie)

$sql = new myDB(HOSTUSERPWD BDD);

$query 'SELECT px,py,skin FROM systeme';


$nbbleu 0;
$nbvert 0;
$nbjaune 0;
$nbrose 0;
$nbblanc 0;
$nbnoir 0;


if (!
$sql->select($query)) {}
else {
foreach (
$sql->select($query) as $value) {

   
//je cree un tableau pour les trier par clan
$px     $value['px'];
$py    $value['py'];


  switch (
$value['skin']) {
    case 
:
       
$color $bleu;
       
$nbbleu++;
    break;
    case 
:
       
$color $vert;
       
$nbvert++;
    break;
     case 
:
       
$color $jaune;
       
$nbjaune++;
    break;
     case 
:
       
$color $rose;
       
$nbrose++;
    break;
     case 
:
       
$color $blanc;
       
$nbblanc++;
    break;
    case 
:
       
$color $noir;
       
$nbnoir++;
    break;
     }

    
$px $px*3;
    
$py $py*3;
   
imagefilledrectangle ($image_carte$px+$decx-1$py+$decy-1$px+$decx+1$py+$decy+1$color);
}
}

imagestring($image_carte4722250$nbbleu$bleu);
imagestring($image_carte4722300$nbvert$vert);
imagestring($image_carte4722350$nbblanc$blanc);
imagestring($image_carte4722400$nbrose$rose);
imagestring($image_carte4722450$nbjaune$jaune);
imagestring($image_carte4722500$nbnoir$noir);
$somme $nbbleu+$nbvert+$nbblanc+$nbrose+$nbjaune+$nbnoir;
imagestring($image_carte3666550'TOTAL : '.$somme$blanc);

$sql->close();
// on affiche l'image
imagepng($image_carte);
ImageDestroy ($image_carte);
?>
Voici le rendu :

[Image: galaxie_couleur.png]

On vois clairement un motif apparaitre, je sais que la fonction rand() est pseudo aléatoire mais bon la je bloque....

J'ai également oté les couleurs cela donne ceci :
[Image: galaxie_noir-blanc.png]
On vois que rand() a du mal sur les petits ecarts ( 1 à 6).

Ai-je commis une erreur?

Voyez vous un moyen de remédier à ce problème?


Merci d'avance,
Utilise mt_rand de PHP. Il est nettement plus performant pour l'avoir essayé de nombreuses fois.
Merci je viens d'essayer c'est bien mieux mais nécessite du coup d'effectuer un calcul par PHP.
Voici la partie que j'ai modifié:
dans 'creer_systme.php'
Code PHP :
for ($i=0$i<25$i++) {
$rand1 mt_rand(1,200);
$rand2 mt_rand(1,200);
$rand3 mt_rand(1,6);

$sql 'insert into systeme (px, py, skin)
                select A,B,C
                from (
                select 
                '
.$rand1.' A,
                '
.$rand2.' B,
                '
.$rand3.' C
                ) as rand
                where  not exists (select skin from systeme where px=rand.A and py=rand.B)'
;
mysql_unbuffered_query ($sql);

Voici le résultat :
[Image: galaxie_couleur_mt_rand.png]

Merci Loetheri,
Que cela soit PHP ou MySQL, c'est toujours un serveur derrière.
Ce qui change, c'est l'implémentation de la fonction. Plus ta fonction est performante pour trouver des valeurs aléatoires, plus il y a de chances que cela utilise de la puissance de ton serveur.
Je ne parlai pas de ca exactement, avant tout etait interprétai directement par mysql, mais ca n'est pas grave ca marche c'est l'essentiel, et puis le script ne sert que pour remplir la BDD.

En cherchant dans le manuel php : mt_rand consome moins que rand() 10
gloups. Effectivement, je pensais aps que le rand() était AUSSI pourri....
On parle de rand de MySQL pour la première image.
rand de PHP ne doit guère fonctionner mieux que cela.
Il vaut mieux utiliser mt_rand de PHP.
URLs de référence