i не правильно считает в цикле

при цикле не правильно считает i и еще кажется if else неправильно срабатывает. Так же пробывал через откладку посмотреть, но результат не дало. Помогите пожалуйста решить.

//игра пьяница со стеком
#include<iostream>
#include<stack>
#include<random>
#include<ctime>

using namespace std;

int main()
{
  srand(time(0));
  setlocale(LC_ALL, "RU");
  stack<int> player1, player2;
  int n;
  cout << "Сколько карт будет в колоде?" << endl;
  cin >> n;
  int nn = n / 2;

  for (int i = 0; i < nn; i++) {
    int a;
    a = rand() % 10 + 1;
    player1.push(a);
  }
  for (int i = 0; i < nn; i++) {
    int a;

    a = rand() % 10+1;
    player2.push(a);
  }
  for (int i = 0; i < nn; i++) {
    cout << player1.top() << " ";
    player1.pop();
  }
  cout << endl;
  for (int i = 0; i < nn; i++) {
    cout << player2.top() << " ";
    player2.pop();
  }

  int i = 0; // Для первого игрока
  int ii = 0; //Для второго игрока игрока

  while (!player1.empty() && !player2.empty()) {
      int card1 = player1.top();
      player1.pop();
      int card2 = player2.top();
      player2.pop();

      if (card1 > card2) {
          player1.push(card1);
          player1.push(card2);
      }
      else {
          player2.push(card1);
          player2.push(card2);
      }

      i++;
      
  }

  if (player2.empty()) {
      cout << "Победил первый игрок! Всего ходов было " << i << endl;
  }
  else {
      cout << "Победил второй игрок! Всего ходов было " << i << endl;
  }
}

Ответы (2 шт):

Автор решения: ferz

Здесь pop() выкидывает у игроков все карты до начала игры.

for (int i = 0; i < nn; i++) {
    cout << player1.top() << " ";
    player1.pop();
}
cout << endl;
for (int i = 0; i < nn; i++) {
    cout << player2.top() << " ";
    player2.pop();
}

Исправить можно, например, так:

  1. Удалить вышеуказанный блок кода
int a;
for (int i = 0; i < nn; i++) {
    a = rand() % 10 + 1;
    cout << a << " ";
    player1.push(a);
}
for (int i = 0; i < nn; i++) {
    a = rand() % 10+1;
    cout << a << " ";
    player2.push(a);
}
→ Ссылка
Автор решения: Harry

Нашел у себя от 2013 года творение :) — моделировал игру в пьяницу. Держите, не жалко :)

После каждого 1М ходов :) выводит размер колод у игроков (изначально колода в 36 карт тасуется и сдается по 18 карт на руки), количество ходов и минимальная достигнутая колода.

По-моему, игра принципиально бесконечная, нет? Разве что изначально колода разделится так, что игра тут же и закончится...

#include <deque>
#include <vector>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstdlib>
#include <ctime>

using namespace std;


int main(int argc, const char * argv[])
{
    srand(time(0));
    vector<int> c(36);
    for(int i = 0; i < 36; ++i)
    {
        c[i] = (i/4) + 6;
    }
    for(int i = 0; i < 36; ++i)
    {
        int j = rand()%(36-i)+i;
        int t = c[i];
        c[i] = c[j];
        c[j] = t;
    }

    deque<int> d1, d2;
    for(int i = 0; i < 36; i+=2)
    {
        d1.push_back(c[i]);
        d2.push_back(c[i+1]);
    }

    unsigned long long i = 0;
    for(int min = 36*2;!d1.empty() && !d2.empty();++i)
    {
        if (min > d1.size()) min = d1.size(); else if (min > d2.size()) min = d2.size();
        if (i%(1024*1024) == 0)
        {
            cout << setw(2) << d1.size() << " : " << setw(2) << d2.size()
                << "     " << setw(12) << i << setw(12) << min << endl;
        }

        if (d1.front() < d2.front())
        {
            d2.push_back(d2.front());
            d2.push_back(d1.front());
        } else if (d1.front() > d2.front())
        {
            d1.push_back(d1.front());
            d1.push_back(d2.front());
        } else
        {
            d1.push_back(d1.front());
            d2.push_back(d2.front());
        }
        d1.pop_front();
        d2.pop_front();
        if (d1 == d2) break;
    }

    cout << "Num = " << (i+1) << endl;
    for(int i = 0; i < 36; i++)
    {
        cout << setw(3) << i << setw(12) << c[i] << endl;
    }

}

P.S. И чего это я перетасовывал колоду руками? уже и не помню... Ну, пусть так и будет, непринципиально... Еще зачем-то при одинаковых колодах выход. Что-то я такое экспериментировал, но за давностью лет уж и не упомню, что :( Словом, берите, разбирайтесь, меняйте...

→ Ссылка