Problème thread

Résolu
chino18 Messages postés 82 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 1 avril 2011 - 4 févr. 2005 à 10:38
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 - 7 févr. 2005 à 15:27
Bonjour à tous.

Je programme acuellement une sorte de
pacman. J'ai une grille avec un personnage à contrôler et
3 ennemis qui se déplacent de
manière aléatoire (jusqu'à trouver la trace
de pacman).

Un ennemi (Who) dérive d'une classe
Perso qui elle même dérive de la classe Thread. Chaque ennemi
correspond donc à un Thread et se déplace de manière indépendante.









public class Who extends Perso{

boolean suitPiste=false;





public Who( String str, int xx, int yy, int v,Grille gr){

super (str, xx, yy, v, gr);

suitPiste=false;

grille.tableau[x][y].estWho=true;

}



public void run(){



deplacerWho();

}



public void deplacerWho(){

while(true){

try{

Thread.sleep(vitesse);

if(grille.tableau[x][y].estBonbon==true){

grille.tableau[x][y].estBonbon=false;

suitPiste=true;

}

grille.tableau[x][y].estWho=false;

grille.dessinerBlanc(x,y);

direction();



grille.tableau[x][y].estWho=true;

grille.dessinerWho(x,y);

}

catch(InterruptedException e){}

}

}





public void direction(){

//if(suitPiste==false){



int choixdir;

Random nbrealea= new Random(); //

choixdir=nbrealea.nextInt(4); //

while(!positionValide(choixdir)){ // c'est la que

choixdir=nbrealea.nextInt(4); // ca merdouille

}



switch(choixdir){

case 0: x++;break;

case 1: x--;break;

case 2: y++;break;

case 3: y--;break;

}




System.out.println(nom+": "+x+"
"+y+" " +choixdir+"\n");

//}

}



public boolean positionValide(int choix){

int xtemp, ytemp;

xtemp=x;

ytemp=y;

/*if(choix>=0 && choix<25)

xtemp++;

else if (choix>=25 && choix<50)

xtemp--;

else if (choix>=50 && choix<75)

ytemp++;

else if (choix>=75 && choix<100)

ytemp--;*/

switch(choix){

case 0: xtemp++;break;

case 1: xtemp--;break;

case 2: ytemp++;break;

case 3: ytemp--;break;

}



//System.out.println(xtemp+" "+ytemp+"\n");

if(xtemp<0 || xtemp>24 || ytemp<0 || ytemp>24)

return false;

if(grille.tableau[xtemp][ytemp].estObstacle==true ||

grille.tableau[xtemp][ytemp].estWho==true ){

return false;

}



return true;

}



/*public boolean positionValidePiste(int choix){

int xtemp, ytemp;

xtemp=x;

ytemp=y;

switch(choix){

case 0: xtemp+=1;break;

case 1: xtemp-=1;break;

case 2: ytemp+=1;break;

case 3: ytemp-=1;break;

}

if(grille.tableau[xtemp][ytemp].estObstacle==true &&



grille.tableau[xtemp][ytemp].estWho==true &&



grille.tableau[xtemp][ytemp].estBonbon==true &&


xtemp<0
&& xtemp>=25 && ytemp<0 && ytemp>=25){

return false;

}

return true;

}*/



}











Voici mon problème :

pour le choix de la direction, j'utilise un random;

Ce que je ne comprend pas, c'est
pourquoi, dans la majorité des cas, le nombre retourné par le random
est identique pour chaque ennemi a un même instant.



Je me demande s'il ne s'agit pas d'un problème de synchronisation.



Merci de me dépatouiller de cet épineux problème


-- message approuvé par Jean-Claude Van Damme --

3 réponses

cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
7 févr. 2005 à 15:27
Salut

De rien !
Dommage que ce soit dans le cahier on ne fais jamais comme ça et cela pour un grand nombre de raisons, d'ailleurs il n'y a aucuns avantages à faire de cette manière, je dirais même qu'il n'y a que des désavantages !!! Petit problème de conception (on ne fait jamais comme ça dans un jeu !!!!) de la part de l'auteur !!!

@+
3
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
7 févr. 2005 à 10:48
Salut

Cela n'a rien à voir avec tes threads rassure toi !!! Egalement le fait de mettre le traitement de la logique d'une entité du jeu dans une thread est une forte mauvaise idée, tu aurais du appellés la logique de tes personnes de façon controlé et séquentiel selon l'ordre de traitement que tu réalises. De plus tu risque de mettre facilement des bugs de synchronisation ...

La réponse a ta question est simple et contenu dans la description de la classe Random : http://java.sun.com/j2se/1.4.2/docs/api/java/util/Random.html#nextInt()


An instance of this class is used to generate a stream of pseudorandom numbers. The class uses a 48-bit seed, which is modified using a linear congruential formula. (See Donald Knuth, The Art of Computer Programming, Volume 2, Section 3.2.1.)
If two instances of
Random
are created with the same seed, and the same sequence of method calls is made for each, they will generate and return identical sequences of numbers.
In order to guarantee this property, particular algorithms are specified for the class <TT>Random</TT>. Java implementations must use all the algorithms shown here for the class <TT>Random</TT>, for the sake of absolute portability of Java code. However, subclasses of class <TT>Random</TT> are permitted to use other algorithms, so long as they adhere to the general contracts for all the methods.
The algorithms implemented by class <TT>Random</TT> use a <TT>protected</TT> utility method that on each invocation can supply up to 32 pseudorandomly generated bits.
Many applications will find the
random
method in class
Math
simpler to use.
(It's better for you i think)

Maintenant regarde à nouveau ton code, tu devrais comprendre (je t'aide un peu ) :

int choixdir;

Random nbrealea= new Random(); //
choixdir=nbrealea.nextInt(4); //
while(!positionValide(choixdir)){ // c'est la que
choixdir=nbrealea.nextInt(4); // ca merdouille

La solution n'est pas compliqué à mettre en place, je te laisse le soind e le faire ...

@+
0
chino18 Messages postés 82 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 1 avril 2011 1
7 févr. 2005 à 15:14
Salut neodante et Merci pour ta réponse.

Je me doutais que le random pouvait me causer problème, mais je voyais pas pourquoi.

J'ai essayé avec Math.random() et ca marche nickel.



En ce qui concerne le traitement
des threads, j'ai pas eu trop le choix, c'est dasn le cahier des
charges (dont je ne suis pas l'auteur ).



-- message approuvé par Jean-Claude Van Damme --
0
Rejoignez-nous