Jeu de la vie

Résolu
sadredine Messages postés 3 Date d'inscription vendredi 23 octobre 2009 Statut Membre Dernière intervention 2 février 2010 - 2 févr. 2010 à 15:58
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012 - 3 févr. 2010 à 10:21
bonjour

je suis en train d'elaborer un programme en java qui tourne autour du jeu de la vie, mais la vie aquatique, car il en existe sur le monde de la cellule.
donc mon petit monde comporte:
une mer
des poissons dont (requins, sardines)
ma question est: je voudrais avoir une idée sur l'algorythme a utiliser pour elaborer une naissance ou mort du poisson par exemple.
pour que les choses soient claire je ne veux pas que vous me donniez le code ce n'est pas le but. mais que vous me balisez le chemin du code car j'ai une petite base en algo

merci

7 réponses

cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012
2 févr. 2010 à 16:45
Bonjour

Sans être certain de ma réponse, j'ai cru avoir lu un fonctionnement de ce type dans un petit tutoriel sur la programmation d'algorithmes génétique.

Mais encore une fois, je n'ai pas expérimenté le code proposé et je ne suis pas sûr de ma réponse.
3
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012
2 févr. 2010 à 16:50
Regardez par ici Algorithme génétique sur wikipédia

Un algo génétique, à ce que j'en ai compris, ne t'aidera pas à créer des poissons à partir de rien, mais à faire évoluer ta population de poissons, à opérer une "sélection naturelle" sur eux, d'après des paramètres que tu auras définis...
0
sadredine Messages postés 3 Date d'inscription vendredi 23 octobre 2009 Statut Membre Dernière intervention 2 février 2010
2 févr. 2010 à 18:06
merci pour ta reponse.

voila ce que j'ai pu bidouller en recuperant du code par ci par la :



package devoijava;
import java.util.*;

/**
*
* @author Administrateur
*/
public class Requin extends Poisson {

private int nbCyclesSansManger;

/** Creates a new instance of Requin */
public Requin(Coordonnees coordonnees) {
super(coordonnees);
nbCyclesSansManger= 0;

}

public Requin(int x,int y) {
this(new Coordonnees(x, y));

}

public String getType(){
return "Requin";
}

public void deplacer(ArrayList tabPoissons,Object [][] tabMer,int nbLignes,int nbColonnes){

ArrayList coordonneesPossibles = coordonneesPossibles(nbLignes, nbColonnes);

nbCyclesSansManger++;

if (coordonneesPossibles.size() != 0) {
for (int i = 0; i < coordonneesPossibles.size(); i++) {
Coordonnees l_coordonnees = (Coordonnees) coordonneesPossibles.get(i);
Object object = Utils.estDansTableauPoissons(l_coordonnees, tabPoissons);
if (object != null) {
Poisson poisson = (Poisson) object;
if (poisson.getType().equalsIgnoreCase("Sardine")) {
nbCyclesSansManger = 0;
tabPoissons.remove(poisson);
tabMer[this.getCoordonnees().getX()][this.getCoordonnees().getY()] = null;
coordonnees.setX(poisson.getX());
coordonnees.setY(poisson.getY());

tabMer[this.getCoordonnees().getX()][this.getCoordonnees().getY()] = this;
return;
}
coordonneesPossibles.remove(i);
i--;
}
}
if (coordonneesPossibles.size() != 0) {
int l_rand = (int) (Math.random() * coordonneesPossibles.size());
Coordonnees l_coordonnees = (Coordonnees) coordonneesPossibles.get(l_rand);
tabMer[this.getCoordonnees().getX()][this.getCoordonnees().getY()] = null;
coordonnees.setX(l_coordonnees.getX());
coordonnees.setY(l_coordonnees.getY());
tabMer[this.getCoordonnees().getX()][this.getCoordonnees().getY()] = this;
}
}
}

public boolean deces(Object tabMer,ArrayList tabPoisson){

}

public void reproduction(ArrayList tabPoissons,Object [][] tabMer,int nbLignes,int nbColonnes){

}
public boolean meurDeFaim(Object [][] tabMer,ArrayList tabPoissons){

}

}
0
sadredine Messages postés 3 Date d'inscription vendredi 23 octobre 2009 Statut Membre Dernière intervention 2 février 2010
2 févr. 2010 à 18:13
voila la partie du code incomplete:

