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

Pascal Discussion :

Trouver "la combinaison secrète" générée par l'ordinateur


Sujet :

Pascal

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 30
    Points
    30
    Par défaut Trouver "la combinaison secrète" générée par l'ordinateur
    Bonjour et merci pour votre attention

    Donc voilà : je dois faire une jeu en Pascal et je bloque sur un point; le jeu consiste à trouver une combinaison secrète que l'ordinateur à déjà généée (j'ai utilisé random) et sauvegardée dans un vecteur et donc, à chaque fois que le joueur entre une combinaison, elle est testée et l'ordinateur doit rendre le score des gains. Et c'est là où se trouve le problème car les gains sont comptés comme suit :
    gains = (10 * (nombre de chiffres bien placés)) + (nombre de chiffres mal placés).
    Si le joueur trouve la bonne combinaison, il a 50 points.

    Voilà le début du 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
    program la_combinaison_secrete;
    const
    min=1;max=8;
    type
    vec=array[1..5]of integer;
    var
    e,s:vec;
    j,y,u,i,o,p:integer;
    abandonner:boolean;
    procedure tiragesecret(var s:vec);
    begin
    s[1]:=random(max - min) + min;
    s[2]:=random(max - min) + min;
    s[3]:=random(max - min) + min;
    s[4]:=random(max - min) + min;
    s[5]:=random(max - min) + min;
    end;
    procedure lirecombinaison(var e:vec);
    begin
    writeln('tapez 5 chiffres accol‚s de 1 … 8, ou 00000 pour quitter');
    readln(y);e[1]:=y;
    readln(u);e[2]:=u;
    readln(i);e[3]:=i;
    readln(o);e[4]:=o;
    readln(p);e[5]:=p;
    if y=0 then if u=0 then if i=0 then if o=0 then if p=0 then abandonner:=true
    else
    begin
     
    ***** la se trouve le problème ******
    end;......
    Merci de m'aider , de mon côté j'y travaille sans relâche ...

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Bao,

    Déjà, je vois que pour sortir, tu demandes l'entrée de 5 zéros successifs. Il faut corriger ça (si un programme te demandait 5 fois la même entrée pour se terminer, tu serais plutôt énervé. Non ?)
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    Bonjour anissben,

    Déjà, pourquoi ne pas faire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i:=1 to 5 do
    Begin
      ReadLn(e[i]);
    End;
    pour l'entrée des chiffres ? Du coup, tu économises 5 variables inutiles. Et puisque j'y suis, pourquoi déclarer vec en tableau d'intteger et non de byte ? Tu doubles du coup l'utilisation mémoire de tes tableaux (Bon, d'accord, 5 octets, c'est pas beucoup)
    pour rien.

    Ensuite, tu peux utiliser les test booléens pour compter ton score:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i from 1 to 5 do
    Begin
      Score:= Score + 10*(e[i]=s[i]) + (e[i]<>s[i]);
    End;

  4. #4
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par droggo Voir le message
    Bao,

    Déjà, je vois que pour sortir, tu demandes l'entrée de 5 zéros successifs. Il faut corriger ça (si un programme te demandait 5 fois la même entrée pour se terminer, tu serais plutôt énervé. Non ?)
    je serais bien enervé si ça m'arrivait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure lirecombinaison(var e:vec);
    begin
     writeln('tapez 5 chiffres accol‚s de 1 … 8, ou 00000 pour quitter');
     
     readln(y);e[1]:=y;
    if y=0 then
     abandonner:=true
    else
     begin
      readln(u);e[2]:=u;
      readln(i);e[3]:=i;
      readln(o);e[4]:=o;
      readln(p);e[5]:=p;
    et pourquoi n'avoir pas fait readln(e[1]) directement?

    je me demande si tu utilises toutes ces variables globales parce qu'elles sont necessaire.

  5. #5
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par CP / M Voir le message
    [CODE]
    Ensuite, tu peux utiliser les test booléens pour compter ton score:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    For i from 1 to 5 do
    Begin
      Score:= Score + 10*(e[i]=s[i]) + (e[i]<>s[i]);
    End;
    Ce bout de code n'est du tout correct. Il n'est pas possible de melanger des entiers avec des booleans.
    Comment calculerais tu l'espression :
    score:=0+10*(true)+(false)

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    Ce bout de code n'est du tout correct. Il n'est pas possible de melanger des entiers avec des booleans.
    Comment calculerais tu l'espression :
    En effet, désolé de la boulette.
    Par contre ceci devrait fonctionner, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i from 1 to 5 do
    Begin
      Score:= Score + 10*Ord(e[i]=s[i]) + Ord(e[i]<>s[i]);
    End;

  7. #7
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par CP / M Voir le message
    En effet, désolé de la boulette.
    Par contre ceci devrait fonctionner, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i from 1 to 5 do
    Begin
      Score:= Score + 10*Ord(e[i]=s[i]) + Ord(e[i]<>s[i]);
    End;
    La syntaxe de la boucle for n'est pas correcte.
    Mais on peut bien faire simple et lisible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    score=0;
    for i:=1 to 5 do
     if (e[i]=s[i]) then
      score=score+10
     else
      score=score+1;

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    Désolé pour la syntaxe de la boucle, ça fait trop longtemps que je n'ai pas touché à Pascal !

    En fait, c'est la syntaxe des boucle FOR de Maple, qu'on utilise en maths !
    Je sens que je vais passer pour un comique moi...

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Woe,
    Citation Envoyé par CP / M Voir le message
    Désolé pour la syntaxe de la boucle, ça fait trop longtemps que je n'ai pas touché à Pascal !

    En fait, c'est la syntaxe des boucle FOR de Maple, qu'on utilise en maths !
    Je sens que je vais passer pour un comique moi...
    Bah ! On a tous nos petits moments de distraction.

    Je me surprends parfois à écrire de la syntaxe C dans du Pascal (oui, pendant mes cours ).
    Si les cons volaient, il ferait nuit à midi.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    Merci Droggo !

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 40
    Points : 30
    Points
    30
    Par défaut le score se compte comme ceci
    alors pour le score , vos solutions marchent mais sur des cas spéciaux , pour mieux comprendre prenez ces 2 exemples et vous verrez :

    1 2 3 4 5
    7 1 6 4 4 qui devrait donné 11 points , ou encore

    7 7 4 1 1
    7 1 6 4 4 qui devrait donné 12 points

    alors que sa donne 1 ou 2 points de plus
    mais voilà je viens de trouver une astuce et j'attends vos avis

    j'explique , je compare les elts du premier tableau avec le second et des qu'il trouve une correspondance il remplace l'élément a comparer avec un elt qu'il ne trouvera jamais(ex: 10) car il ne fait pas partit de [1,8] et donc n'ajoutera aucun point superflus ...

    voilà le bout de 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
     
    g:=0;
    for m:=1 to 5 do
     for k:=1 to 5 do
      begin
       if c[m]=d[k]then
          begin
           if m=k then begin
                       g:=g+10;
                       c[m]:=10;d[k]:=10;
                       end
           else begin
                g:=g+1;
                c[m]:=10;d[k]:=10;
                end;
          end;
      end;
    end;
    qu'est ce que vous en dites ?

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    1 2 3 4 5
    7 1 6 4 4 qui devrait donné 11 points
    Pourquoi cette combinaison devrait donner 11 points ?
    Tu as 4 chiffres mal placés (7,1,6,4) et 1 bien placé (4), donc 1*10+4=14 ?

    7 7 4 1 1
    7 1 6 4 4 qui devrait donné 12 points
    De même, celle-ci devrait donner 10*1+4=14, non ?

  13. #13
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    annisben a raison :
    " mal placé " ne signifie pas " différents ".

    Exemple avec la première combinaison.
    7 ne figure pas dans la combinaison secrète, donc il n'est pas " mal placé " : 0 point.
    De même pour 6 : 0 point.
    Par contre, 1 figure mais il est mal placé : 1 point.
    Le premier 4 est bien placé : 10 points.
    Le deuxième 4 serait " mal placé " s'il n'y avait pas eu le premier 4 : 0 point.
    Ce qui fait bien 11 points en tout.

    La méthode consistant à " effacer " un élément trouvé est bonne, mais il me semble que le bout de code proposé n'est pas correct.
    Exemple avec :
    1 2 3 4 5
    2 2 2 2 2
    Le bon résultat est 10 ( il y a un 2 bien placé ) mais le code proposé retournera 1 ( avec m = 2 et k = 1, le 2 est " effacé " ).

    Je pense qu'il faut traiter séparément les deux cas possibles :

    a) Rechercher d'abord les éléments bien placés, et eux seuls.
    D'où une boucle sur un seul indice m pour comparer c[m] et d[m].
    Si c[m]=d[m] alors g:=g+10; c[m]:=0 : d[m]:=10.
    ( prendre une valeur pour " effacer " c[m] et une valeur différente pour " effacer " d[m] )

    b) Puis rechercher les éléments mal placés.
    D'où deux boucles sur m et k, comme dans le code proposé.

    A confirmer.

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 169
    Points : 251
    Points
    251
    Par défaut
    Ah désolé, j'avais compris l'énoncé de travers.

  15. #15
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Bonjour

    Je viens de relire et ça m'a rappelé un jeu de MasterMind que j'avais eu a faire un peu comme deviner les nombres choisis par l'ordinateur et qui nous dit si un nombre est bien placé ou pas .

    Dans ce cas present , au lieu de faire toutes ces boucles pourquoi ne pas tout juste faire une fonction qui retourne la position d'un entier dans un tableau? ou sinon utiliser la fonction pos mais ça ferait tout convertir en chaine de caractere avant.
    Soit tCom le tableau qui contient les nombres générés par l'ordinateur et tUser celui qui contient les nombres entrés par l'utilisateur et position la fonction qui renvoie la position d'un entier dans un tableau
    voila ce a quoi je pense
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        score=0;
        for i:=1 to tailleTab do
            if( position(tUser[i],tCom)=i) {Si bien placé}
               inc(score,10)
            else {mal placé}
               inc(score);
    Cordialement
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  16. #16
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par krachik Voir le message
    Bonjour

    Je viens de relire et ça m'a rappelé un jeu de MasterMind que j'avais eu a faire un peu comme deviner les nombres choisis par l'ordinateur et qui nous dit si un nombre est bien placé ou pas .

    Dans ce cas present , au lieu de faire toutes ces boucles pourquoi ne pas tout juste faire une fonction qui retourne la position d'un entier dans un tableau? ou sinon utiliser la fonction pos mais ça ferait tout convertir en chaine de caractere avant.
    Soit tCom le tableau qui contient les nombres générés par l'ordinateur et tUser celui qui contient les nombres entrés par l'utilisateur et position la fonction qui renvoie la position d'un entier dans un tableau
    voila ce a quoi je pense
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        score=0;
        for i:=1 to tailleTab do
            if( position(tUser[i],tCom)=i) {Si bien placé}
               inc(score,10)
            else {mal placé}
               inc(score);
    Cordialement
    Ton idée est bonne, mais la code proposé ne traduit pas ce que dit l'enoncé. Si on prend par exemple le premier exemple, on trouveras 12 au lieu de 11, puisqu'on va aussi considirer le deuxieme 4.
    1 2 3 4 5
    7 1 6 4 4

    Par contre, je pense qu'on pourra trouver une meilleure solution en combinant l'idée de Krachik et celle de Prof. Ce qui donne le code suivant :
    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
     
    score:=0;
    {on recherche les nombres bien placés}
    for i:=1 to taille do
      if (tCom[i]=tUser[i]) then
       begin
        score:=score+10;
        tCom[i]:=0; {0 ne se trouve pas dans le tableau tUser}
        tUser[i]:=9; {9 ne se trouve pas dans le tableau tCom}
      end;
    {on s'occupe maintenant des nombres mal placé}
    for i:=1 to taille do
     begin
     {on suppose ici que la fonction position renvoie 0 si aucune correspondance n'a ete trouvee}
       p:=position(tUser[i], tCom);
       if (p<>0) then
        begin
          score:=score+1;
          tUser[i]=9;
          tCom[i]=0;
        end;
     end;
    je crois que le code de anissben ne marche bien que je ne l'ai pas testé.

  17. #17
    Membre à l'essai
    Inscrit en
    Novembre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    salut

    je viens de tester, c'est presque impossible a faire en cas de répétition...

    en plus la fonction position reste un peu obscure...

  18. #18
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par mesrine Voir le message
    salut

    je viens de tester, c'est presque impossible a faire en cas de répétition...

    en plus la fonction position reste un peu obscure...
    Qu'est ce qui est presque impossible?
    La fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type Tableau = Array[1..?] of integer;
     
    function position( seek : integer; tab : Tableau) : integer;
    est une fonction qu'on doit developper, la fonction cherche l'element seek dans le tableau tab et retourne la position de la premiere occurence trouvée sinon retourne 0.

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/07/2014, 11h55
  2. [SAX] Erreur pour trouver la DTD d'un fichier XML parsé!
    Par gdawirs dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 14/01/2006, 15h28
  3. Réponses: 2
    Dernier message: 01/06/2004, 15h08

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