创建一个数组来迭代一个成员的两个数组

Creating an array to iterate over two arrays of a member

本文关键字:一个 数组 两个 迭代 创建 成员      更新时间:2023-10-16

我正在玩纸牌游戏。

在这个游戏中,我有一些玩家,他们是一个团队的成员(每个团队2名玩家),他们可以加入游说团。

所以大厅里有一名队员,两支球队都有一名球员。我想直接迭代球员,而不是每次都遍历球队。

相关C++代码:

大厅.h

class Lobby {
public:
    Lobby(std::string const& name, std::vector<Team> const& teams = std::vector<Team>());
    Lobby(){};
    ~Lobby();
    // give cards to all players
    void deal();
    std::vector<std::shared_ptr<Player> > getPlayers(); // this is the one I'm trying to implement
   [...]
private:
    std::string _name;
    std::vector<Team> _teams;
};

大厅.cpp

[...]
void Lobby::deal()
{
    vector<Card> cards = Card::getAllCardsShuffled();
    for (int i = 0; i < cards.size(); i++) {
        getPlayers()[i % 4].addCard(cards[i]); // this is how I'd like to use getPlayers()
    }
    cout << _teams[0].getPlayers().at(0).getCards().size() << endl;
    // this compiles but I'm not getting any cards in my players (prints 0)
    // I think a copy is made somewhere, so I'm always getting new players
}

// this is the method I'm trying to implement... 
vector<shared_ptr<Player> > Lobby::getPlayers()
{
    return {
        make_shared<Player>(_teams[0].getPlayers().at(0)),
        make_shared<Player>(_teams[0].getPlayers().at(1)),
        make_shared<Player>(_teams[1].getPlayers().at(0)),
        make_shared<Player>(_teams[1].getPlayers().at(1))
    };
}
[...]

团队.h

class Team {
public:
    Team();
    Team(std::string name);
    ~Team();
    void addPlayer(Player const& player);
    void addTrick(Trick const& trick);
    void setScore(int const& newScore);
    void addPoints(int const& score);
    int getScore();
    std::vector<Trick> getTricks();
    std::vector<Player>& getPlayers();
    bool isTeamDealing();
private:
    std::string _name;
    std::shared_ptr<std::vector<Player> > _players;
    int _score;
    std::vector<Trick> _wonTricks;
};

team.cpp

Team::Team(string name)
    : _name(name)
    , _score(0)
    , _players(vector<Player>())
{
}
void Team::addPlayer(Player const& player)
{
    if (_players.size() < 2) {
        _players.push_back(player);
    }
}
vector<Player>& Team::getPlayers()
{
    return _players;
}
[...]

现在,代码在团队和玩家之间迭代时有效:

void Lobby::deal()
{
    vector<Card> cards = Card::getAllCardsShuffled();
    for (int i = 0; i < cards.size(); i += 4) {
        _teams[0].getPlayers().at(0).addCard(cards[i]);
        _teams[0].getPlayers().at(1).addCard(cards[i + 1]);
        _teams[1].getPlayers().at(0).addCard(cards[i + 2]);
        _teams[1].getPlayers().at(1).addCard(cards[i + 3]);
    }
    cout << getPlayers().at(0)->getCards().size() << endl;
}

但我希望能够直接迭代播放器,而不使用2个嵌套循环。有简单的方法吗?

TL;DR是否有一种实现getPlayers()的方法可以让我在一个玩家向量上迭代并直接变异我的玩家?

EDIT:我更新了Team中的代码,使Team.getPlayers()返回对向量的引用,而不是指针。

所以我找到了一种方法来满足我的需求,使用std::reference_wrapper:

vector<reference_wrapper<Player> > Lobby::getPlayers()
{
    return {
        _teams[0].getPlayers().at(0),
        _teams[0].getPlayers().at(1),
        _teams[1].getPlayers().at(0),
        _teams[1].getPlayers().at(1)
    };
}
void Lobby::deal()
{
    vector<Card> cards = Card::getAllCardsShuffled();
    for (int i = 0; i < cards.size(); i++) {
        getPlayers().at(i % 4).get().addCard(cards[i]);
    }
}

如果有人看到更好的方法,我会洗耳恭听。

相关文章: