需要帮助 在文本文件中随机生成 54 副牌

NEED HELP Generating a random 54 deck of cards in a text file

本文关键字:随机 副牌 文件 帮助 文本      更新时间:2023-10-16

我需要代码方面的帮助,这是一个很长的代码,它不能很好地工作,如果你愿意,请测试它。但假设创建一副随机的 54 张牌。您可以通过我的代码来判断它是如何工作的。它是法语的,但你可以很容易地理解它。我需要知道是什么让它不能很好地工作,因为当创建文本文件时,它看起来就像我希望它的样子一样,但有时每个值没有 4 张卡片。此外,如果有更简单的方法可以使用我拥有的相同库来做到这一点,那么您让我知道:)真是太神奇了谢谢!!!

#include <iostream>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
using namespace std;
typedef struct carte
{
    string nom;
    int valeur;
    string sorte;
    bool donne=false;   
}carte;
void Hasard(carte paquet2[])
{
    srand (time(NULL));
    int rnd;
    int cmpt[14];
    int first=1;
    int last=14;
    fstream fichierecriture("fichierpokerhasard.txt", ios::out);
    if (!fichierecriture)
    {
        cout<<"Impossible d'ouvrir le fichier"<<endl;
    }
    for(int i=0;i<14;i++)
    {
        cmpt[i]=1;
    }
    for(int i=0;i<54;i++)
    {   
        //Random de la carte
        rnd = rand() % last + first;
        //AS
        if(rnd==1)
        {
            if(cmpt[0]==5)
            {
                first=2;
                i--;
            }
            else
            {
                paquet2[i].nom="AS";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[0]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[0]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[0]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[0]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[0]++;
            }
        }
        //2
        if(rnd==2)
        {
            if(cmpt[1]==5)
            {
                if(first==2)
                {
                    first=3;                    
                }
                i--;
            }
            else
            {
                paquet2[i].nom="2";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[1]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[1]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[1]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[1]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[1]++;
            }
        }
        //3
        if(rnd==3)
        {
            if(cmpt[2]==5)
            {
                if(first==3)
                {
                    first=4;                    
                }
                i--;
            }
            else
            {
                paquet2[i].nom="3";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[2]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[2]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[2]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[2]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[2]++;
            }
        }
        //4
        if(rnd==4)
        {
            if(cmpt[3]==5)
            {
                if(first==4)
                {
                    first=5;                    
                }
                i--;
            }
            else
            {
                paquet2[i].nom="4";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[3]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[3]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[3]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[3]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[3]++;
            }
        }
        //5
        if(rnd==5)
        {
            if(cmpt[4]==5)
            {
                if(first==5)
                {
                    first=6;                    
                }
                i--;
            }
            else
            {
                paquet2[i].nom="5";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[4]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[4]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[4]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[4]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[4]++;
            }
        }
        //6
        if(rnd==6)
        {
            if(cmpt[5]==5)
            {
                if(first==6)
                {
                    first=7;                    
                }
                i--;
            }
            else
            {
                paquet2[i].nom="6";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[5]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[5]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[5]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[5]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[5]++;
            }
        }
        //7
        if(rnd==7)
        {
            if(cmpt[6]==5)
            {
                if(first==7)
                {
                    first=8;                    
                }
                i--;
            }
            else
            {
                paquet2[i].nom="7";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[6]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[6]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[6]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[6]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[6]++;
            }
        }
        //8
        if(rnd==8)
        {
            if(cmpt[7]==5)
            {
                if(first==8)
                {
                    first=9;                    
                }
                i--;
            }
            else
            {
                paquet2[i].nom="8";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[7]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[7]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[7]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[7]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[7]++;
            }
        }
        //9
        if(rnd==9)
        {
            if(cmpt[8]==5)
            {
                if(first==9)
                {
                    first=10;                   
                }
                i--;
            }
            else
            {
                paquet2[i].nom="9";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[8]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[8]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[8]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[8]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[8]++;
            }
        }
        //10
        if(rnd==10)
        {
            if(cmpt[9]==5)
            {
                if(first==10)
                {
                    first=11;                   
                }
                i--;
            }
            else
            {
                paquet2[i].nom="10";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[9]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[9]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[9]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[9]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[9]++;
            }
        }
        //Valet
        if(rnd==11)
        {
            if(cmpt[10]==5)
            {
                if(first==11)
                {
                    first=12;                   
                }
                i--;
            }
            else
            {
                paquet2[i].nom="V";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[10]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[10]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[10]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[10]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[10]++;
            }
        }
        //Dame
        if(rnd==12)
        {
            if(cmpt[11]==5)
            {
                if(first==12)
                {
                    first=13;                   
                }
                i--;
            }
            else
            {
                paquet2[i].nom="D";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[11]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[11]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[11]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[11]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[11]++;
            }
        }
        //Roi
        if(rnd==13)
        {
            if(cmpt[12]==5)
            {
                if(first==13)
                {
                    first=14;                   
                }
                i--;
            }
            else
            {
                paquet2[i].nom="R";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[12]==1)
                {
                    paquet2[i].sorte="pique";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[12]==2)
                {
                    paquet2[i].sorte="coeur";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[12]==3)
                {
                    paquet2[i].sorte="trefle";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[12]==4)
                {
                    paquet2[i].sorte="carreau";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[12]++;
            }
        }
        //Joker
        if(rnd==14)
        {           
            if(cmpt[13]==3)
            {
                last=13;
            }
            if(i!=53)
            {
                i--;
            }
            else
            {
                paquet2[i].nom="JK";
                fichierecriture<<paquet2[i].nom<<endl;
                paquet2[i].valeur=rnd;
                fichierecriture<<paquet2[i].valeur<<endl;
                if(cmpt[13]==1)
                {
                    paquet2[i].sorte="jk1";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                if(cmpt[13]==2)
                {
                    paquet2[i].sorte="jk2";
                    fichierecriture<<paquet2[i].sorte<<endl;
                }
                cmpt[13]++;
            }
        }
    }
    fichierecriture.close();
}
int main()
{
    int choix;
    carte paquet[54];
    cout<<"1 - Jouer avec le hasard"<<endl;
    cout<<"2 - Jouer selon le fichier texte"<<endl;
    cout<<"3 - Quitter le jeu de poker"<<endl;
    cout<<"Entrez votre choix : ";
    cin>>choix;

    switch (choix)
    {
        case 1:
            Hasard(paquet);
            break;
        case 2:
            break;
        case 3:
            cout<<"Fin du jeu de poker"<<endl;
            break;
        default:
            cout << "Choix invalide" << endl << endl;
            break;
    }   
}

我正在试验一个计算笛卡尔乘积的模板,你的问题似乎是测试我的模板的好方法。我在这里发布我所拥有的内容,以便您可以学习一些改进代码的方法,特别是将常见算法分解为可重用的函数以及一些较新的C++库和样式。

此代码构造一副由 52 张牌加上 2 个小丑组成的一副牌,然后随机选择一张牌并将其打印到 stdout。

#include <vector>
#include <string>
#include <tuple>
#include <iostream>
#include <random>

namespace test
{
    template<typename TN>
    constexpr auto cartprod(long combo, TN list)
    {
        const auto size = list.size();
        const auto& elem = list.at(combo % size);
        return std::make_tuple(elem);
    }
    template<typename T0, typename ...T1toN>
    constexpr auto cartprod(long combo, T0 list, T1toN... lists)
    {
        const auto size = list.size();
        const auto& elem = list.at(combo % size);
        combo /= size;
        const auto next = cartprod(combo, lists...);
        const auto first = std::make_tuple(elem);
        return std::tuple_cat(first, next);
    }

    template<typename TN>
    constexpr auto cartprod_size(TN list)
    {
        return list.size();
    }
    template<typename T0, typename ...T1toN>
    constexpr auto cartprod_size(T0 list, T1toN... lists)
    {
        return list.size() * cartprod_size(lists...);
    }
}
int main()
{
    std::vector<std::string> sortes = {"pique","coeur", "trefle", "carreau"};
    std::vector<std::string> nomes = {"AS", "2", "3", "4", "5", "6", "7", "8", "9", "10", "V", "D", "R" };
    std::vector<std::string> jokers = {"JK1", "JK2"};
    auto combos = test::cartprod_size(sortes, nomes);
    std::mt19937 rng;
    rng.seed(std::random_device()());
    std::uniform_int_distribution<std::mt19937::result_type> rnd(1, combos + jokers.size());
    const auto choice = rnd(rng);
    if(choice > combos)
    {
        std::cout << jokers[choice - combos - 1] << std::endl;
    } else
    {
        std::string sorte, nom;
        std::tie(sorte,nom) = test::cartprod(choice - 1, sortes, nomes);
        std::cout <<  nom << " "  << sorte << std::endl;
    }
    return 0;
}