Cette méthode est utilisée dans beaucoup de domaines comme par exemple les maths, la physique…
Elle consiste à avoir une grille contenant des cellules, chacune ayant un état (dans notre cas eau/terre).
Pour chaque cellule, on regarde l’état des cellules voisines pour déterminer son nouvel état. Si une cellule est entourée d’au moins 5 cellules de type terre, alors la cellule est transformée en cellule terre, sinon on la passe en cellule de type eau.
Voici un exemple en 8 passes :
Pour plus de renseignements sur cette méthode : Cellular Automaton (ou Automate Cellulaire en français).
Il y a deux façons de procéder lors du traitement des données :
- Pour chaque cellule, faire le traitement et modifier directement les données du tableau (et donc prendre le nouvel état en considération lors du traitement de la cellule suivante)
- On traite les données à un instant t.
C’est cette deuxième solution que nous allons utiliser.
Génération aléatoire du tableau
Dans un premier temps, nous devons donc générer aléatoirement des données dans notre tableau initial.
Pour ce faire, nous avons besoin d’un ratio pour nos cellules de type terre.
|
|
Nous avons besoin d’un enum listant les états possibles pour chaque cellule (seul l’enum sera utilisé, le reste servira lors de l’affichage des données) :
|
|
Puis nous générons les données :
|
|
Nous avons maintenant un tableau complètement aléatoire. Il nous faut alors le traiter pour obtenir un terrain qui nous va bien.
Traitement de données
Pour ce faire, nous devons définir un nombre d’itérations déterminant le niveau de nettoyage de notre terrain :
|
|
Et voici notre méthode de traitement de chaque cellule. Comme nous l’avons dit plus haut, le traitement se fait à un instant t. Nous avons donc besoin d’un tableau temporaire pour stocker nos nouvelles valeurs le temps de finir le traitement global du terrain :
|
|
Cette méthode retourne pour une cellule donnée le nombre de cellules du type spécifié en paramètre (le type de la cellule traitée est également pris en compte) :
|
|
Voici un exemple de résultat :
La méthode pour obtenir un terrain utilisable dans un donjon (où toutes les cellules de type terre doivent être liées) est la même, mais il vous sera nécessaire de faire des traitements supplémentaires.
Le plus simple, sur un résultat comme celui ci-dessus, est de faire en sorte de reconnecter toutes les parties. Dans un premier temps, il faut augmenter le ratio de cellule de type terre, et le passer à 60% pour avoir quelque chose qui ressemble plus à un donjon. Et enfin, refaire quelques itérations pour supprimer (ou connecter, au choix) les parties ne l’étant pas encore.