Page 1 sur 1

Repartition aleatoire / Map aléatoire

Posté : 10 mai 2009, 13:05
par JOHAAANNS
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 ;)

Posté : 10 mai 2009, 13:11
par Ryle
shuffle() ? :)

Re: Repartition aleatoire

Posté : 10 mai 2009, 14:19
par albat
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',
);

Posté : 10 mai 2009, 15:09
par momox
A mon avis, c'est la mine, sensée être symbolisée par un 3, et la virgule finale une erreur de C/C.

Posté : 10 mai 2009, 18:06
par albat
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

Posté : 10 mai 2009, 18:13
par momox
Exact, je n'avais point vu, désolé ;)

Posté : 10 mai 2009, 18:14
par Calimero
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 ;-)

Posté : 10 mai 2009, 23:56
par JOHAAANNS
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 ;)

Posté : 11 mai 2009, 01:07
par zeus
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.

Posté : 11 mai 2009, 13:38
par JOHAAANNS
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

Posté : 11 mai 2009, 14:37
par zeus
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>

Posté : 11 mai 2009, 14:59
par JOHAAANNS
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

Posté : 11 mai 2009, 15:42
par zeus
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 ;)