diff --git a/app/src/main/java/legion/muyue/best2048/Game.java b/app/src/main/java/legion/muyue/best2048/Game.java index 29225d1..dca2a48 100644 --- a/app/src/main/java/legion/muyue/best2048/Game.java +++ b/app/src/main/java/legion/muyue/best2048/Game.java @@ -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; + } + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/legion/muyue/best2048/MainActivity.java b/app/src/main/java/legion/muyue/best2048/MainActivity.java index f9000ea..2572400 100644 --- a/app/src/main/java/legion/muyue/best2048/MainActivity.java +++ b/app/src/main/java/legion/muyue/best2048/MainActivity.java @@ -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 } } \ No newline at end of file