2014-10-18 4 views
0

У меня есть 3 Player объекты, которые я передал в качестве опорных аргументов в функции. Функция выполняет следующие действия:Возврат вектора из функции и обновление объектов вектора

  1. Создает vector из 3-х объектов и пузырь сортирует их на основе баллов (участники) данных.
  2. Затем он проверяет первый, второй или третий ряды и возвращает размер vector.

В main функции, я могу напечатать победителя и ее награды, когда я перебирать vector но это, похоже, не обновлять реальные объекты. Как я могу обновить объекты?

Это то, что я до сих пор:

int enterBet(int balance, int maxBet); 
vector <Player> chkWinner(Player &a, Player &b, Player &c, int pot); 

bool sorting_method(Player &_1, Player &_2) { 
    //Bigger numbers go first 
    return _1.m_total > _2.m_total; 
} 

int main() 
{ 
    Player *player1 = new Player; 
    Player *player2 = new Player; 
    Player *player3 = new Player; 
    vector <Player> winnerArr; 
    winnerArr.resize(3); 
    int pot = 0; 
    int betAmount = 0; 
    int maxBet = 10; 
    player2->m_name = "Kelly"; 
    player3->m_name = "Martha"; 
    int x, y, z; 

    winnerArr[0] = *player1; 
    winnerArr[1] = *player2; 
    winnerArr[2] = *player3; 

    sort(winnerArr.begin(), winnerArr.end(), sorting_method); 
    cout << winnerArr[0].m_total << ", " 
     << winnerArr[1].m_total << ", " 
     << winnerArr[2].m_total << endl; 

    x = winnerArr[0].m_total; 
    y = winnerArr[1].m_total; 
    z = winnerArr[2].m_total; 

    if (x == y && x == z){ 
     cout << "Divide pot by 3" << endl; 
     //totalArr.resize(3); 
    } 
    else if (x == y && x != z){ 
     cout << "Divide pot by 2" << endl; 
     winnerArr.resize(2); 

    } 
    else{ 
     cout << "Pay full Pot" << endl; 
     winnerArr.resize(1); 
    } 

    int payout; 

    if (winnerArr.size() == 3){ 
     payout = ((pot * 5)/3); 
    } 
    else if (winnerArr.size() == 2){ 
     payout = ((pot * 5)/2); 
    } 
    else if (winnerArr.size() == 1){ 
     payout = (pot * 5); 

     for (int i = 0; i < winnerArr.size(); i++){ 
      cout << winnerArr[i].m_name << " wins " << payout << endl; 
      winnerArr[i].m_balance += payout; 
      cout << winnerArr[i].m_balance << endl; 

     } 
    } 
    cout << player1->m_name << "'s total: " << player1->m_balance << endl; 
    cout << player2->m_name << "'s total: " << player2->m_balance << endl; 
    cout << player3->m_name << "'s total: " << player3->m_balance << endl; 
    break; 
} 
+1

Вы возвращаете вектор КОПИЙ игроков - это то, что вы намеревались? Я предлагаю вам передать вектор « &» и изменить его с новым порядком. Это также позволяет вам иметь любое количество игроков. Я предлагаю вам использовать встроенную функцию сортировки. Какова точка этого цикла: 'for (int i = 0; i <1; i ++)' –

+0

Извините, но я этого не понимаю. Я попытался передать референт векторного массива, но он выводит 0 для общего количества игроков. Я хочу объявить победителя и добавить награду к фактическому игроку, а не его копию. – Chintan

+0

Отправьте код, который вы пробовали. –

ответ

0

Как все отметили, вы не должны создавать новый массив и изменить один у вас уже есть. STL дает вам руку, чтобы выполнить то, что вы хотите, с функцией сортировки.

Во-первых, вам нужно:

#include <algorithm> 

Тогда вам нужна функция сортировки:

bool sorting_method(const Player &_1, const Player &_2){ 
    //Bigger numbers go first 
    return _1.m_total > _2.m_total; 
} 

Наконец, можно использовать сортировки вместо ваших сцепленных петель:

void chkWinner(std::vector <Player> &totalArr){ 
    sort(totalArr.begin(), totalArr.end(), sorting_method); 
    // Add code here, if you need to perform something else. 
    //totalArr is already in the order you need it to. 
{ 

More information about std::sort()

EDIT: я изменил код, чтобы создать массив с указателями на Players вместо копий игроков.

bool sorting_method(Player *_1, Player *_2) { 
    //Bigger numbers go first 
    return _1->m_total > _2->m_total; 
} 

int main() 
{ 
    Player *player1 = new Player(2, 1); 
    Player *player2 = new Player(5 ,2); 
    Player *player3 = new Player(3, 3); 
    vector <Player *> winnerArr(3); 
    int pot = 0; 
    int betAmount = 0; 
    int maxBet = 10; 
    int x, y, z; 

    winnerArr[0] = player1; 
    winnerArr[1] = player2; 
    winnerArr[2] = player3; 

    sort(winnerArr.begin(), winnerArr.end(), sorting_method); 
    cout << winnerArr[0]->m_name << ", " 
     << winnerArr[1]->m_name << ", " 
     << winnerArr[2]->m_name << endl; 

Пожалуйста, обратите внимание, что из-за этого изменения, вам придется изменить весь код, который пытается получить доступ к массиву, в том числе sorting_method. Этот код, который я написал, уже изменен, поэтому вам просто нужно изменить его. Я удалил функцию изменения размера и добавил параметр (3) при создании массива. Я считаю его более простым и понятным. Удачи: D

+0

Привет, я переписал код с помощью std: sort. Но он по-прежнему не обновляет player.m_total вне массива. Кажется, что в векторном массиве находятся разные игроки, чем на самом деле. – Chintan

+0

@ Chintan Я, вероятно, неправильно понял, что вы хотели в первую очередь. Вы хотите изменить значения внутри объектов? Если да, то почему? Похоже, что каждый из них является игроком, вы бы испортили эти ценности. То, что я написал в моем ответе, было предназначено для сортировки массива, без изменения каждого члена. – SlySherZ

+0

так, есть 3 игрока (1 игрок + 2 AI). Каждый игрок имеет переменную-член «m_balance». Все игроки ставят перед игрой, а затем победитель выигрывает весь банк. Таким образом, алгоритм сортировки помогает мне найти победителя, а затем добавляю значение банка в «m_balance» победителей. Я могу получить победителя, но не смог добавить значение банка к своей переменной «m_balance» – Chintan