1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 17
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2017
    Messages : 7
    Points : 10
    Points
    10

    Par défaut Ajout d'une frime dans la main (POKER)

    Bonjour, j'aimerais que vous m'aidiez pour ajouter la possibilité d'avoir une frime dans la main qui permettra d'avoir la main la plus gagnante avec ces conditions :

    La frime serait un Joker de : vcarte=15, scarte=jk1/jk2

    Ex : 10 pique, Q pique, K pique, AS pique, JK jk1 = Straight Flush Royale

    2 carreau, 3 carreau, 6 carreau, JK jk1, JK jk2 = Straight Flush

    J pique, Q pique, K pique, JK jk1, JK jk2 = Straight Flush Royale

    3 pique, 3 cœur, 7 pique, JK jk1, JK jk2 = Four of a Kind ( ET non Full House)

    ...

    Donc le Joker prend théoriquement la valeur et la sorte de la meilleur carte possible pour produire la meilleure main

    Merci Et si possible avec la possibilité de garder mon code semblable

    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    //Cette fonction vérifie qu'elle est la main gagnante et renvoie le gain en float
    float CheckHand(int main, carte paquettxt[][5])
    {
    	float tmp=0;
    	int vcarte[5];
    	string scarte[5];
     
    	for(int j=0;j<5;j++)
    	{
    		vcarte[j]=paquettxt[main][j].valeur;
    		scarte[j]=paquettxt[main][j].sorte;
    	}
     
    	//Ces if imbriqués regarde si la main est une Straight, Straight FLush ou Straight Flush Royale
    	if(vcarte[0]==vcarte[1]-1)
    	{
    		if(vcarte[0]==vcarte[2]-2)
    		{
    			if(vcarte[0]==vcarte[3]-3)
    			{
    				if(vcarte[0]==vcarte[4]-4)
    				{
    					cout<<"STRAIGHT ";
    					tmp=20;
    					if(scarte[0]==scarte[1]&&scarte[0]==scarte[2]&&scarte[0]==scarte[3])
    					{
    						cout<<"FLUSH ";
    						tmp=tmp+10;
    						if(vcarte[0]==10&&vcarte[1]==11&&vcarte[2]==12&&vcarte[3]==13&&vcarte[4]==14)
    						{
    							cout<<"ROYALE";
    							tmp=tmp+10;
    						}
    					}
    				}
    			}
    		}
    	}
     
    	//Regarde si Four of a kind
    	if(vcarte[0]==vcarte[1]&&vcarte[0]==vcarte[2]&&vcarte[0]==vcarte[3])
    	{
    		cout<<"FOUR OF A KIND";
    		tmp=25;
    	}
     
    	//Regarde si Flush
    	if(tmp==0)
    	{
    		if(scarte[0]==scarte[1]&&scarte[0]==scarte[2]&&scarte[0]==scarte[3])
    		{
    			cout<<"FLUSH";
    			tmp=15;
    		}		
    	}
     
    	 //Regarde si Full House
    	if((vcarte[0]==vcarte[1]&&vcarte[2]==vcarte[3]&&vcarte[2]==vcarte[4])||(vcarte[0]==vcarte[1]&&vcarte[0]==vcarte[2]&&vcarte[3]==vcarte[4]))
    	{
    		cout<<"FULL HOUSE";
    		tmp=10;
    	}
     
    	//Regarde si Three of a kind	
    	if(tmp==0)
    	{
    		for(int i=0;i<=2;i++)
    		{
    			if(vcarte[i]==vcarte[i+1]&&vcarte[i]==vcarte[i+2])
    			{
    				cout<<"THREE OF A KIND";
    				tmp=5;
    			}
    		}
    	}
     
    	//Regarde si Two pairs
    	if(tmp==0)
    	{
        	for(int q=0;q<=1;q++)
    	 	{
    	 		if(vcarte[q]==vcarte[q+1])
    	 		{
    	 			if(vcarte[q+2]==vcarte[q+3])
    	 			{
    	 				cout<<"TWO PAIRS";
    	 				tmp=3;
    			 	}
    		 	}
    		}
     
    		if(vcarte[0]==vcarte[1]&&vcarte[3]==vcarte[4])
    		{
    			cout<<"TWO PAIRS";
    			tmp=3;
    		}
     
    	}
     
    	if(tmp==0)
    	{
    		cout<<"LA MAIN N'EST PAS GAGNANTE";
    	}
    	cout<<endl;
    	return tmp;
    }

  2. #2
    Expert éminent
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 390
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 390
    Points : 9 797
    Points
    9 797

    Par défaut

    Merci Et si possible avec la possibilité de garder mon code semblable
    Difficile de faire un truc "propre" avec ce code qui s'en pas vraiment la rose.

    Il faut un peu de méthode et votre code sera bien plus simple.

    Une fonction/méthode, c'est 20 à 30 lignes maximum.

    Votre fonction est trop longue et fait 2 choses à la fois, c'est au moins une de trop.

    N'utilisez plus les tableau à la C, ça fait 20 ans que la STL contient des std::vector et autre str::array.

    "CheckHand" ne devrait vérifier qu'une main et pas afficher le résultat.
    Faites une fonction qui affiche le résultat.
    Et au lieu de retour un float abscons, "CheckHand" devrait retourner la valeur d'un enum, qui contient chacunne des possibilités.
    La méthode d'affichage n'aura qu'à prendre la valeur de retour de "CheckHand" pour afficher le texte correspondant.

    En faisant cette séparation "affichage/calcul" et en utilisant des types de la STL qui peuvent facilement cloner leur contenu, le code deviendra donc trivial.
    Avec la STL et en changeant la signature de "CheckHand" pour ne passer qu'un std::array<carte,5> en paramètre, vous copiez automatiquement le contenu de l'argument passé en paramètre.
    Vous pouvez donc changer le contenu de la main sans que le code appelant n'en soit impacté.

    Donc, quand vous tombez sur un joker, vous appelez récursivement "CheckHand" 52 fois (une fois par carte possible), en clonant la main passée en paramètre mais avec une carte différente à la place du joker.
    Vous prenez le meilleur résultat des 52 appels comme valeur de retour de la fonction. (Il est inutile de continué car l'appel récursif de "CheckHand" a déjà évalué toutes les possibilités avec la carte modifiée du joker (éventuel joker suivant compris).

    That's All.

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

Discussions similaires

  1. pb d'ajout d'une colonne dans un report
    Par khlh dans le forum Oracle
    Réponses: 3
    Dernier message: 06/10/2005, 18h12
  2. [C#] Ajout d'une ligne dans un dataset
    Par frechy dans le forum Windows Forms
    Réponses: 9
    Dernier message: 22/12/2004, 10h35
  3. ajout d'une constante dans un select
    Par Shabata dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 19h24
  4. [JSP] Ajout d'une tache dans le planificateur Windows
    Par PhoneKilleR dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 12/09/2003, 16h10
  5. Ajout d'une colonne dans une table ...
    Par Djedjeridoo dans le forum SQL
    Réponses: 2
    Dernier message: 22/07/2003, 17h12

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