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 :

conditions qui ne marchent pas


Sujet :

C++

  1. #1
    Membre régulier Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Points : 108
    Points
    108
    Par défaut conditions qui ne marchent pas
    salut tout le monde .
    voila j'ai un fais une petite fonction pour mon jeu(tetris) qui permet de supprimer les lignes completes et de calculer le score .voila le code:
    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
    int nb=1;
    for(int j=NB_BLOCS_HAUTEUR-1;j>0;j--)
    {   
        bool complet = true;
        for(int i=0;i<NB_BLOCS_LARGEUR;i++)
        {  
            if(carte[i][j] == 0)
                complet = false;
        }
        if(complet == true)
        {
            nb ++;
            compteur+=100;
            FSOUND_PlaySound(FSOUND_FREE, casse);// Pour generer un son pendant la suppression d'un ligne
            for(int k=j;k>0;k--)
            {               
                for(int i=0;i<NB_BLOCS_LARGEUR;i++)
                carte[i][k] = carte[i][k-1];
            }
            for(int i=0;i<NB_BLOCS_LARGEUR;i++)
            {
                carte[i][0] = 0;
            }
        }
    }
    if( nb == 4)
    {
        FSOUND_PlaySound(FSOUND_FREE, yeah1);
        compteur+=400;
    }
    if(nb == 3)
    {
        FSOUND_PlaySound(FSOUND_FREE, yeah);
        compteur+=300;
    }
    vous pouvez remarquez que je veux produire des sons selon le nombre de ligne s supprimer a la fois et attribuer des scores bonus aussi.
    le probleme que ca marche pas : j'ai pas encore fais un affichage des score mais j'entend le son correspondant a 3 lignes meme si je fais 4 !!

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Es tu sur de ne pas plutôt entendre le son qui doit représenter quatre lignes quand tu en supprimes trois, et de ne pas avoir de son quand tu en supprime 4

    En effet, tu met nb à 1 au départ, ce qui fait que nb vaudra
    • 2 si ton code trouve une ligne
    • 3 s'il en trouve 2
    • 4 s'il en trouve 3
    • ...

    Vu qu'il est incrémenté si complet est vrai

    En plus, j'aurais plutôt recours à un if else if ou mieux, à un switch... case, si tu prévois de rajouter un son si 5 puis 6 puis... lignes sont effacées en même temps :p

  3. #3
    Membre régulier Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Points : 108
    Points
    108
    Par défaut
    j'affirme que c'est bizar mais je suis sur que c'est le son de 3 lignes que j'entend meme si je fais 4 .
    Encore plus si j'initialise nb a 0 j'entend plus rien si je fais 3 ou meme 4 !!!!

  4. #4
    Membre régulier Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Points : 108
    Points
    108
    Par défaut
    c'est vraiment bizar ce truc :

    j'ai changé les conditions pour essayer:

    nb=0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    switch( nb )
     
      {
      case 1 :
    	  FSOUND_PlaySound(FSOUND_FREE, yeah1);
    	  compteur+=400; 
    	  break;
     
      case 2: 
    	  FSOUND_PlaySound(FSOUND_FREE, yeah);
    	  compteur+=300;
    	  break;
      }
    donc yeah1 pour une ligne
    yeah pour deux lignes

    voila les resultats

    si je fais une ligne : yeah1 ( tout va bien )
    si je fais deux lignes : 2 yeah1
    si je fais 3 lignes : yeah1 et yeah
    si je fais 4 lignes: 2 yeah1 et yeah

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Prends l'habitude de faire un scope pour chaque case, sinon un jour tu vas avoir une erreur de déclaration multiple et tu ne sauras même pas pourquoi.

    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
     
    switch( nb )
    {
      case 1 :
      {
        FSOUND_PlaySound(FSOUND_FREE, yeah1);
        compteur+=400; 
        break;
      }
      case 2: 
      {
        FSOUND_PlaySound(FSOUND_FREE, yeah);
        compteur+=300;
        break;
      }
    }
    Pour ton problème je ne sais pas.

  6. #6
    screetch
    Invité(e)
    Par défaut
    il y a une erreur dans ta boucle qui fait que tu ne detectes qu'une ligne sur deux. a la frame suivante tu vas detecter une autre ligne. un truc dans ce gout la.

    si j'ai bien compris :
    - tu pars du bas de l'ecran.
    - tu regardes si la ligne en cours est pleine.
    - si oui :
    - a partir de la ligne en cours et jusqu'au haut de l'ecran, tu remplaces la ligne par sa suivante

    PROBLEME :
    tu vas remplacer la ligne en cours par la ligne suivante, puis passer a la ligne suivante qui a ete remplacée par la ligne encore suivante. en d'autres termes, tu vas sauter la ligne suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int nb=1;
    for(int j=0;j<NB_BLOCS_HAUTEUR;j++)
    .......

    Pour eviter cela, pars du haut de l'ecran, comme cela tu remplaceras la ligne en cours par une que tu as deja vue, et donc a plus le bug.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Prends l'habitude de faire un scope pour chaque case, sinon un jour tu vas avoir une erreur de déclaration multiple et tu ne sauras même pas pourquoi.
    Je n'ai jamais créé de scope pour mes différents case, et je n'ai jamais eu de problème à ce sujet...

    Maintenant, il est vrai que j'évite les déclarations au sein d'un case

    guitariste>> c'est donc qu'il te faut revoir la logique de calcul pour nb ...

    J'aurais presque l'impression qu'il y a une boucle qui est effectuée quelque part (ou que ce n'est pas le seul endroit où tu demande de jouer ces sons...)

    Mais le problème semble se situer en dehors du code que tu nous as fourni, car il n'y a, a priori, aucune raison que cela se passe comme tu le décris

    Ceci dit, et parce que j'ai (enfin) pris la peine de me plonger intensément dans ton code, je me demande si tu n'aurais pas intérêt à remplacer ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for(int i=0;i<NB_BLOCS_LARGEUR;i++)
        {  
            if(carte[i][j] == 0)
                complet = false;
        }
    par une boucle du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while(i<NB_BLOCS_LARGEUR && complet)
    {
        if(carte[i][j]==0)
            complet=false;
        ++i;
    }
    La raison en est simple: dans le premier cas, tu devra d'office tester toutes les cases de la ligne, y compris si l'une des toutes première est vide (ce qui fait d'office que la ligne est vide), alors que, dans le second cas, tu ne testera les cases de ta ligne QUE... si tu as encore une possibilité que ta ligne soit complète

    Le gain de temps sera d'autant plus important que la première case vide apparaitra tôt

    J'ai en outre l'impression que ta matrice est construite sur le modèle colone ligne (que le premier indice est celui... de la colone )

    De manière général, une matrice est toujours construite sur le modèle inverse: le premier indice donné est celui... de la ligne, et le second celui de la colone.

    La raison en est simple: tu obtiendra le même nombre total d'éléments (ici la possibilité de placer 18 caractères) si tu crées une matrice sous la forme de
    que si tu la crée sous la forme de
    Sauf que, dans le premier cas, il s'agira de pouvoir placer 3 chaines de 6 caractères (dont le '\0' si c'est une chaine "C style")
    alors que dans le deuxième cas, il s'agira de pouvoir placer... 6 chaines de trois caractères (dont le '\0' si c'est une chaine "C style")

    En plus, il apparait dans ton code que tu travaille régulièrement à faire bouger toute une ligne (c'est à dire l'ensemble des NB_BLOCS_LARGEUR blocs qui composent la ligne )

    Le fait de "changer ton fusil d'épaule" et de travailler de manière classique sur les matrices (en modifiant le code partout où c'est nécessaire) te permettrait avantageusement de remplacer le tronçon de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            for(int k=j;k>0;k--)
            {               
                for(int i=0;i<NB_BLOCS_LARGEUR;i++)
                carte[i][k] = carte[i][k-1];
            }
            for(int i=0;i<NB_BLOCS_LARGEUR;i++)
            {
                carte[i][0] = 0;
            }
    par un tout simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int k=j;l>0;--k)
        memcpy(carte[k-1],carte[k],NB_BLOCS_LARGEUR * sizeof( le_type_utilise_pour_carte);
    memcpy(carte[j],0,NB_BLOCS_LARGEUR * sizeof( le_type_utilise_pour_carte);
    qui sera bien plus rapide à l'exécution (et qui est tout de suite plus "compact", sans pour autant perdre en lisiblité )

  8. #8
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    std::copy plutôt, pour ne pas avoir à se trimballer le sizeof à chaque fois.

Discussions similaires

  1. [AJAX] listes liés qui ne marchent pas sous Mozilla
    Par guigui5931 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 23/02/2009, 15h54
  2. Listes imbriquées qui ne marchent pas
    Par Faboul dans le forum Access
    Réponses: 16
    Dernier message: 26/01/2007, 10h45
  3. Condition qui ne marche pas
    Par Pierre.g dans le forum C
    Réponses: 5
    Dernier message: 24/08/2006, 03h29
  4. [vb.net] Condition qui ne fonctionne pas
    Par dyree dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/06/2006, 09h55
  5. Réponses: 4
    Dernier message: 01/10/2005, 13h52

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