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 :

réussite un peu aléatoire de mon code :S


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Par défaut réussite un peu aléatoire de mon code :S
    bon nouvelle question pour vous chers membres :
    c'est la fonction touche qui me pose un probleme :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include<stdio.h>
    #include<stdlib.h>
    #include<graph.h>
    int ran(void) {
      /*cette fonction sert à trouver un entier entre 1 et 4 pour choisir le trou de sortie de la taupe*/
      int x;
      srand(time(NULL));
      x=(rand()%5)+1;
      return x;
    }
    void choix(int x, int t[]){
      /*cette fonction sert à représenter la taupe par un 1 dans le tableau en fonction du resultat de ran*/
      int i;
      for(i=0;i<5;i++){//cette boucle remplie les cases du tableau avec des 0.
        t[i]=0;
      }
      printf("le trou choisit est %d\n",x);
      switch (x)// ce switch sert à choisir dans quel trou la taupe va sortir en fonction de la valeur de x. un 1 montre l'emplacement de la taupe et un 0 montre qu'il n'y a rien.
        {
        case 1: t[0]=1;break;//trou en haut a gauche
        case 2: t[1]=1;break;//trou en haut a droite
        case 3: t[2]=1;break;//trou middle
        case 4: t[3]=1;break;//trou en bas a gauche
        case 5: t[4]=1;break;//trou en bas a droite
        }
      for(i=0;i<5;i++){//a retirer avant de rendre le projet, sert a afficher le contenu du tableau.
        printf("%d\n",t[i]);
      }
    }
    void touche(int t[],int points[]){
      //cette fonction permet de savoir si on a touché la taupe ou non
      while(!SourisCliquee())
        {
          SourisPosition();
          if(t[0]=1){
    	if((_X>=100)&&(_X<=185)&&(_Y>=75)&&(_Y<=155))
    	  points[0]=points[0]=10;
          }
          else if(t[1]=1){
    	if((_X>=315)&&(_X<=405)&&(_Y>=70)&&(_Y<=150))
    	  points[0]=points[0]=10;
          }
          else if(t[2]=1){
    	if((_X>=200)&&(_X<=285)&&(_Y>=260)&&(_Y<=340))
    	  points[0]=points[0]=10;
          }
          else if(t[3]=1){
    	if((_X>=95)&&(_X<=180)&&(_Y>=445)&&(_Y<=520))
    	  points[0]=points[0]=10;
          }
          else if(t[4]=1){
    	if((_X>=330)&&(_X<=415)&&(_Y>=445)&&(_Y<=520))
    	  points[0]=points[0]=10;
          }
        }
    }
     
    int main(void)
    {
      int points[1]={0};
      int x,i,posfenetrex,posfenetrey;
      int t[5]={0,0,0,0,0};
      x=ran();
      choix(x,t);
      InitialiserGraphique();
      posfenetrex=(Maxx()/2)-250;//250 car moitié de 500
      posfenetrey=(Maxy()/2)-344;//344 car moitié de 688
      CreerFenetre(posfenetrex,posfenetrey,500,688);
      ChoisirEcran(0);
      ChargerImage("fond.xpm",0,0,0,0,500,688);/*les deux 1ers 0 montre a partir d'où charger la zone a charger ( à partir coin sup gauche ), les deux 0 d'apres place l'image ds la fenetre a partir du coin sup gauche et les deux derniers nombres montre quelle taille d'image est copiée*/
      touche(t,points);
      while(!SourisCliquee())
        {}
      FermerGraphique();
      printf("votre score est %d\n",points[0]);
      return EXIT_SUCCESS;}
    la bibliotheque graphique que j'utilise est téléchargeable ici : cliquez ici

    le principe est que l'on doit cliquer sur les trous donc les coordonnées sont mises dans mes if le probleme c'est que le trou n°1 me rajoute toujours des points et que pour les autres, mm si on lcique sur le bon, cela marche des fois et des fois celà rate. ( les fonctions Souris Cliquee et SourisPosition mette la position en x et y dans des vaiables globales nommées _X comme nous l'explique ceci :

    [ La récupération des coordonnées de la souris se fait par l'intermédiaire de deux variables globales (de type int)_X et _Y. ]

    * La fonction void SourisPosition(); récupére dans _X et _Y les coordonnées de la souris au moment de l'appel de cette fonction.

    * La fonction int SourisCliquee(); teste si un bouton de la souris a été cliqué (renvoie 1 ou 0), et place si c'est le cas ses coordonnées au moment du clic dans _X et _Y.

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bonjour,

    un petit peu HS, mais ceci n'est pas tres consciencieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int ran(void) 
    {
      /*cette fonction sert à trouver un entier entre 1 et 4 pour choisir le trou de sortie de la taupe*/
      int x;
      srand(time(NULL));
      x=(rand()%5)+1;
      return x;
    }
    Pour rappel, srand doit etre appeler une fois avec une graine differente : c'est pour ca qu'on utilise le temps machine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int ran(void) 
    {
      return (rand()%5)+1;
    }
    L'utilisation du % ne permet pas de faire des tirage equiprobable, voir FAQ pour plus d'info.


    *****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        printf("le trou choisit est %d\n",x);
        switch (x)// ce switch sert à choisir dans quel trou la taupe va sortir en fonction de la valeur de x. un 1 montre l'emplacement de la taupe et un 0 montre qu'il n'y a rien.
        {
            case 1: t[0]=1;break;//trou en haut a gauche
            case 2: t[1]=1;break;//trou en haut a droite
            case 3: t[2]=1;break;//trou middle
            case 4: t[3]=1;break;//trou en bas a gauche
            case 5: t[4]=1;break;//trou en bas a droite
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        printf("le trou choisit est %d\n",x);
        /* Remplace le switch case */
        t[x-1]=1;
    Donc :

    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
     
    /*cette fonction sert à représenter la taupe par un 1 dans le tableau en fonction du resultat de ran*/
    void choix(int x, int t[])
    {
        printf("le trou choisit est %d\n",x);
     
        /* On initialise a 0 */
        int i;
        for(i=0 ; i<5 ; i++)
            t[i] = 0;
     
        /* On place la taupe */
        t[x-1] = 1;
     
    }
    *******
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    points[0]=points[0]=10;

    ???

    ce ne serai pas plutot : points[0]=points[0]+10;

    donc

    *****
    Erreur d'inattention

    -->

    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
     
    void touche(int t[],int points[])
    {
      //cette fonction permet de savoir si on a touché la taupe ou non
        while(!SourisCliquee())
        {
            SourisPosition();
     
            if(t[0]==1)
            {
                if((_X>=100)&&(_X<=185)&&(_Y>=75)&&(_Y<=155))
                    points[0]+=10;
            }
            else 
                if(t[1]==1)
                {
                    if((_X>=315)&&(_X<=405)&&(_Y>=70)&&(_Y<=150))
                        points[0]+=10;
                }
                else
                    if(t[2]==1)
                    {
                        if((_X>=200)&&(_X<=285)&&(_Y>=260)&&(_Y<=340))
                            points[0]+=10;
                    }
                    else 
                        if(t[3]==1)
                        {
                            if((_X>=95)&&(_X<=180)&&(_Y>=445)&&(_Y<=520))
                                points[0]+=10;
                        }
                        else 
                            if(t[4]==1)
                            {
                                if((_X>=330)&&(_X<=415)&&(_Y>=445)&&(_Y<=520))
                                    points[0]+=10;
                            }
        }
    }
    De plus, si tu utilise t[] comme un tableau de booleen (ce qui devrait etre le cas), tu peux raccourcir comme ceci :

    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
     
    void touche(int t[],int points[])
    {
      //cette fonction permet de savoir si on a touché la taupe ou non
        while(!SourisCliquee())
        {
            SourisPosition();
     
            if((t[0]) && (_X>=100) && (_X<=185) && (_Y>=75) && (_Y<=155))
                points[0]+=10;
            else 
                if((t[1]) && (_X>=315) && (_X<=405) && (_Y>=70) && (_Y<=150))
                    points[0]+=10;
                else
                    if((t[2]) && (_X>=200) && (_X<=285) && (_Y>=260) && (_Y<=340))
                        points[0]+=10;
                    else 
                        if((t[3]) && (_X>=95) && (_X<=180) && (_Y>=445) && (_Y<=520))
                            points[0]+=10;
                        else 
                            if((t[4]) && (_X>=330) && (_X<=415) && (_Y>=445) && (_Y<=520))
                                points[0]+=10;
        }
    }

    et en faisant plus obfusqué :

    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
     
    void touche(int t[],int points[])
    {
      //cette fonction permet de savoir si on a touché la taupe ou non
        while(!SourisCliquee())
        {
            SourisPosition();
     
            if((t[0]) && (_X>=100) && (_X<=185) && (_Y>=75) && (_Y<=155)  ||
               (t[1]) && (_X>=315) && (_X<=405) && (_Y>=70) && (_Y<=150)  ||
               (t[2]) && (_X>=200) && (_X<=285) && (_Y>=260) && (_Y<=340) ||
               (t[3]) && (_X>=95) && (_X<=180) && (_Y>=445) && (_Y<=520)  ||
               (t[4]) && (_X>=330) && (_X<=415) && (_Y>=445) && (_Y<=520))
                points[0]+=10;
     
        }
    }
    Voila, tu as deja de quoi faire

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Par défaut
    merci de m'avoir consacré ton temps, pour ce qui est de la fonction srand j'avoue qu'on nous a dit de l'utiliser en cours avec le % mais on ne sait pas trop comment elle marche. j'irai regarder un peu plus tard dans la FAQ
    pour le switch que tu me fait retirer, en cours on nous a dit d'éviter de mettre des variables dans le tableau je crois ou alors j'ai mal compris c'est pour ça que j'ai fait ce switch.
    sinon le concept de variable booléenne est un peu vague dans mon esprit donc je vais me renseigner pour comprendre ta remarque sur le tableau
    je reviendrai apres avoir un peu bossé ça.
    EDIT : après quelques modifications suivant tes indications, celà fonctionne effectivement désormais. on ne gagne bien des points qu'en cliquant sur la bonne zone.
    Cependant le nombre de points vare en fonction du temps pendant lequel on laisse tourner la boucle car apparement la fonction souris position renvoie sa position constamment ce qui fait monter tres vite le total de points.
    je pense qu'il y a moyen d'éviter celà donc je vais chercher un peu
    EDIT 2 : en fin de compte j'ai réglé ça avec une méthode peut etre pas tres correcte mais bon :
    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
    void touche(int t[],int points[]){
      //cette fonction permet de savoir si on a touché la taupe ou non
      while(!SourisCliquee())
        {
          points[0]=0;//evite que toutes les positions où on ne clique pas soient enregistrées
          SourisPosition();
          if(t[0]==1){
    	if((_X>=100)&&(_X<=185)&&(_Y>=75)&&(_Y<=155))
    	  points[0]=points[0]+10;
          }
          else if(t[1]==1){
    	if((_X>=315)&&(_X<=405)&&(_Y>=70)&&(_Y<=150))
    	  points[0]=points[0]+10;
          }
          else if(t[2]==1){
    	if((_X>=200)&&(_X<=285)&&(_Y>=260)&&(_Y<=340))
    	  points[0]=points[0]+10;
          }
          else if(t[3]==1){
    	if((_X>=95)&&(_X<=180)&&(_Y>=445)&&(_Y<=520))
    	  points[0]=points[0]+10;
          }
          else if(t[4]==1){
    	if((_X>=330)&&(_X<=415)&&(_Y>=445)&&(_Y<=520))
    	  points[0]=points[0]+10;
          }
        }
    }

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bon,

    Alors, pour ce qui est du rand, y'a pas vraiment de probleme, on peut l'approcher par un %, d'autant plus que l'intervalle est petit.

    Pour le fait d'eviter de mettre des variable dans le tableau, je ne vois pas de quoi ton cours veut parler, car pour afficher un tableau 2D de 100x100 case, on fait deux for imbrique et ensuite un printf avec Tableau[i][j]


    Cependant le nombre de points vare en fonction du temps pendant lequel on laisse tourner la boucle car apparement la fonction souris position renvoie sa position constamment ce qui fait monter tres vite le total de points.
    Si on regarde ton 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
     
    void touche(int t[],int points[])
    {
      //cette fonction permet de savoir si on a touché la taupe ou non
        while(!SourisCliquee())
        {
            SourisPosition();
     
            if((t[0]) && (_X>=100) && (_X<=185) && (_Y>=75) && (_Y<=155))
                points[0]+=10;
            else 
                if((t[1]) && (_X>=315) && (_X<=405) && (_Y>=70) && (_Y<=150))
                    points[0]+=10;
                else
                    if((t[2]) && (_X>=200) && (_X<=285) && (_Y>=260) && (_Y<=340))
                        points[0]+=10;
                    else 
                        if((t[3]) && (_X>=95) && (_X<=180) && (_Y>=445) && (_Y<=520))
                            points[0]+=10;
                        else 
                            if((t[4]) && (_X>=330) && (_X<=415) && (_Y>=445) && (_Y<=520))
                                points[0]+=10;
        }
    }
    On s'apercoit que tant qu'on a pas clicker, on regarde la position de la souris ET on regarde si on rajoute des points. Le mieux serai plutot de faire ceci :

    Tant qu'on a pas clicker, on regarde la position de la souris PUIS on regarde si on ajoute des points.


    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
     
    void touche(int t[],int points[])
    {
      //cette fonction permet de savoir si on a touché la taupe ou non
        while(!SourisCliquee())
            SourisPosition();
     
        if((t[0]) && (_X>=100) && (_X<=185) && (_Y>=75) && (_Y<=155))
            points[0]+=10;
        else 
            if((t[1]) && (_X>=315) && (_X<=405) && (_Y>=70) && (_Y<=150))
                points[0]+=10;
            else
                if((t[2]) && (_X>=200) && (_X<=285) && (_Y>=260) && (_Y<=340))
                    points[0]+=10;
                else 
                    if((t[3]) && (_X>=95) && (_X<=180) && (_Y>=445) && (_Y<=520))
                        points[0]+=10;
                    else 
                        if((t[4]) && (_X>=330) && (_X<=415) && (_Y>=445) && (_Y<=520))
                            points[0]+=10;
     
    }

    Voila, je pense que cela fait ce que tu veux.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 166
    Par défaut
    effectivement ta remarque sur SourisPosition est pertinante, je n'y avais pas pensé.
    j'avais résolu ce problème en rajoutant au début de la boucle points[0]=0;
    comme ça il réinitialise à chaque fois. cependant celà risque peut etre de faire ramer mon programme, je verrai a l'usage quelle solution est la meilleure.
    pour le moment il reste quelque petits bugs graphiques et à gérer la notion de temps.
    je vous mettrais une version test débuggée pour que vous voyez ce pour quoi vous m'aidez

  6. #6
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Citation Envoyé par Kuchiki Byakuya Voir le message
    j'avais résolu ce problème en rajoutant au début de la boucle points[0]=0;
    comme ça il réinitialise à chaque fois. cependant celà risque peut etre de faire ramer mon programme, je verrai a l'usage quelle solution est la meilleure.
    Si tu possede un pc avec 64 Mo de memoire vive, tu risque effectivement de faire ramer ton PC.

    Blague a part, le probleme qui se pose est plutot d'ordre logique. De plus, si l'utilisateur gagne 10 point, si tu reappele cette boucle, il va retourner a 0. Je crois pas qu'il va etre content.

Discussions similaires

  1. ameliorer un peu mon code
    Par ssk2510 dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 04/02/2011, 10h03
  2. [PHP 5.2] Mon code qui affiche aléatoirement des images
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 07/07/2009, 17h01
  3. un peu lourd mon code aidez moi
    Par UDSP50 dans le forum IHM
    Réponses: 2
    Dernier message: 15/04/2008, 22h09
  4. Mon code n'est pas interprété !
    Par korriganez dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2006, 15h46
  5. [langage] algo de bissection dans mon code
    Par killy dans le forum Langage
    Réponses: 5
    Dernier message: 19/01/2004, 18h35

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