IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Tétris]Suppression d'une ligne


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut [Tétris]Suppression d'une ligne
    Bonjour

    Je rencontre quelques problèmes dans mon tétris lorsqu'il faut supprimer une ligne.
    J'ai créé une variable booléenne "ligne" pour savoir si la ligne est remplie ou non. Elle est initialisée à "false".

    J'ai ensuite un "switch" pour blitter tous les éléments de la carte (1 nombre = 1 couleur de bloc -> 0 = rien sur la carte).

    Voici le code que j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    for(int i=0;i<NB_BLOCS_H;i++){
                for(int j=0;j<NB_BLOCS_L;j++){
                    ligne = true;
                    int pos_x =j*TAILLE_BLOC, pos_y = i*TAILLE_BLOC;
                    switch(carte[i][j]){
                        case 0:
                        vide.SetLeft(pos_x);
                        vide.SetTop(pos_y);
                        ecran.Draw(vide);
                        ligne = false;
                        break;
                        case 1:
                        jaune.SetLeft(pos_x);
                        jaune.SetTop(pos_y);
                        ecran.Draw(jaune);
                        break;
                        case 2:
                        rouge.SetLeft(pos_x);
                        rouge.SetTop(pos_y);
                        ecran.Draw(rouge);
                        break;
                        case 3:
                        bleu.SetLeft(pos_x);
                        bleu.SetTop(pos_y);
                        ecran.Draw(bleu);
                        break;
                        case 4:
                        brun.SetLeft(pos_x);
                        brun.SetTop(pos_y);
                        ecran.Draw(brun);
                        break;
                        case 5:
                        mauve.SetLeft(pos_x);
                        mauve.SetTop(pos_y);
                        ecran.Draw(mauve);
                        break;
                        case 6:
                        orange.SetLeft(pos_x);
                        orange.SetTop(pos_y);
                        ecran.Draw(orange);
                        break;
                        case 7:
                        vert.SetLeft(pos_x);
                        vert.SetTop(pos_y);
                        ecran.Draw(vert);
                        break;
                    }
                }//Fin du "for" de parcours de ligne horizontal
                    if(ligne){
                        for(int k=0;k<NB_BLOCS_L;k++){
                            carte[i][k] = 0;
                        }
                        for(int remonte_lignes = i; remonte_lignes < 0; remonte_lignes--){
                            for(int k=0;k<NB_BLOCS_L;k++){
                                if(carte[remonte_lignes][k] != 0){
                                    carte[remonte_lignes+1][k] = carte[remonte_lignes][k];
                                    carte[remonte_lignes][k] = 0;
                                }//Fin du "if"
                            }//Fin du premier "for"
                        }//Fin du "for" de la remontée de lignes
                    }//Fin du "if" si la ligne est remplie
            }
    Deux boucles parcourent la variable "carte" (qui est un tableau de NB_BLOCS_H de hauteur et de NB_BLOCS_L de largeur.
    On teste la valeur de la "case" et on blitte le bloc correspondant.

    A CHAQUE DEBUT DE LIGNE, la variable "ligne" (booléen) passe à "true". Si jamais un seul espace vide (0) est affiché, elle passe à "false".
    Le programme sort ensuite du "for" qui parcours la carte horizontalement et teste si la variable "ligne" vaut "true" ou "false".

    Si cette variable est à "true", alors, le programme supprime la ligne et fait descendre tous les blocs.

    Les problèmes sont les suivants:
    -Si un bloc est présent dans le coin inférieur droit de la carte (DERNIER BLOC "BLITTE" (colle à l'écran), le programme supprime toute la ligne
    -Le code de suppression de ligne est foireux, le programme supprime tout ou une grande partie des blocs présents à l'écran.

    Quels sont les problèmes?

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    excuse moi mais dans ton code je ne vois nulle part où on met ligne à false.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Par défaut
    C'est juste un bug lors du copiage du code.
    J'ai corrigé le code.

    Le "ligne = false;" se trouve dans le "case 0:" (si on colle une surface vide).

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    Je crois qu'en fait du devrais mettre le 'ligne = true' avant les deux boucles for, parceque là elle passe à true automatiquement à chaque bloc que tu étudies.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JTABLE] suppression d'une ligne (prise de tete)
    Par uraxyd dans le forum Composants
    Réponses: 1
    Dernier message: 14/12/2005, 19h19
  2. Réponses: 3
    Dernier message: 19/09/2005, 13h20
  3. [Debutant][JTable] Suppression d'une ligne
    Par seiryujay dans le forum Composants
    Réponses: 7
    Dernier message: 03/08/2005, 17h15
  4. [JTable] problème après suppression d'une ligne
    Par fredo3500 dans le forum Composants
    Réponses: 7
    Dernier message: 17/03/2005, 10h01
  5. Réponses: 6
    Dernier message: 04/03/2004, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo