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

Lazarus Pascal Discussion :

Problème de somme


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut Problème de somme
    Bonjour,

    Voila le problème peut sembler être simple à résoudre, mais il n'en est rien. Je suis censé faire un Black Jack comme projet de fin d’année (malgré le confinement) et donc viens le moment fatidique où je m'attaque à L'IA du croupier. Comme vous le savez (ou pas) au BJ le croupier est censé tiré jusqu’à que la somme des valeurs des cartes de sa main soit égale ou supérieure à 16.

    Vous l'aurez deviné, c'est là ou est le problème, le croupier ne sait pas faire de somme. Terrible me diriez vous ! Puisque en soit, c'est moi qu'il lui donne des instructions. En effet mais je ne comprend pas où est le problème

    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
     
      While (SommeC<16) Do  //Le croupier dois tirer jusqu'a qu'il ait 16 minimum
        BEGIN
          A:=Nombre2CarteC;  //J'enregistre son nombre de carte pour qu'une fois qu'il tire une carte (il y a une condition pour tirer une carte : voir si elle a pas été tiré auparavant)
          While (A=Nombre2CarteC) DO
            BEGIN
              X:=Random(52)+1;          //Tirage aléatoire dans le paquet
              VerificationC(X);               //Fonction qui permet de vérifier si la carte n'a pas déjà été tiré + L'affiche sur le canvas
            end;                                  //Ne fonctionne visiblement pas pck ce con tire 7 fois a la suite
          SommeC:=0;                       //Je remet la valeur de la somme de ses cartes a 0 pour refaire le compte
          For I:=1 to 7 DO                  //Il recalcule la somme
              BEGIN
                SommeC:=MainC[I]+SommeC;  //Le formule est bonne je suppose vu qu'elle à toujours fonctionné
                Memo1.lines.append(inttostr(SommeC));  //Je lui demande d'écrire à chaque carte, le calcul de la somme de ses mains pour voir comment il compte
              end;
        end;
    Et là, c'est le drame ! Vous avez vu la dernière ligne de la boucle je lui demande d'afficher ce qu'il compte, et c'est bien la le problème ! Effectivement, le croupier affiche toujours 7 en premier, peut importe la valeur de sa première carte, et ensuite 45 et donc il devrait en toute logique sortir de cette boucle, mais il n'en est rien puisque le memo affiche de nouveau 7 puis 45 puis 7...

    Une boucle infini que je ne comprend pas. Ensuite je suis partit voir si il y avait des problème dans la fonction qui est appelé VerificationC(), mais bon elle fonctionne bien pour l'autre IA qui joue en tant que joueur et elles sont sensiblement identique mais je vous les mets là on sait jamais :

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    procedure TForm3.VerificationC(A2 : integer);           //Verification de si il peut tirer la carte + appeler la fonction qui dessine + notes de ce que l'IA tire
    BEGIN
        if (TableauVerification[A2]=false) then
         BEGIN
           distribCroupier(Nombre2CarteC,A2);               //L'IA considère l'AS comme un 1 pour que le comptage soit plus facile
           MainC[Nombre2CarteC]:=TableauValeur[A2];
           Nombre2CarteC:=Nombre2CarteC+1;
           TableauVerification[A2]:=true;
           Memo1.Lines.append('Le croupier a tiré un ' + inttostr(TableauValeur[A2]));
           Memo1.Lines.append('');
         end;
    end;
     
    procedure TForm3.VerificationI(A3 : integer);           //Verification de si il peut tirer la carte + appeler la fonction qui dessine + notes de ce que le croupier tire
    BEGIN
        if (TableauVerification[A3]=false) then            //L'AS n'est pas encore fais (soit 1 soit 11)
         BEGIN
           distribIA(Nombre2CarteIA,A3);
           MainI[Nombre2CarteIA]:=TableauValeur[A3];
           Nombre2CarteIA:=Nombre2CarteIA+1;
           TableauVerification[A3]:=true;
           Memo1.Lines.append('L''IA a tiré un ' + inttostr(TableauValeur[A3]));
           Memo1.Lines.append('');
         end;
    end;
     
    //Je vous met aussi la fonction qui dessine
     
    procedure TForm3.distribIA(X1,Y1 : integer);                //Fonction pour dessiner les cartes de l'IA
    BEGIN
      if (X1=1) then
         BEGIN
           image9.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=2) then
         BEGIN
           image10.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=3) then
         BEGIN
           image11.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=4) then
         BEGIN
           image12.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=5) then
         BEGIN
           image13.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=6) then
         BEGIN
           image14.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=7) then
         BEGIN
           image15.Picture.LoadFromFile(TableauImage[Y1]);
         end;
    end;
     
    procedure TForm3.distribCroupier(X1,Y1 : integer);         //Fonction pour dessiner les cartes du croupier
    BEGIN
      if (X1=1) then
         BEGIN
           image16.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=2) then
         BEGIN
           image17.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=3) then
         BEGIN
           image18.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=4) then
         BEGIN
           image19.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=5) then
         BEGIN
           image20.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=6) then
         BEGIN
           image21.Picture.LoadFromFile(TableauImage[Y1]);
         end;
      if (X1=7) then
         BEGIN
           image22.Picture.LoadFromFile(TableauImage[Y1]);
         end;
    end;
    Si vous savez comment régler mon petit problème je suis preneur. Et au passage je suis désolé pour toutes les fautes d'orthographe que j'ai pu faire.

    PS : Voici le tableau des valeurs qui correspond bien aux valeurs des cartes. Je l'ai mit dans TFormCreate. C'est le lien des images qui est ajouté en plus.

    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
     
      TableauImage[1]:='Images\1.png';TableauValeur[1]:=1;  //Comme j'ai mit coupé les cartes moi meme sur un logiciel (j'ai pris une image ou il y avait toutes les cartes de meme dimensions) j'ai mit les AS de 1 à 4 les 2 de 5 a 8...
      TableauImage[2]:='Images\2.png';TableauValeur[2]:=1;
      TableauImage[3]:='Images\3.png';TableauValeur[3]:=1;
      TableauImage[4]:='Images\4.png';TableauValeur[4]:=1;
      TableauImage[5]:='Images\5.png';TableauValeur[5]:=2;
      TableauImage[6]:='Images\6.png';TableauValeur[6]:=2;
      TableauImage[7]:='Images\7.png';TableauValeur[7]:=2;
      TableauImage[8]:='Images\8.png';TableauValeur[8]:=2;
      TableauImage[9]:='Images\9.png';TableauValeur[9]:=3;
      TableauImage[10]:='Images\10.png';TableauValeur[10]:=3;
      TableauImage[11]:='Images\11.png';TableauValeur[11]:=3;
      TableauImage[12]:='Images\12.png';TableauValeur[12]:=3;
      TableauImage[13]:='Images\13.png';TableauValeur[13]:=4;
      TableauImage[14]:='Images\14.png';TableauValeur[14]:=4;
      TableauImage[15]:='Images\15.png';TableauValeur[15]:=4;
      TableauImage[16]:='Images\16.png';TableauValeur[16]:=4;
      TableauImage[17]:='Images\17.png';TableauValeur[17]:=5;
      TableauImage[18]:='Images\18.png';TableauValeur[18]:=5;
      TableauImage[19]:='Images\19.png';TableauValeur[19]:=5;
      TableauImage[20]:='Images\20.png';TableauValeur[20]:=5;
      TableauImage[21]:='Images\21.png';TableauValeur[21]:=6;
      TableauImage[22]:='Images\22.png';TableauValeur[22]:=6;
      TableauImage[23]:='Images\23.png';TableauValeur[23]:=6;
      TableauImage[24]:='Images\24.png';TableauValeur[24]:=6;
      TableauImage[25]:='Images\25.png';TableauValeur[25]:=7;
      TableauImage[26]:='Images\26.png';TableauValeur[26]:=7;
      TableauImage[27]:='Images\27.png';TableauValeur[27]:=7;
      TableauImage[28]:='Images\28.png';TableauValeur[28]:=7;
      TableauImage[29]:='Images\29.png';TableauValeur[29]:=8;
      TableauImage[30]:='Images\30.png';TableauValeur[30]:=8;
      TableauImage[31]:='Images\31.png';TableauValeur[31]:=8;
      TableauImage[32]:='Images\32.png';TableauValeur[32]:=8;
      TableauImage[33]:='Images\33.png';TableauValeur[33]:=9;
      TableauImage[34]:='Images\34.png';TableauValeur[34]:=9;
      TableauImage[35]:='Images\35.png';TableauValeur[35]:=9;
      TableauImage[36]:='Images\36.png';TableauValeur[36]:=9;
      TableauImage[37]:='Images\37.png';TableauValeur[37]:=10;
      TableauImage[38]:='Images\38.png';TableauValeur[38]:=10;
      TableauImage[39]:='Images\39.png';TableauValeur[39]:=10;
      TableauImage[40]:='Images\40.png';TableauValeur[40]:=10;
      TableauImage[41]:='Images\41.png';TableauValeur[41]:=11;
      TableauImage[42]:='Images\42.png';TableauValeur[42]:=11;
      TableauImage[43]:='Images\43.png';TableauValeur[43]:=11;
      TableauImage[44]:='Images\44.png';TableauValeur[44]:=11;
      TableauImage[45]:='Images\45.png';TableauValeur[45]:=11;
      TableauImage[46]:='Images\46.png';TableauValeur[46]:=11;
      TableauImage[47]:='Images\47.png';TableauValeur[47]:=11;
      TableauImage[48]:='Images\48.png';TableauValeur[48]:=11;
      TableauImage[49]:='Images\49.png';TableauValeur[49]:=11;
      TableauImage[50]:='Images\50.png';TableauValeur[50]:=11;
      TableauImage[51]:='Images\51.png';TableauValeur[51]:=11;
      TableauImage[52]:='Images\52.png';TableauValeur[52]:=11;

  2. #2
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Zankou Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      While (SommeC<16) Do  //Le croupier dois tirer jusqu'a qu'il ait 16 minimum
        BEGIN
          A:=Nombre2CarteC;
          While (A=Nombre2CarteC) DO
     ...
    ...
    A moins qu'il n'y ait quelque chose que je n'ai pas vu, vous écrivez "A:=Nombre2CarteC" puis dans une boucle, vous tester "A=Nombre2CarteC" ! Il n'y a donc aucune chance que vous sortiez de cette boucle.

    Cordialement.

    Pierre

  3. #3
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ChPr Voir le message
    A moins qu'il n'y ait quelque chose que je n'ai pas vu, vous écrivez "A:=Nombre2CarteC" puis dans une boucle, vous tester "A=Nombre2CarteC" ! Il n'y a donc aucune chance que vous sortiez de cette boucle.

    Cordialement.

    Pierre
    Alors si pour le coup, le problème ne viens pas de là. Puisque enfaîte Nombre2CarteC prend +1 dans le procedure VerificationC, vous pouvez vérifier par vous meme, mais merci de l'aide on sait jamais sa peut être une erreur toute simple

  4. #4
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Zankou Voir le message
    ... Nombre2CarteC prend +1 dans le procedure VerificationC ...
    C'est vrai, je n'étais pas allé voir dans cette procédure.

    Est-ce que vous avez essayé de suivre pas à pas ce qu'il se passe en mode débogage ? Cela devrait vous conduire au problème.

    Cordialement.

    Pierre

  5. #5
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Zankou Voir le message
    le croupier affiche toujours 7 en premier, peut importe la valeur de sa première carte, et ensuite 45 et donc il devrait en toute logique sortir de cette boucle, mais il n'en est rien puisque le memo affiche de nouveau 7 puis 45 puis 7...
    Salut je ne saisie pas pourquoi 7 en premier surtout si la valeur de la 1ere carte n'a pas d'importance ? pourquoi il passe à 45, il y a des cartes avec 38 points ???? ?

    A la base le croupier à bien 0 cartes ? donc en gros en pseudo 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
     
    NombreDeCarteEnMain := 0;
    While PointCroupier<16 do
    begin
      A := NombreDeCarteEnMain;
      While A = NombreDeCarteEnMain do
      begin
         NumeroCarte := Random;
         IF (NombreDeCarteEnMain = 0) THEN 
         BEGIN
           NombreDeCarteEnMain = NombreDeCarteEnMain + 1;
           MainCroupier[NombreDeCarteEnMain] := NumeroCarte   
         END
         ELSE IF Not(NumeroCarte IN MainCroupier) THEN
         BEGIN
            NombreDeCarteEnMain = NombreDeCarteEnMain + 1;
            MainCroupier[NombreDeCarteEnMain] := NumeroCarte;
        END;
      end;
      SommeCroupierTemporaire = 0;
      For I := 1 to NombreDeCarteEnMain do
      begin
        SommeCroupierTemporaire := SommeCroupierTemporaire + MainCroupier[I];
      end;
      PointCroupier := SommeCroupierTemporaire + 7; 
    end;
    C'est bien cela ?

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Citation Envoyé par Zankou Voir le message
    le croupier affiche toujours 7 en premier, peut importe la valeur de sa première carte, et ensuite 45 et donc il devrait en toute logique sortir de cette boucle, mais il n'en est rien puisque le memo affiche de nouveau 7 puis 45 puis 7...
    Ben non si la dernière somme est de 7. A aucun moment tu ne conditionnes une sortie de la boucle 1 to 7.
    Comme signalé par BeanzMaster, la logique est de ne boucler que sur le nombre de cartes tirées.


    Plusieurs questions :
    est-ce qu'il y a un Randomize quelque part ? Sans lui, Random retournera toujours les mêmes nombres dans le même ordre (7 en premier par exemple) ;
    est-ce que MainC est reseté entre chaque donne ? Ça n'a pas l'air puisque le tableau ne semble pas vide (ça n'aurait pas d'importance si tu bouclais que sur le nombre de cartes).


    Quelques considérations maintenant.

    Verification devrait être une fonction et retourner un booléen. Cette variable A deviendrait obsolète.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repeat
      X:=Random(52)+1;
    until VerificationC(X);
    mais cette façon de procéder ne me plait guère puisque plus le jeu avance, plus le tirage d'une carte peut prendre de temps.
    Il serait préférable d'avoir au départ un paquet de 52 cartes et de supprimer au fur et à mesure la carte tirée. Le nouveau tirage s'obtiendrait simplement par Random(Length(Paquet))+1 et la vérification deviendrait obsolète.

    Tu as choisi de travailler sur plusieurs tableaux. Un seul suffirait si l'enregistrement était mieux défini.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TCard = record
      Value :byte;
      Image :TFileName;
    end;
     
    TCards = array[1..52] of TCard;
    Ce paquet de base pourrait même être une constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const
      Cards : array[1..52] of TCard = (
        (Value:1; Image:'Images\1.png'),
        (Value:1; Image:'Images\2.png'),
        (Value:1; Image:'Images\3.png'),
        ...
      );

    Ça manque de logique dans le nommage des arguments (A2 dans VerificationC qui devient Y1 dans distribCroupier et A3 dans VerificationI). Ça ne facilite pas la compréhension.


    Il y a beaucoup trop de redondance. Que ce soit le croupier ou l'IA (en fait ici les deux sont des "IA"), le principe reste le même. Ce sont donc les mêmes routines mais avec des arguments différents (passer en paramètre le tableau à traiter entre autre).
    Imagine que je te demande maintenant d'ajouter un joueur autour de la table, tu ne vas pas continuer à faire du copier/coller. Si ?

  7. #7
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Ben non si la dernière somme est de 7. A aucun moment tu ne conditionnes une sortie de la boucle 1 to 7.
    Comme signalé par BeanzMaster, la logique est de ne boucler que sur le nombre de cartes tirées.

    Citation Envoyé par Andnotor Voir le message
    Plusieurs questions :
    est-ce qu'il y a un Randomize quelque part ? Sans lui, Random retournera toujours les mêmes nombres dans le même ordre (7 en premier par exemple) ;
    est-ce que MainC est reseté entre chaque donne ? Ça n'a pas l'air puisque le tableau ne semble pas vide (ça n'aurait pas d'importance si tu bouclais que sur le nombre de cartes).
    -Il y a bien un randomize qui est écrit dans le TFormCreate.
    -Je ne comprends pas pourquoi je devrais reset MainC entre chaque somme, puisque c'est cette variable qui contient les valeurs des cartes. Donc la resst reviendrais à perdre toutes ces valeurs

    Citation Envoyé par Andnotor Voir le message
    Quelques considérations maintenant.

    Verification devrait être une fonction et retourner un booléen. Cette variable A deviendrait obsolète.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    repeat
      X:=Random(52)+1;
    until VerificationC(X);
    mais cette façon de procéder ne me plait guère puisque plus le jeu avance, plus le tirage d'une carte peut prendre de temps.
    Il serait préférable d'avoir au départ un paquet de 52 cartes et de supprimer au fur et à mesure la carte tirée. Le nouveau tirage s'obtiendrait simplement par Random(Length(Paquet))+1 et la vérification deviendrait obsolète.
    Je ne l'ai peut être pas précisé mais je suis un bon gros débutant dans le domaine de la programmation, donc je ne sais pas comment faire un tableau dont sa longueur serait enclin à être modifier au cours de la partie.

    Citation Envoyé par Andnotor Voir le message
    Tu as choisi de travailler sur plusieurs tableaux. Un seul suffirait si l'enregistrement était mieux défini.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TCard = record
      Value :byte;
      Image :TFileName;
    end;
     
    TCards = array[1..52] of TCard;
    Il est vrai que je pourrais améliorer mon programme le rendant plus performant et/ou rapide. Mais j'essaye en premier lieu de terminer le programme comme je peux et puis je verrais par la suite comment l'améliorer. [Il ne faut pas oublier non plus que manier ce genre de variable n'est pas mon fort]

    Citation Envoyé par Andnotor Voir le message
    Il y a beaucoup trop de redondance. Que ce soit le croupier ou l'IA (en fait ici les deux sont des "IA"), le principe reste le même. Ce sont donc les mêmes routines mais avec des arguments différents (passer en paramètre le tableau à traiter entre autre).
    Imagine que je te demande maintenant d'ajouter un joueur autour de la table, tu ne vas pas continuer à faire du copier/coller. Si ?
    Malheureusement, je pense avoir déjà esquivé pas mal de redondance avec les procédure. Il n’empêche que je sais que c'est pas fou de faire 3 fois les memes procedure qui varient uniquement de peux dépendant de la personne qui joue. Mais comme dit plutôt, je me concentrerait sur l'amélioration du code, une fois celui-ci fini. Or, mon problème reste inchangé mais toutes les indications d'amélioration son prise en compte merci beaucoup de l'aide apporter !

  8. #8
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut je ne saisie pas pourquoi 7 en premier surtout si la valeur de la 1ere carte n'a pas d'importance ? pourquoi il passe à 45, il y a des cartes avec 38 points ???? ?

    A la base le croupier à bien 0 cartes ? donc en gros en pseudo 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
     
    NombreDeCarteEnMain := 0;
    While PointCroupier<16 do
    begin
      A := NombreDeCarteEnMain;
      While A = NombreDeCarteEnMain do
      begin
         NumeroCarte := Random;
         IF (NombreDeCarteEnMain = 0) THEN 
         BEGIN
           NombreDeCarteEnMain = NombreDeCarteEnMain + 1;
           MainCroupier[NombreDeCarteEnMain] := NumeroCarte   
         END
         ELSE IF Not(NumeroCarte IN MainCroupier) THEN
         BEGIN
            NombreDeCarteEnMain = NombreDeCarteEnMain + 1;
            MainCroupier[NombreDeCarteEnMain] := NumeroCarte;
        END;
      end;
      SommeCroupierTemporaire = 0;
      For I := 1 to NombreDeCarteEnMain do
      begin
        SommeCroupierTemporaire := SommeCroupierTemporaire + MainCroupier[I];
      end;
      PointCroupier := SommeCroupierTemporaire + 7; 
    end;
    C'est bien cela ?

    A+
    Bonjour, bonjour !

    Je ne comprends pas vraiment à quoi sert le Else if not Puisque dans le random de tirage, il vaut mieux indiqué les limites dans les quels il est tiré non ? Dans notre cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    X:=Random(52)+1; //Pour avoir de 1 à 52
    De plus pourquoi avez vous mit :
    Citation Envoyé par BeanzMaster Voir le message
    For I := 1 to NombreDeCarteEnMain do
    begin
    SommeCroupierTemporaire := SommeCroupierTemporaire + MainCroupier[I];
    end;
    PointCroupier := SommeCroupierTemporaire + 7;
    end;[/CODE]
    Le For je comprends mais pourquoi rajouter PointCroupier ? De plus pourquoi +7 ?

    Merci beaucoup de l'aide

  9. #9
    Membre à l'essai Avatar de Zankou
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ChPr Voir le message
    C'est vrai, je n'étais pas allé voir dans cette procédure.

    Est-ce que vous avez essayé de suivre pas à pas ce qu'il se passe en mode débogage ? Cela devrait vous conduire au problème.

    Cordialement.

    Pierre
    J'aimerais bien faire le pas à pas mais le .lpr s'ouvre et me met cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RequireDerivedFormResource:=True;
    Elle surligné comme si elle contenait une erreur et je ne comprend pas pourquoi.

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Citation Envoyé par Zankou Voir le message
    Je ne comprends pas pourquoi je devrais reset MainC entre chaque somme
    Je voulais dire en début de partie. A la première carte, un seul emplacement est utilisé et les 6 autres doivent être à zéro puisque la boucle va toujours de 1 à 7.

    Citation Envoyé par Zankou Voir le message
    un Black Jack comme projet de fin d’année
    Ça laissait supposer que tu étais plus qu'un "gros débutant"


    Je vais quand même te mettre sur la piste.

    Déclarations :
    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
    type
      TCard = record
        Value :byte;
        Image :TFileName;
      end;
     
      TCards = array[1..52] of TCard;
     
    const
      Cards : TCards = (
        (Value:1; Image:'Images\1.png'),
        (Value:1; Image:'Images\2.png'),
        (Value:1; Image:'Images\3.png'),
        ...
      );
     
    var
      AvailableCards :array of TCard;  // Liste des cartes disponibles
      PlayedCards    :array of TCard;  // Liste des cartes jouées
    Initialisation d'une nouvelle partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure NewGame;
    begin
      // Initialise les cartes disponibles (toutes) en recopiant la liste des 52 cartes
      SetLength(AvailableCards, Length(Cards));
      CopyMemory(AvailableCards, @Cards, Length(Cards) *SizeOf(TCard));
     
      // Vide la liste des cartes jouées
      PlayedCards := [];
    end;
    Tirage de la prochaine carte :
    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
    procedure NextCard;
    var
      i   :integer;
      Tot :integer;
     
    begin
      // Prochaine carte
      i := Random(Length(AvailableCards));
     
      // L'insère en fin de liste des cartes tirées
      Insert(AvailableCards[i], PlayedCards, MAXINT);
     
      // et la supprime des cartes disponibles
      Delete(AvailableCards, i, 1);
     
      // Somme
      Tot := 0;
     
      for i := 0 to High(PlayedCards) do
        Inc(Tot, PlayedCards[i].Value);
     
      // etc.
    end;

  11. #11
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Zankou Voir le message
    Bonjour, bonjour !

    Je ne comprends pas vraiment à quoi sert le Else if not Puisque dans le random de tirage, il vaut mieux indiqué les limites dans les quels il est tiré non ? Dans notre cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    X:=Random(52)+1; //Pour avoir de 1 à 52
    Le IF...ELSE IF NOT Traduction

    SI le croupier n'a pas de carte en main on ajoute la carte SI NON SI le numéro de carte tirée N'EST PAS dans la main du croupier ALORS on l'ajoute
    Sans ça ton croupier risque de se retrouver avec une floppée de carte identique (cela correspond a ta procedure verif...

    Citation Envoyé par Zankou Voir le message

    De plus pourquoi avez vous mit :

    Le For je comprends mais pourquoi rajouter PointCroupier ? De plus pourquoi +7 ?

    Merci beaucoup de l'aide
    PointCroupier C'est le debut de ta boucle WHILE PointCroupier<16 DO

    Dans ce genre de boucle réinitialisé le compteur à zero en plein milieu n'est pas vraiment une bonne idée, je préfère passer par une variable intermédiaire pour le calcul
    le +7 c'est le truc que je ne pigeais pas

    le problème dans ta boucle c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For I:=1 to 7 DO                  //Il recalcule la somme
              BEGIN
                SommeC:=MainC[I]+SommeC;
    Le croupier n'a pas forcément 7 cartes en main a ce moment (il peux en avoir moins ou plus en fonction de la somme des points). De plus si avec 7 cartes le croupier n'as toujours pas atteint 16 points ta boucle WHILE PointCroupier<16 DO sera toujours évaluée comme Fausse et continuera à tourner à l'infini

    d'ou le but de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      SommeCroupierTemporaire := 0;
      For I := 1 to NombreDeCarteEnMain do
      begin
        SommeCroupierTemporaire := SommeCroupierTemporaire + MainCroupier[I];
      end;
      PointCroupier := SommeCroupierTemporaire;
    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

Discussions similaires

  1. [Oracle] Problème requête somme
    Par baptus dans le forum Langage SQL
    Réponses: 24
    Dernier message: 23/03/2006, 08h33
  2. CR Problème de somme
    Par canardpc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 28/02/2006, 16h50
  3. Probléme avec somme de l'indépendante
    Par aminbouassida dans le forum Access
    Réponses: 2
    Dernier message: 30/09/2005, 15h18
  4. Problème de somme avec Qreport
    Par Oluha dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/09/2005, 11h23
  5. - [procédure stockée] - Problème de Somme
    Par korrigann dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/05/2003, 11h51

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