Repartition aleatoire / Map aléatoire

Eléphant du PHP | 178 Messages

10 mai 2009, 13:05

Bonjour,

Je vous explique ce que je souhaite faire.

Je suis entrain de créer une map.
Dans ces maps je souhaite qu'il y est :
par exemple :
- 75 arbres [valeur = 1]
- 1 mine [valeur = 3]
le reste serait de l'herbe [valeur = 0]

Ces maps font 150 cases

j'aimerais créer 1000 maps avec le même nombre d'éléments mais reparties différements.
En gros je voudrais que toutes mes cartes soient différentes, avec des arbres placées aléatoirement.

J'avoue ne pas savoir comment m'y prendre...

Voici un array d'une map fixe :
$array = array ('1','1','1','1','1','1','1','0','0','0','1','1','1','1','1',
				'1','1','1','1','1','1','0','0','0','0','1','1','1','1','1',
				'1','1','1','0','1','3','1','0','0','0','0','0','1','1','1',
				'1','0','0','0','0','0','0','0','0','0','0','0','0','0','1',
				'1','0','0','0','0','0','0','0','0','0','0','0','0','0','1',
				'1','0','0','0','0','0','0','0','0','0','0','0','0','0','1',
				'1','0','0','0','0','0','0','0','0','0','0','0','0','0','1',
				'1','1','1','0','0','0','0','0','0','0','0','0','1','1','1',
				'1','1','1','1','1','1','1','0','0','2','1','1','1','1','1',
				'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
				);
D'avance merci ;)
Modifié en dernier par JOHAAANNS le 11 mai 2009, 15:01, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 mai 2009, 13:11

shuffle() ? :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

10 mai 2009, 14:19

Deux trucs bizarres dans l'exemple que tu donnes :
- la virgule finale (qui plante ton tableau)
- le 2, c'est quoi ?
$array = array (
'1','1','1','1','1','1','1','0','0','0','1','1','1','1','1',
'1','1','1','1','1','1','0','0','0','0','1','1','1','1','1',
'1','1','1','0','1','3','1','0','0','0','0','0','1','1','1',
'1','0','0','0','0','0','0','0','0','0','0','0','0','0','1',
'1','0','0','0','0','0','0','0','0','0','0','0','0','0','1',
'1','0','0','0','0','0','0','0','0','0','0','0','0','0','1',
'1','0','0','0','0','0','0','0','0','0','0','0','0','0','1',
'1','1','1','0','0','0','0','0','0','0','0','0','1','1','1',
'1','1','1','1','1','1','1','0','0','2','1','1','1','1','1',
'1','1','1','1','1','1','1','1','1','1','1','1','1','1','1',
);

Mammouth du PHP | 1511 Messages

10 mai 2009, 15:09

A mon avis, c'est la mine, sensée être symbolisée par un 3, et la virgule finale une erreur de C/C.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

10 mai 2009, 18:06

A mon avis, c'est la mine, sensée être symbolisée par un 3, et la virgule finale une erreur de C/C.
Je doute fort : la mine est déjà présente : ligne 3, colonne 6

Mammouth du PHP | 1511 Messages

10 mai 2009, 18:13

Exact, je n'avais point vu, désolé ;)

ViPHP
ViPHP | 2287 Messages

10 mai 2009, 18:14

C'est simple : commence déjà par faire un générateur 100% aléatoire sans trop te préoccuper des règles que tu nous énonces. Tu le feras en t'appuyant sur des fonctions telles que rand() par exemple, ainsi que des boucles (sur coordonnées X,Y).

Tu vas très vite arriver à un point où tes maps respectent les règles que tu nous donnes sur les proportions d'éléments dans la grille, mais ne te satisfont toujours pas pleinement, il te faudra alors spécifier et implémenter quelques règles supplémentaires.

Et là tu l'auras, ton générateur ;-)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 178 Messages

10 mai 2009, 23:56

lol ;)

Pour l'array ce n'etait qu'un exemple ce n'etait pas grave s'il y avait plusieurs 2 ou 3 lol ;)

En tout cas un grand merci a vous tous de ces réponses....des que j'ai du temps je me pencherai sur ce probleme...
Encore un grand merci ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 mai 2009, 01:07

shuffle() ? :)
Moi, c'est cette solution qui me parrait la plus simple et la plus pertinente.

Tu commences par remplir ton tableau avec X élément à 3, Y éléments à 1 et Z (étant la taille totale de ta map - X - Y). Pour cela, regarde du côté de array_push()
A ce point, tu as une map dont les éléments de mêmes types sont contigus.

