Feat: Implémentation de pushLeft et pushRight

- Ajout des méthodes pushLeft et pushRight dans Game.java pour gérer
  le déplacement et la fusion horizontaux.
- Logique 'alreadyCombined' adaptée pour les mouvements horizontaux.
- Ajout de logs de débogage pour pushLeft/pushRight.
- Mise à jour de MainActivity pour tester les quatre directions.
This commit is contained in:
Augustin ROUX 2025-04-03 18:39:34 +02:00
parent 0b297a3089
commit e3c2cc74a3
2 changed files with 113 additions and 28 deletions

View File

@ -54,11 +54,11 @@ public class Game {
public void pushUp() {
Log.d("Game", "Pushing Up"); // Pour le débogage
boolean[] alreadyCombined = new boolean[4]; // Tableau pour éviter les doubles fusions par colonne
Log.d("Game", "Pushing Up");
boolean[] alreadyCombined = new boolean[4];
for (int y = 0; y < 4; y++) {
alreadyCombined = new boolean[4]; // Réinitialise pour chaque colonne
alreadyCombined = new boolean[4];
for (int x = 1; x < 4; x++) {
if (gameBoard[x][y] != 0) {
int value = gameBoard[x][y];
@ -82,9 +82,7 @@ public class Game {
gameBoard[x][y] = 0;
alreadyCombined[currentX - 1] = true;
} else {
// La case cible a déjà fusionné, on place la tuile juste en dessous
gameBoard[currentX][y] = value;
// Vide la case d'origine seulement si la tuile a bougé
if (currentX != x) {
gameBoard[x][y] = 0;
}
@ -95,38 +93,35 @@ public class Game {
}
public void pushDown() {
Log.d("Game", "Pushing Down"); // Pour le débogage
boolean[] alreadyCombined = new boolean[4]; // Tableau pour éviter les doubles fusions par colonne
Log.d("Game", "Pushing Down");
boolean[] alreadyCombined = new boolean[4];
for (int y = 0; y < 4; y++) {
alreadyCombined = new boolean[4]; // Réinitialise pour chaque colonne
for (int x = 2; x >= 0; x--) { // Commence à l'avant-dernière ligne et remonte
alreadyCombined = new boolean[4];
for (int x = 2; x >= 0; x--) {
if (gameBoard[x][y] != 0) {
int value = gameBoard[x][y];
int currentX = x;
// Déplace vers le bas tant que la case en dessous est vide
while (currentX < 3 && gameBoard[currentX + 1][y] == 0) {
currentX++; // Incrémente pour descendre d'une ligne
currentX++;
}
if (currentX == 3) { // Arrivé tout en bas
if (currentX == 3) {
gameBoard[3][y] = value;
if (currentX != x) // Vide seulement si déplacé
if (currentX != x)
gameBoard[x][y] = 0;
} else if (gameBoard[currentX + 1][y] != value) { // Case en dessous différente
gameBoard[currentX][y] = value; // Place juste au-dessus
if (currentX != x) // Vide seulement si déplacé
gameBoard[x][y] = 0;
} else if (!alreadyCombined[currentX + 1]) { // Case en dessous identique ET non fusionnée
gameBoard[currentX + 1][y] *= 2; // Fusionne
score += gameBoard[currentX + 1][y];
gameBoard[x][y] = 0; // Vide la case d'origine
alreadyCombined[currentX + 1] = true; // Marque comme fusionné
} else {
// La case cible a déjà fusionné, on place la tuile juste au-dessus
} else if (gameBoard[currentX + 1][y] != value) {
gameBoard[currentX][y] = value;
if (currentX != x)
gameBoard[x][y] = 0;
} else if (!alreadyCombined[currentX + 1]) {
gameBoard[currentX + 1][y] *= 2;
score += gameBoard[currentX + 1][y];
gameBoard[x][y] = 0;
alreadyCombined[currentX + 1] = true;
} else {
gameBoard[currentX][y] = value;
// Vide seulement si déplacé
if (currentX != x) {
gameBoard[x][y] = 0;
}
@ -135,4 +130,82 @@ public class Game {
}
}
}
public void pushLeft() {
Log.d("Game", "Pushing Left"); // Pour le débogage
boolean[] alreadyCombined = new boolean[4]; // Tableau par ligne cette fois
for (int x = 0; x < 4; x++) { // Itère sur les *lignes* d'abord
alreadyCombined = new boolean[4]; // Réinitialise pour chaque ligne
for (int y = 1; y < 4; y++) { // Itère sur les *colonnes*, en commençant par la deuxième
if (gameBoard[x][y] != 0) {
int value = gameBoard[x][y];
int currentY = y; // Suit la colonne
// Déplace vers la gauche
while (currentY > 0 && gameBoard[x][currentY - 1] == 0) {
currentY--;
}
if (currentY == 0) { // Arrivé tout à gauche
gameBoard[x][0] = value;
if(currentY != y)
gameBoard[x][y] = 0;
} else if (gameBoard[x][currentY - 1] != value) { // Case à gauche différente
gameBoard[x][currentY] = value;
if(currentY != y)
gameBoard[x][y] = 0;
} else if (!alreadyCombined[currentY - 1]) { // Case à gauche identique et non fusionnée
gameBoard[x][currentY - 1] *= 2; // Fusionne
score += gameBoard[x][currentY - 1];
gameBoard[x][y] = 0;
alreadyCombined[currentY - 1] = true; // Marque comme fusionné
} else { // Case à gauche identique mais déjà fusionnée
gameBoard[x][currentY] = value; // Place à côté
if(currentY != y)
gameBoard[x][y] = 0;
}
}
}
}
}
public void pushRight() {
Log.d("Game", "Pushing Right"); // Pour le débogage
boolean[] alreadyCombined = new boolean[4]; // Tableau par ligne
for (int x = 0; x < 4; x++) { // Itère sur les *lignes*
alreadyCombined = new boolean[4]; // Réinitialise pour chaque ligne.
for (int y = 2; y >= 0; y--) { // Itère sur les *colonnes*, de droite à gauche (avant-dernière vers première)
if (gameBoard[x][y] != 0) {
int value = gameBoard[x][y];
int currentY = y; // Suit la colonne
// Déplace vers la droite
while (currentY < 3 && gameBoard[x][currentY + 1] == 0) {
currentY++;
}
if (currentY == 3) { // Arrivé tout à droite
gameBoard[x][3] = value;
if (currentY != y)
gameBoard[x][y] = 0;
} else if (gameBoard[x][currentY + 1] != value) { // Case à droite différente
gameBoard[x][currentY] = value;
if(currentY != y)
gameBoard[x][y] = 0;
} else if (!alreadyCombined[currentY + 1]) { // Case à droite identique et non fusionnée
gameBoard[x][currentY + 1] *= 2; // Fusionne
score += gameBoard[x][currentY + 1];
gameBoard[x][y] = 0;
alreadyCombined[currentY + 1] = true; // Marque comme fusionné
} else { // Case à droite identique mais déjà fusionnée
gameBoard[x][currentY] = value; // Place à côté
if (currentY != y)
gameBoard[x][y] = 0;
}
}
}
}
}
}

View File

@ -11,7 +11,7 @@ public class MainActivity extends AppCompatActivity {
Game game = new Game();
// Initialisation et tests plus systématiques
// Initialisation et tests des quatre directions
game.addNewNumbers();
game.addNewNumbers();
game.addNewNumbers();
@ -20,10 +20,22 @@ public class MainActivity extends AppCompatActivity {
game.pushUp();
game.printArray(); // Après pushUp
game.addNewNumbers(); // Ajoute une autre tuile
game.printArray(); // Grille avant pushDown
game.addNewNumbers();
game.printArray(); // Avant pushDown
game.pushDown();
game.printArray(); // Après pushDown
game.addNewNumbers();
game.printArray(); // Avant pushLeft
game.pushLeft();
game.printArray(); // Après pushLeft
game.addNewNumbers();
game.printArray(); // Avant pushRight
game.pushRight();
game.printArray(); // Après pushRight
}
}