Repartition aleatoire / Map aléatoire

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Repartition aleatoire / Map aléatoire

par zeus » 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 ;)

par JOHAAANNS » 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

par zeus » 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>

par JOHAAANNS » 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

par zeus » 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.

par JOHAAANNS » 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 ;)

par Calimero » 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 ;-)

par momox » 10 mai 2009, 18:13

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

par albat » 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

par momox » 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.

Re: Repartition aleatoire

par albat » 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',
);

par Ryle » 10 mai 2009, 13:11

shuffle() ? :)

Repartition aleatoire / Map aléatoire

par JOHAAANNS » 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 ;)