Ensuite, tu fais un suffle() sur ce tableau pour tout mélanger, et voilà le travail.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 178 Messages

11 mai 2009, 13:38

Re bonjour ;)

Bon en gros j'ai fait ca :
$max_case = 150;
$nombre_foret= 60;
$nombre_mine = 1;
$nombre_herbe = $max_case-($nombre_foret+$nombre_mine);


//Arbre 
for ($x=0; $x<=$nombre_foret; $x++)
{
	$cpt_foret.= "1,";
}

$cpt_foret = substr($cpt_foret, 0,-1);
$explode_foret = explode(",", $cpt_foret);

$all_foret = ($explode_foret);
//print_r($all_foret);
echo '<br>';
echo '<br>';
//foret 
for ($x=0; $x<=$nombre_herbe; $x++)
{
	$cpt_herbe.= "0,";
}

$cpt_herbe = substr($cpt_herbe, 0,-1);
$explode_herbe = explode(",", $cpt_herbe);

$all_herbe = ($explode_herbe);
//print_r($all_herbe);

echo '<br>';

echo '<br>';
echo '<br>';
/*A PARTIR D'ICI COMMENT UTILISER MON array_push(); */
j'ai donc creer 2 array "$explode_foret" et "$explode_herbe'

Comment dois je utiliser pour array_push() ?
Puis par la suite viendra mon shuffle()!
merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 mai 2009, 14:37

Bon, du coup, j'ai planché sur l'algo.
Pour commencer, je me suis planté sur la array_push, je pensais qu'il empilerais les éléments d'un tableau dans un autre, alors qu'il empile juste un tableau comme élément d'un autre.

Du coup, j'ai pas trouvé mieux qu'un for() pour remplir la map.

Et, comme je viens de passer 30mn pour finaliser l'algo, je te le donne ;)
<html>
	<head>
		<title>Construction d'une map aléatoire</title>
	</head>
	<body>
<?php
	
	// Définition des données générales
	$nb_case_largeur 	= 15;
	$nb_case_hauteur 	= 10;
	$nb_case_arbre 		= 75;
	$nb_case_mine 		= 1;
	
	// Valeur des cases
	define('CASE_HERBE', 0);
	define('CASE_ARBRE', 1);
	define('CASE_MINE', 3);

	// Définition des valeurs calculées
	$nb_case_total = $nb_case_largeur * $nb_case_hauteur;
	$nb_case_herbe = $nb_case_total - ($nb_case_arbre + $nb_case_mine); // Le nombre de case "herbe" est le nombre de case restantes
	
	// Création  d'un tableau temporaire contenant tout les éléments
	$a_map = array();
	// Ajout des éléments "herbe" dans la map
	for( $i = 0; $i < $nb_case_herbe ; $i++)
		$a_map[] = CASE_HERBE;
	// Ajout des éléments "arbre" dans la map
	for( $i = 0; $i < $nb_case_arbre ; $i++)
		$a_map[] = CASE_ARBRE;
	// Ajout des éléments "mine" dans la map
	for( $i = 0; $i < $nb_case_mine ; $i++)
		$a_map[] = CASE_MINE;
	
	// Mélange des éléments
	shuffle($a_map);
	
	// Découpe la map en X tableau de la taille d'une largeur. Permet de créer un tableau à 2 dimensions
	$a_map = array_chunk($a_map, $nb_case_largeur);
	
	
	// Affichage du tableau généré
?>
		<table border="1">
		<?php
			foreach($a_map as $hauteur => $a_largeur)
			{
				echo '<tr>';
				foreach($a_largeur as $largeur => $value)
				{
					echo '<td>'.$value.'</td>';
				}
				echo '</tr>';
			}
		?>
		</table>
	</body>
</html>
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 178 Messages

11 mai 2009, 14:59

Houlalala sacré boulot, bravo....
UN GRAND GRAND MERCI ;)
En plus je n'ai pas l'habitude de codé comme cela...cela va me permettre d'en apprendre un peu plus !
Merci de ta patience et de ton temps

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 mai 2009, 15:42

Mais de rien.
En tout cas, même si je t'ai filé le code, comprend bien que c'est parce que j'ai vu que tu avais déjà travaillé dessus.

N'hésite pas à bien lire et comprendre mon code, et pose les questions que tu pourrais avoir, c'est le moment ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer