1
votes

Créer et remplir un vecteur dans une boucle

J'ai un joueur de classe qui a un identifiant, une couleur et un nom.

J'ai aussi un vecteur de joueurs.

Je voudrais créer 50 joueurs. 10 joueurs par couleur. Signifiant 10 joueurs en rouge, 10 en noir etc.

Je peux faire quelque chose comme:

players.addPlayer(&player1);

Et puis l'ajouter au vecteur: p>

Player player1(1, "black", "player1");

Mais je ne pense pas que les créer et les insérer manuellement soit la meilleure façon de le faire.

Je voudrais créer une boucle dans laquelle je va créer le joueur et l'ajouter au vecteur.Je ne sais tout simplement pas comment donner une couleur différente à chaque 10e joueur ..


5 commentaires

Pourquoi, utilisez simplement deux boucles. Une boucle extérieure, qui boucle sur les cinq couleurs. Une boucle intérieure, qui boucle dix fois, une pour chaque joueur. Insérez ensuite un lecteur, en spécifiant la couleur de la boucle extérieure. Problème résolu.


Donc, je suppose que créer une énumération pour les couleurs et les parcourir dans la boucle extérieure? J'aurai 5 énumérations mais je veux 10 fois chaque énumération. Je ne sais pas comment m'y prendre


Avez-vous essayé de demander de l'aide à votre canard en caoutchouc ?


quel est le players.addPlayer ? N'utilisez-vous pas std :: vector ? Quel est le type de joueurs


const char * happyLittleColors [] = {"midnight black", "titanium white", "dark sienna", "phtalo blue", "alizarin crimson"};


3 Réponses :


1
votes

Vous ne savez pas si vous souhaitez que les joueurs soient numérotés de 1 à 10 cinq fois ou de 1 à 50 une fois, vous pouvez le corriger si nécessaire. L'astuce avec les couleurs consiste simplement à créer un tableau indexé en fonction de i / 10 :

#include <iostream>
#include <string>
#include <vector>

class Player {
public:
    const unsigned    id;
    const std::string color;
    const std::string name;

    void display() const { std::cout << id << ' ' << color << ' ' << name << '\n'; }

    Player() = delete;
    Player(unsigned i, const std::string& c, const std::string& n) :
        id(i),
        color(c),
        name(n)
    {}
};

int main() {
    const char* colors[] = { "red", "black", "blue", "green", "white" };

    std::vector<Player> players;
    for (unsigned i = 0; i < 50; ++i)
        players.emplace_back(Player(
            i + 1,
            colors[i / 10],
            "player" + std::to_string(i + 1)
        ));

    for (const Player& player : players)
        player.display();

    return 0;
}


0 commentaires

1
votes

Voici un exemple rapide et sale de ce que vous pourriez faire, le code a une boucle externe qui parcourt les couleurs et crée 10 instances de joueur par couleur.

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

class Player {
public:
    Player(int id, string color, string name) : 
        _id(id), _color(color), _name(name) {
    }

    int getId() { return _id; }
    string getColor() { return _color; }
    string getName() { return _name; }

    string toString() {
        ostringstream ss;
        ss << _id << "," << _color << "," << _name;
        return ss.str();
    }
private:
    int _id;
    string _color;
    string _name;
};

int main() {
    vector<Player> players;
    int playerId = 0;
    for (auto color : {"black", "blue", "green", "cyan", "red"}) {
        for (int i = 0; i < 10; ++i) {
            playerId++;
            players.emplace_back(Player(playerId, color, "Player" + to_string(playerId)));
        }
    }

    for (auto p : players) {
        cout << p.toString() << endl;
    }
    return 0;
}


0 commentaires

0
votes

Les couleurs peuvent être stockées dynamiquement dans un vecteur, puis accessibles en utilisant un itérateur vectoriel, qui est une méthode plus rapide. Une boucle pour itérer sur des vecteurs et une autre pour créer 10 joueurs par couleur suffiront à votre besoin. Un exemple de votre approche est disponible ci-dessous, le nom du joueur peut être modifié selon vos besoins:

#include <iostream>
#include <string>
#include <vector>

class Player
{
public:
    Player(int id, std::string color, std::string name);
    void Display();
    int _id;
    std::string _color;
    std::string _name;
};

Player::Player(int id, std::string color, std::string name)
{
    _id = id;
    _color = color;
    _name = name;
}

void Player::Display()
{
    std::cout << _id << ' ' << _color << ' ' << _name << '\n';
}

int main(int argc, const char * argv[])
{
    std::vector<Player*> players;
    std::vector <std::string> colour;
    colour.push_back("Black");
    colour.push_back("Red");
    colour.push_back("Orange");
    colour.push_back("Yellow");
    colour.push_back("Blue");

    int id = 1;

    for(std::vector<std::string>::iterator it = colour.begin(); it != colour.end(); it++)
    {
        for(int i=0; i<10; i++)
        {
            std::string player = "player";
            std:: string name = player + std::to_string(id);
            Player* player1 = new Player(id, (*it), name);
            players.push_back(player1);
            player1->Display();
            id++;
        }
    }

    return 0;
}


1 commentaires

3 points de retour: vous perdez chaque Player , vous devriez juste avoir auto color = {"Black", Red "...} etc, et votre extérieur for loop devrait juste être for (const auto & c: color) . Donc rien de trop sérieux mais tout ce qui améliorerait votre réponse