aurelienparis12
Messages postés2Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention16 mars 2007
-
15 mars 2007 à 20:04
aurelienparis12
Messages postés2Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention16 mars 2007
-
16 mars 2007 à 08:42
Bonjour,
j'espere quelqu'un pourra m'aider.
Pour un projet je doit faire des deplacement des pions et j'aimerais les faire les un apres les autres donc j'ai utilisé un semaphore .
Le soucis c'est que le release ne relache pas forcement le premier entré. J'ai pourtant mis le boolean fair à true donc la semaphore est censé respecté la logique d'une pile FIFO .
la declaration de mon semaphore
Semaphore Sem = new Semaphore(1,true);
public void deplacerPion(final int zonedepart,final int zonearrive,final int equipe,final int type){
System.out.println("Demande de "+zonedepart+" vers "+zonearrive);
new Thread() {
Zone depart=zones.getZone(zonedepart);
Zone arrive=zones.getZone(zonearrive);
int orix;
int oriy;
int destx;
int desty;
Fonctions f ;
private void init(){
System.out.println("fait de "+zonedepart+" vers "+zonearrive);
orix=depart.getCoor(equipe, type).getX();
oriy=depart.getCoor(equipe, type).getY();
poserPion(zonearrive,equipe,type,0);
destx=arrive.getCoor(equipe, type).getX();
desty=arrive.getCoor(equipe, type).getY();
temp=new Pions(new Coor(orix,oriy));
temp.setEquipe(equipe);
temp.setType(type);
deplacement=true;
f = new Fonctions(orix, destx, oriy, desty);
retirerPion(zonedepart,equipe,type,1);
}
public void run() {
try {
Sem.acquire();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
init();
//si deplacement vers la droite
if (orix < destx) {
for (int i = orix; i < destx; i++) {
temp.getPosition().setX(i);//on augmente l'abscisse de l'image du pion
temp.getPosition().setY(f.use(i));// on applique la fonction f à l'ordonnée de l'image
repaint();//temps d'arret entre chaque images
try {
Thread.sleep(5);//temps d'arret entre chaque images
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
//si deplacement vers la gauche
if (orix > destx) {
for (int i = orix; destx < i; i--) {
temp.getPosition().setX(i);//on diminue l'abscisse d'affichage de l'image
temp.getPosition().setY(f.use(i));// on applique la fonction f à l'ordonnée de l'image
repaint();// on rafrachit l'image
try {
Thread.sleep(5);//temps d'arret entre chaque images
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
temp.getPosition().setX(destx);//on place le pion à sa destination
temp.getPosition().setY(desty);
repaint();
deplacement=false;
poserPion(zonearrive,equipe,type,1);
Sem.release();
}
}.start();// on lance le deplacement du pion
}
Demande de 4 vers 1
Demande de 1 vers 3
Demande de 3 vers 2
fait de 4 vers 1
Demande de 2 vers 4
fait de 3 vers 2
Exception in thread "Thread-4" java.lang.NullPointerException
at test.Plateau_jeu$1.init(Plateau_jeu.java:346)
at test.Plateau_jeu$1.run(Plateau_jeu.java:369)
ce qui est normal puisqu'il deplace le pions de la case 4 à 1 puis apres essaye de deplacer le pion de la case 3 vers 2 mais il n'y a pas de pions sur la case 3 donc ne trouve pas le pion à deplacer :cry:
Merci d'avance à tout ce qui auront tout lu meme s'il ne reponde pas au moins vous avez essayé .
aurelienparis12
Messages postés2Date d'inscriptionlundi 9 octobre 2006StatutMembreDernière intervention16 mars 2007 16 mars 2007 à 08:42
oui a cause de l'edt car on doit voir le pion se deplacer . Sans thread le pion apparaitrait directement à sa place final . De plus le thread.sleep bloquerai mon interface trop souvent .