public boolean deces(Object tabMer,ArrayList tabPoisson){

}

public void reproduction(ArrayList tabPoissons,Object [][] tabMer,int nbLignes,int nbColonnes){

}
public boolean meurDeFaim(Object [][] tabMer,ArrayList tabPoissons){

}

}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012
3 févr. 2010 à 09:26
Salut

Pour commencer une amélioration considérable est possible :

Dans ton code du 2e message tu déclares un ArrayList qui devrait contenir des Coordonnees.
Le seul problème, c'est que par défaut l'ArrayList ne prend que le superType Object, de sorte que, comme tu l'as remarqué, il faut obligatoirement effectuer une conversion du type de l'objet récupéré par listeCoordonnes.get(entierPositionDansListe) en Coordonnes.

Voici comment tu pourrais simplifier la chose :
1) utilise une version du jdk java >= java 5, qui permet les types génériques, ce que je suis en train de t'expliquer justement
2) déclares une ArrayList<Coordonnees> liste = new ArrayList<Coordonnees>() au lieu de simplement déclarer une ArrayList non paramétrée par ta classe Coordonnees
3) Quand tu récupérera la valeur par liste.get(entier), tu n'auras plus besoin d'effectuer une conversion de type.

Sinon, je vais essayer d'analyser le reste du code, car cela m'intéresse aussi.
N'hésites pas à poster un nouveau message si la programmation en utilisant les génériques te pose problème magré ma description (Ou peut être que tu le savais mais tu n'y avais pas pensé)

Dans le pire des cas, voici des liens utile :
Généralités par wikipédia
Génériques en Java par Wikibooks
0
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012
3 févr. 2010 à 09:28
Errata : j'ai fait réfénce au code du 2e message, il s'agit en fait de ton code posté hier à 18h06 et 34s. Désolé pour l'erreur
0
cs_loloof64 Messages postés 342 Date d'inscription vendredi 1 septembre 2006 Statut Membre Dernière intervention 6 novembre 2012
3 févr. 2010 à 10:21
Je pense avoir bien compris que dans deplacer(), tu verifies les coordonnes disponibles, et mange eventuellement le poisson se trouvant au nouvel endroit. Par contre, en créeant 2/3 méthodes supplémentaires (manger(), obtenirCoordonnesDisponibles(), ...) le code pourrait être plus agréable à la fois à lire et à maintenir.

Au fait, n'hésites pas à utiliser les balises code [JAVA] pour écrire tes codes. Elles sont disponibles au dessus de la zone de texte.

Sinon, voici comment tu pourrais écrire les fonctions deces et reporduction (là aussi, à vérifier, et en plus je les ai ecrites en FAUX FRANCAIS car je ne connais pas exactement ton code : la classe Poisson par exemple. Mais bon, le but n'est pas que tu exposes directement toutes tes classes maintenant)

Décès
public boolean deces(Object [][] tabMer,ArrayList tabPoisson){ 
    /* Donner null au tabMer à l'endroit des coordonnes de this */
    /* Appeler tabPoisson.remove(this) */
} 


Reproduction
public void reproduction(ArrayList tabPoissons,Object [][] tabMer,int nbLignes,int nbColonnes){ 
    /*
     Tirer les coordonnes du nouveau requin disponibles au hasard parmi les coordonnees disponibles dans l'aquarium
  */
    /* Creer donc le nouveau requin à partir de ces coordonnees */
    /* L'ajouter au tableau tabMer aux coordonnees tirees */
    /* L'ajouter au tabPoisson */
} 


En revanche, je n'ai pas encore compris la logique à programmer pour la méthode aFaim() : quel est son role exact ? Doit il immediatement manger un poisson au hasard sans meme attendre de tomber dessus ? (Je suppose que c'est bien cela). Dans ce cas-là, créer des méthodes supplémentaires pour simplifier le programme et éviter de dupliquer trop de code existant me paraitrait encore plus utile (manger(), poissonsDisponibles() et coordonneesPossible() entre autres).
0
Rejoignez-nous