LigneLibre entre deux cases
Bonjour à tous,
je suis entrain de développer une petite interface graphique modélisant un jeu de plateau et je souhaite savoir s'il y a une ou des pièces sur le chemin entre deux cases (les cases sont représentées par des objets de la classe Position que voici) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public class Position {
// La position est définie par un numéro de ligne et un de colonne
private int ligne;
private int colonne;
public Position(int ligne, int colonne) { // Constructeur
this.ligne = ligne; this.colonne = colonne;
}
// Retourne le numéro de ligne de la position.
public int ligne() { return ligne; }
// Retourne le numéro de colonne de la position.
public int colonne() { return colonne; }
} |
Grâce à cette classe, je souhaite savoir si une ligne entre deux cases (deux positions) est libre ou non et ceci, horizontalement, verticalement et en diagonale. Voici la fonction que je développe pour celà :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
public boolean ligneLibre(final Position depart, final Position arrivee) {
// Ligne non libre horizontalement
if((depart.ligne() == arrivee.ligne())){
for(int i = Math.abs(arrivee.colonne()-depart.colonne())-(Math.abs(arrivee.colonne()-depart.colonne())-1) ; i<Math.abs(arrivee.colonne()-depart.colonne()) ; i++){
if(plateau[depart.ligne()][i] != null){ // S'il y a une pièce
return false;
}
}
}
// Ligne non libre verticalement
if((depart.colonne() == arrivee.colonne())){
for(int i = Math.abs(arrivee.ligne()-depart.ligne())-(Math.abs(arrivee.ligne()-depart.ligne())-1) ; i<Math.abs(arrivee.ligne()-depart.ligne()) ; i++){
if(plateau[i][depart.colonne()] != null){ // S'il y a une pièce
return false;
}
}
}
// Ligne non libre en diagonale
if(Math.abs(depart.ligne()-arrivee.ligne()) == Math.abs(depart.colonne()-arrivee.colonne())){
for(int i = Math.abs(arrivee.ligne()-depart.ligne())-(Math.abs(arrivee.ligne()-depart.ligne())-1) ; i<Math.abs(arrivee.ligne()-depart.ligne()) ; i++){
for(int j = Math.abs(arrivee.ligne()-depart.ligne()); j >= Math.abs(arrivee.ligne()-depart.ligne())-(Math.abs(arrivee.ligne()-depart.ligne())-1); j--){
if(plateau[i][j] != null){ // S'il y a une pièce
return false;
}
}
}
}
// Sinon, on retourne toujours vrai car ligne libre
return true;
} |
plateau[][] est un plateau de pièces. La fonction ci-dessus renvoie true si la ligne est libre et false sinon.
Je pense avoir trouvé pour la ligne horizontale ou verticale, mais la diagonale me pose des problèmes. Si vous avez des idées, merci beaucoup !
Et si vous voyez des fautes, n'hésitez pas à me le préciser, merci.