1

今天我在大学里第一次考c++——我学的是计算机科学——我没考好,因为时间太短了,我不得不写一些很长的代码来完成简单的任务。所以这是一个有各种不同方法的纸牌游戏模拟。

第一个问题:我们应该比较每个玩家卡片的点值以确定最高点,这些点值都存储在一个玩家类对象中作为向量类数据元素。我所做的是:获取卡,将值存储在 int 中,然后像这样比较:

if(a > b && a > c && a > d){...

...我不得不这样做四次。有一个更好的方法吗 ?如果没有,也许是比较整数的更简单方法?

第二个问题:如果你看这个你可能会知道问题是什么

int id0 = players[0].getID();
int bd0 = players[0].getBudget();
int id1 = players[1].getID();
int bd1 = players[1].getBudget();
int id2 = players[2].getID();
int bd2 = players[2].getBudget();
int id3 = players[3].getID();
int bd3 = players[3].getBudget();

stringstream players;
players << "Player's ID" << setw(10) << "Budget" << endl;
players << "-----------" << setw(10) << "------" << endl;
players << id0 << setw(20) << bd0 << endl;
players << id1 << setw(20) << bd1 << endl;
players << id2 << setw(20) << bd2 << endl;
players << id3 << setw(20) << bd3 << endl;


return players.str();

我不明白为什么上面的函数不能直接在字符串流中工作!编译器一直告诉我sstream不支持该[]运算符,即使它在其他方法中也有效。

4

1 回答 1

2

您的第二个问题是您重用了变量名:

Player players[10]; // or something

void foo() {
    std::stringstream players;
    players << players[1].getID();
} //     ^          ^
  //     |          |
  // stringstream   |
  //                |
  //         also stringstream

为什么您希望编译器能够确定第一个playersplayers << players字符串流,而第二个是较早声明的变量?


在第一个问题中,您可以通过多种方式简化比较。

if (a > std::max(b,c,d)) { ... }
if (b > std::max(a,c,d)) { ... }
...

这与您的代码做同样的事情(包括不处理关系),但更容易阅读。或者你可以这样做:

int top_score = std::max(a,b,c,d);
if (top_score == a) { ... }
if (top_score == b) { ...

这通过对所有得分最高的玩家执行 if 条件来处理平局。或者你可以这样做:

Player &winner = *std::max_element(std::begin(players),std::players(end),
    [](Player &l,Player &r) { if (l.score() < r.score()) return l; else return r; });

// no conditional necessary, just access 'winner'

尽管这又不能很好地处理关系;它只是从得分最高的人中挑选一个获胜者。你也可以这样做:

Player *sorted_players[players.size()];

// fill in sorted_players
std::transform(std::begin(players), std::end(players), sorted_players, [](Player &p) { return &p; });
auto compare_players = [](Player *l, Player *r) { return l->score() < r->score(); };
std::sort(std::begin(sorted_players), std::end(sorted_players), compare_players);

// get the top scorers
int top_score = sorted_players[players.size()-1]->score();
Player *winner_begin = std::lower_bound(std::begin(sorted_players), std::end(sorted_players), top_score, compare_players);

// reward each top scorer.
for (Player *winner = winner_begin; winner<std::end(sorted_players); ++winner) {
    reward(*winner);
}

这通过奖励匹配最高分的每个玩家来处理平局。

于 2013-02-05T14:28:22.087 回答