1

今日、大学で初めて C++ の試験を受けました。コンピュータ サイエンスを勉強していますが、時間が短すぎて、簡単なタスクを実行するために長いコードを書かなければならなかったため、うまくいきませんでした。というわけで、ありとあらゆる手法を使ったカードゲームシミュレーションでした。

最初の問題: 各プレイヤーのカードのポイント値を比較して、最も高い値を決定する必要があります。これらはすべて、ベクトル クラス データ要素としてプレイヤー クラス オブジェクトに格納されます。私がしたことは、カードを取得し、値をintに保存してから、次のようにすべてを比較することでした:

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

...そして、これを4回行わなければなりませんでした。これを行うより良い方法はありますか?そうでない場合、整数を比較する簡単な方法はありますか?

2番目の問題:これを見れば、おそらく何が問題なのかがわかります

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

2 番目の問題は、変数名を再利用したことです。

Player players[10]; // or something

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

players最初のplayers << players入力は文字列ストリームであるが、2 番目の入力は以前に宣言された変数であることをコンパイラが把握できると期待するのはなぜですか?


最初の問題では、さまざまな方法で比較を簡単にすることができます。

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 に答える