Si j'ai bien compris, dans le cas de mon déplacement vers la droite par exemple ma boucle devrait ressembler à ceci ?
Code:
1
2
3 for (int i = 0; i < nbLig; i++) { for (int j = nbCol-1; j == 1; j--)
Version imprimable
Si j'ai bien compris, dans le cas de mon déplacement vers la droite par exemple ma boucle devrait ressembler à ceci ?
Code:
1
2
3 for (int i = 0; i < nbLig; i++) { for (int j = nbCol-1; j == 1; j--)
Oui et non.
Déjà for(int index=0; index==12; index++), fait :
- je déclare un int appelé index et j'y mets la valeur 0
- je teste s'il vérifie la condition, soit index==12, ce qui n'est pas le cas, puisqu'il vaut 0, donc je n'entre pas dans la boucle
Rapporté à ton cas :
Code:for (int j = nbCol-1; j == 1; j--)
- si nbCol=2, alors j vaut 1, ]je teste la condition 1==1, oui, j'entre dans la boucle, j'y fais ce que j'ai faire, je fais j--, donc j vaut 0, donc j==1 est faux, je sors de la boucle et j'ai fait ce qu'on voulait
- sinon, si nbCol=4, par exemple, j vaut 3, je teste la condition qui est fausse, donc je n'entre pas dans la boucle - je ne déplace rien donc.
Maintenant si on remplaçait j==1 par j>=1, on pourrait entrer dans la boucle (sauf si nbCol vaut 1, mais il n'y aurait pas de déplacement à faire dans ce cas, donc on reste cohérent). Mais dans ce cas tu ne déplaces jamais l'élément situé tout à gauche, en colonne j=0. On peut optimiser en ne traitant pas l'élément situé tout à droite, donc en colonne j=nbCol-1, puisqu'il ne peut être déplacé à droite (il sortirait).
Donc, la boucle complète (qui traitera inutilement l'élément situé tout à droite) :
La boucle optimisée :Code:for(int j=nbCol-1; j>=0; j--)
Code:for(int j=nbCol-2; j>=0; j--)
Je pense avoir compris ton raisonnement, et après avoir testé j'ai le plaisir de constater que ce problème est résolu!
Merci encore!
Je suis désolée de solliciter encore votre aide mais il faut croire qu'un problème en amène un autre :(
Maintenant que mes cases se déplacent bien comme il faut, je constate que certaines dépassent les limites du tableau et donc disparaissent!
Par exemple lorsque j'ai un 2 sur la toute première ligne du tableau et que je lance un déplacement vers le haut, ce 2 va disparaître et être remplacé par une case vide, comme s'il était monté à la case supérieure :?
Sans le code, je ne sais que dire.
A part peut-être dire que les déplacements verticaux sont similaires aux déplacements horizontaux dans la logique des boucles (donc vers le haut, normalement c'est vers l'index 0, donc c'est comme un déplacement vers la gauche, et vers le bas, comme un déplacement vers la droite), sauf qu'il faut échanger les deux lignes avec for (celui sur le i (les lignes) dans celui sur les j (les colonnes)). Si les déplacements horizontaux fonctionnent, les verticaux devraient fonctionner alors.
N'étant pas sur de la boucle que tu utilise et des affectation que tu fait sur ton tableau.
Peux-tu, nous montrer le code actuelle ?
Cordialement,
Patrick Kolodziejczyk.
Voici le code de la fonction déplacementHautCode:
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 // Déplacement vers le haut public void deplacementH() { for (int i = 0; i <= nbLig-1; i++) { for (int j = 0; j < nbCol; j++) { if (grille[i][j] != 0) { int a = i; while (a > 0 && grille[a-1][j] == 0) { a--; } if (a >= 0 && grille[a][j] == 0) { grille[a][j] = grille[i][j]; grille[i][j] = 0; } } } } }
Je pense avoir trouvé une solution mais je suis pas sure que le code soit bien optimisé
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
33 // Déplacement vers le haut public void deplacementH() { for (int i = 0; i <= nbLig-1; i++) { for (int j = 0; j < nbCol; j++) { if (grille[i][j] != 0) { int a = i; if (a == 0 && grille[a][j] != 0) { // On ne fait rien } else { while (a > 0 && grille[a-1][j] == 0) { a--; } if (a >= 0 && grille[a][j] == 0) { grille[a][j] = grille[i][j]; grille[i][j] = 0; } } } } } }
Sachant que a=i;, alors grille[a][j] != 0 et identique à grille[i][j] != 0.Code:
1
2
3
4
5 for (int i = 0; i <= nbLig-1; i++) { for (int j = 0; j < nbCol; j++) { if (grille[i][j] != 0) { int a = i; if (a == 0 && grille[a][j] != 0)
Ce qui veux dire que tu peux simplifié ta condition en :
Du coup, cela pourrai être remonté plus au haut dans ton traitement. Mais je ne suis pas sûr que le comportement implémenté soit ce que tu veux.Code:
1
2
3
4 for (int i = 0; i <= nbLig-1; i++) { for (int j = 0; j < nbCol; j++) { if (grille[i][j] != 0) { if (i == 0)
Cordialement,
Patrick Kolodziejczyk.
Merci pour la solution proposée @kolodz, la boucle que j'ai écrite fonctionne très bien en utilisant a ou i :)
Regarde ce que j'ai dit au sujet de la transformation du déplacement vers la gauche en déplacement vers le haut : tu dois échanger les for.
Pour un déplacement à gauche, pour chaque ligne, tu parcours les items (les colonnes dans la ligne) pour les déplacer. Pour un déplacement vers le haut, pour chaque colonne, tu parcours les items (les lignes dans la colonne)... Les bornes doivent suivre bien sûr (il suffit pas seulement d'échanger les 2 lignes de code).
Je ne comprends pas bien ta solution @joel.drigo, c'est peut être mieux d'utiliser la méthode que j'ai compris :oops:
Mets moi le code de ta méthode de déplacement à gauche et je vais t'expliquer : c'est super simple.
Quand tu écris :
Tu parcours tes lignes, et pour chaque ligne, tu parcours les colonnes dans cette ligne.Code:
1
2
3
4
5
6
7
8
9 for(int i=0; i<nbLig; i++) { for( int j=0; j<nbCol; j++ ) { int c = grille[i][j]; } }
Si tu écris :
Tu parcours tes colonnes, et pour chaque colonne, tu parcours les lignes dans cette colonne.Code:
1
2
3
4
5
6
7
8
9 for(int j=0; j<nbCol; j++) { for( int i=0; i<nbLig; i++ ) { int c = grille[i][j]; } }
Donc si pour faire un traitement qui fait par exemple comme ça pour des lignes dans un tableau carré :
On pourra avoir exactement le même traitement pour les colonnes (si le tableau est carré, il y a le même nombre de lignes et de colonnes) :Code:
1
2
3
4
5
6
7
8
9 for(int i=0; i<nbLig; i++) { for( int j=a; j<b; j++ ) { int c = grille[i][j]; } }
Code:
1
2
3
4
5
6
7
8
9 for(int j=0; j<nbCol; j++) { for( int i=a; i<b; i++ ) { int c = grille[i][j]; } }
Après cet exemple je pense avoir compris :)
Loin de moi l'envie d'exagérer mais je souhaiterai vous solliciter de nouveau :oops:
Je voudrais maintenant réussir à placer la somme de deux cases de mon tableau dans une seule.. Mais en vain..
Je ne pense pas que mon code soit complètement faux puisque j'obtiens bien le "0" dans la case grille[i][j] .. Cependant la case grille[a][j] (correspondant à grille[i-1][j]) conserve sa valeur de départ :sCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 if (grille[i][j] != 0) { int a = i; if (!(a == 0 && grille[a][j] != 0)) { while (a > 0 && grille[a-1][j] == 0) { a--; } if (a >= 0 && grille[a][j] == 0) { grille[a][j] = grille[i][j]; grille[i][j] = 0; } } if (grille[i][j] == grille[a][j]) { grille[a][j] = grille[i][j] * 2; grille[i][j] = 0; } }
Première solution, après avoir fait le mouvement d'une tuile, tu détermines si le mouvement a été arrêté parce qu'on était au bord ou contre une tuile, et si cette la valeur de cette tuile est égale à celle qui est déplacée.
Voilà le test concerné dans le dernier code posté :
Donc pour vérifier que ça s'est arrêté contre le bord : a == 0.Code:
1
2
3
4 if (a >= 0 && grille[a][j] == 0) { grille[a][j] = grille[i][j]; grille[i][j] = 0; }
Donc si a!=0 (ça ne s'est pas arrêté contre le bord) et que grille[a-1][j]==grille[i][j], on fait pas grille[a][j] = grille[i][j], mais grille[a-1][j] = grille[i][j]*2. On fait bien sûr grille[i][j] = 0 dans les deux cas.
Tu peux même en plus tester juste après si on a atteint 2048 (if (grille[a-1][j]==2048).
Seconde solution, dans la boucle qui détermine jusqu'où on bouge :
Tu testes aussi (en plus de si la case est vide, si la case contient une tuile de même valeur que celle déplacée), et dans le bloc tu traites ce cas particulier comme la fusion (plus arrêt), et non le déplacement.Code:if (!(a == 0 && grille[a][j] != 0))
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 if (grille[i][j] != 0) { int a = i; if (!(a == 0 && grille[a][j] != 0)) { while (a > 0 && grille[a-1][j] == 0) { a--; } if (a >= 0 && grille[a][j] == 0) { grille[a][j] = grille[i][j]; grille[i][j] = 0; } if (a != 0 && grille[a-1][j] == grille[i][j]) { grille[a-1][j] = grille[i][j] * 2; grille[i][j] = 0; } } }
Je pensais réussir avec ce code mais c'est encore un échec :calim2:
Vois-tu une erreur?
Ca y est ça fonctionne! (dans le cas de mon déplacement vers le haut du moins) :aie:Code:
1
2
3
4
5 if (a != 0 && grille[a-1][j] == grille[a][j]) { grille[a-1][j] = grille[a-1][j] * 2; grille[a][j] = 0; }
Merci @joel.drigo, tu m'as tellement aidé depuis hier! Merci beaucoup!