Как сбросить цикл списка?

avatar
Damonlaws
8 апреля 2018 в 02:11
147
1
0

У меня есть программа, в которой персонажи наносят урон другим персонажам, используя объект Оружие. Итак, я создал двух игроков и двух врагов. Затем поместил их в список игроков и список врагов. Таким образом, каждый список имеет два объекта. Я настроил итераторы и цикл for, который должен перемешивать список в каждом цикле, чтобы каждая атака была случайной. Таким образом, поворот выполняется до тех пор, пока я не достигну конца обоих списков. Теперь я хочу сбросить цикл for, чтобы игроки продолжали по очереди, пока оба врага или оба игрока не умрут и игра не закончится. Я попытался использовать цикл while (true) и вложить цикл for, но это просто останавливает программу после завершения цикла. Как мне настроить цикл for на сброс, чтобы игроки и враги продолжали атаковать до конца игры? Буду признателен за помощь. Спасибо.

int main()
{


srand(time(NULL));  

PlayerCharacter* p1 = new PlayerCharacter();
PlayerCharacter* p2 = new PlayerCharacter();
EnemyCharacter* e1 = new EnemyCharacter();
EnemyCharacter* e2 = new EnemyCharacter();

p1->printCharacter();
p2->printCharacter();
e1->printCharacter();
e2->printCharacter();


string enemyTarget, playerTarget;

list<Character*> players;
list<Character*> enemies;

players.push_back(p1);
players.push_back(p2);
enemies.push_back(e1);
enemies.push_back(e2);


list<Character*>::iterator PinsertIt = players.begin();
list<Character*>::iterator EinsertIt = enemies.begin();


while (!p1->dead && !p2->dead && !e1->dead && !e2->dead)
{

    if (PinsertIt == players.end()) {
        PinsertIt = players.begin();
    }
    if (EinsertIt != enemies.end()) {
        EinsertIt = enemies.begin();
    }


    for (; PinsertIt != players.end() && EinsertIt != enemies.end(); ++PinsertIt, ++EinsertIt)
    {

        listShuffle(players);
        listShuffle(enemies);

        if (*PinsertIt == p1)
        {
            if (!p1->dead)
            {
                cout << "Player One. Choose your Target (1 or 2)" << endl;
                cin >> playerTarget;
                playerAttack(e1, e2, p1->currentWeapon, playerTarget);
            }
            else
            {
                cout << p1->firstName << " " << p1->lastName << " is dead. Skip turn" << endl;
            }
        }
        else if (*PinsertIt == p2)
        {
            if (!p2->dead)
            {
                cout << "Player Two. Choose your Target (1 or 2)" << endl;
                cin >> playerTarget;
                playerAttack(e1, e2, p2->currentWeapon, playerTarget);
            }
            else
            {
                cout << p2->firstName << " " << p2->lastName << " is dead. Skip turn" << endl;
            }
        }


        if (*EinsertIt == e1)
        {

            if (!e1->dead)
            {
                cout << "Enemy One ";
                enemyAttack(p1, p2, e1->currentWeapon);
            }
            else
            {
                cout << e1->firstName << " " << e1->lastName << " is dead. Skip turn" << endl;
            }
        }
        else if (*EinsertIt == e2)
        {
            if (!e2->dead)
            {
                cout << "Enemy Two ";
                enemyAttack(p1, p2, e2->currentWeapon);
            }
            else
            {
                cout << e2->firstName << " " << e2->lastName << " is dead. Skip turn" << endl;
            }
        }



        if (p1->dead && p2->dead)
        {
            cout << "Game Over!" << endl;
        }
        else if (e1->dead && e2->dead)

        {
            cout << "You Win!" << endl;
        }


    }
    PinsertIt++;
    EinsertIt++;

}



system("pause");
return 0;
}
Источник
Jive Dadson
8 апреля 2018 в 02:38
0

Нет причин использовать указатели и new. Нам понадобится минимальный воспроизводимый пример.

Damonlaws
8 апреля 2018 в 02:55
0

почему бы нет? Это список указателей символов. Я просто хочу знать, как сбросить цикл for.

Ответы (1)

avatar
Hai Hoang
8 апреля 2018 в 06:03
0

Измените условие конца цикла while, чтобы проверить, мертвы ли все игроки или все враги. В вашем цикле, если PinsertIt или EinsertIt попали в конец списка, сбросьте его обратно, чтобы начать.

while (!isAllPlayersDead() && !isAllEnemiesDead()) {
    if (PinsertIt == players.end()) {
        PinsertIt = players.begin();
    }
    if (EinsertIt != enemies.end()) {
        EinsertIt = enemies.begin();
    }

    doSomeThingWithYourPlayersAndEnemies();

    PinsertIt++;
    EinsertIt++;
}
Damonlaws
8 апреля 2018 в 15:05
0

Я только что отредактировал свой код с вашим предложением, но после завершения цикла for. Я получаю окно с сообщением об ошибке "итератор не увеличивается"

Hai Hoang
8 апреля 2018 в 15:32
0

Если вы используете цикл for, удалите PinsertIt++; и EinsertIt++; в конце вашего кода. Поскольку цикл for уже увеличил для вас 2 итератора, и когда он нажмет end() , он больше не может увеличиваться.

Hai Hoang
8 апреля 2018 в 15:59
0

И ваши инструменты isAllPalyerDead() и isAllEnemiesDead() неверны. Проверьте мои объяснения и законы Де Моргана для более подробной информации. Кроме того, вы должны поместить сложное условие в отдельную функцию, чтобы повысить читаемость кода и удобство сопровождения.