Два разных массива указателей, но оба они указывают на один и тот же адрес - PullRequest
0 голосов
/ 28 января 2019

Я играю в блэкджек, и у меня есть массивы указателей для руки моего дилера и игрока.Проблема в том, что когда я случайным образом генерирую карточки для хранения в массиве, у них обеих одинаковые карточки.Не уверен, что это потому, что они оба указывают на один и тот же адрес или что-то, чего я не заметил.

#include <iostream>
#include <ctime>
#include <random>
#include <iomanip>
#include <cstdlib>


using namespace std;


class Blackjack
{
 public:
   Blackjack();
   void playGame();
   int pbalance;
   int betamount;
   int loop= 1;
   int *playerbalances;
   int pbalan,pbal;
   void firstbalance();
   void clearhand();



 private:
   int dhandSize;
   int phandSize;
   int dhandSum;
   int phandSum;
   int phit;
   int pstand;
   bool playerDone;
   bool dealerDone;
   void addPlayerCard();
   void addDealerCard();
   void printHand();
   void sumHands();
   void playerbalance();
   void playerbet();
   int *dhand[];
   int *phand[];
};

Blackjack::Blackjack()
{
   srand(time(0));
   dhandSize = 0;
   phandSize = 0;
   dhandSum = 0;
   phandSum = 0;
   playerDone = false;
   dealerDone = false;
}


void Blackjack::playGame()
{

   if (pbal>0)
   {

      // Start the player and dealer with two cards
      playerbet();
      addPlayerCard();
      addPlayerCard();
      addDealerCard();
      addDealerCard();
      sumHands();
      printHand();

      if (dhandSum == 21)
      {
         cout << "Dealer has blackjack. Dealer wins.\n";
         clearhand();
         return;
      }
      else if (phandSum == 21)
      {
         cout << "Player has blackjack. Player wins.\n";
         clearhand();
         return;
      }

      while (dealerDone == false || playerDone == false)
      {
         if (playerDone == false)
         {
            cout << "Would you like to hit? (1 - Yes, 2 - No)\n";
            cin >> phit;

            if (phit == 1)
            {
               addPlayerCard();
               printHand();
               sumHands();

               if (phandSum > 21)
               {
                  cout << "Player's hand exceeded 21. Player loses"<<endl;
                  pbalan =(pbalan - betamount);
                  cout <<"[you lose $"<<betamount<<" of money!]"<<endl;
                  cout <<"[your current balance is: $"<<pbalan<<"]"<<endl;
                  clearhand();
                  return;
               }
            }
         }

         if (playerDone == false)
         {
            cout << "Would you like to stand? (1 - Yes, 2 - No)\n";
            cin >> pstand;
         }

         if (pstand == 1)
         {
            playerDone = true;
         }

         if (dhandSum < 17 && dealerDone != true)
         {
            addDealerCard();
            printHand();
            sumHands();

            if (dhandSum > 21)
            {
               cout << "Dealer hand exceeded 21. Dealer loses.\n";
               return;
            }
         }
         else if (dhandSum >= 17)
         {
            dealerDone = true;
         }

         if (phandSum == 21 && dhandSum == 21)
         {
            cout << "Push, player and dealer reached 21.\n";
            return;
         }
         else if (phandSum == 21)
         {
            cout << "Player reached 21. Player wins.\n";
            return;
         }
         else if (dhandSum == 21)
         {
            cout << "Dealer reached 21. Dealer wins.\n";
            pbalan =(pbalan - betamount);
            cout <<"[you lose $"<<betamount<<" of money!]"<<endl;
            cout <<"[your current balance is: $"<<pbalan<<"]"<<endl;
            return;
         }

         if ((playerDone == true && dealerDone == true) || (phandSize == 5 && phandSize == 5))
         {
            if (dhandSum < phandSum)
            {
               cout << "Sum of your hand exceeds the dealer's sum of " << dhandSum << "! You win!";
               return;
            }
            else if (phandSum == dhandSum)
            {
               cout << "Dealer sum of " << dhandSum << " is equal to the sum of your hand. Tie game.";
               return;
            }
            else if (dhandSum > phandSum)
            {
               cout << "Sum of your hand is lower than the dealer's sum of " << dhandSum << ". You lose!"<<endl;
               pbalan =(pbalan - betamount);
               cout <<"[you lose $"<<betamount<<" of money!]"<<endl;
               cout <<"[your current balance is: $"<<pbalan<<"]"<<endl;
               return;
            }
         }
      }
   }
}


void Blackjack::clearhand()
{
   for (int i = 0; i < dhandSize; i++) { delete dhand[i]; }
   for (int i = 0; i < phandSize; i++) { delete phand[i]; }
   phandSize = 0;
   dhandSize = 0;
}

void Blackjack::firstbalance()
{

   cout << "Welcome to Blackjack" <<endl;
   cout << "please enter a starting balance: " <<endl;
   cin >> pbal;
   playerbalances  = &pbalan;
   *playerbalances  = pbal;

}

void Blackjack::playerbet()
{
   cout << "how much do you want to bet?"<<endl;
   cin >> betamount;
}

void Blackjack::addPlayerCard()
{
   if (phandSize <= 5)
   {

      *phand[phandSize] = 1 + (rand() % 13);
      phandSize++;
   }
   else
   {
      cout << "Sorry. You have reached the maximum number of cards (5)." << endl;
      playerDone = true;
   }
}
void Blackjack::addDealerCard()
{
   if (dhandSize <= 5)
   {
      *dhand[dhandSize] = 1 + (rand() % 13);
      dhandSize++;
   }
   else
   {
      dealerDone = true;
   }
}

void Blackjack::printHand()
{
   cout << "Your current hand is...\n";

   for (int i = 0; i < phandSize; i++)
   {
      cout << "    -" << *phand[i] << "-    \n\n";
   }

   cout << "Dealer's current hand is...\n";

   for (int j = 0; j < dhandSize; j++)
   {
      cout << "    -" << *dhand[j] << "-    \n\n";
   }
}

void Blackjack::sumHands()
{
   dhandSum = 0;
   phandSum = 0;
   for (int i = 0; i < dhandSize; i++)
   {
      dhandSum += *dhand[i];
   }

   for (int j = 0; j < phandSize; j++)
   {
      phandSum += *phand[j];
   }

   cout << "Current player hand sum is: " << phandSum << endl;
}


using namespace std;

int main()
{

   int exitGame = 1;
   int i = 0;

   Blackjack play;

   if (i<1)
   {
      play.firstbalance();
      i++;
   }

   do
   {

      play.playGame();
      play.clearhand();
      cout << "\nWould you like to play again? (1 - Yes, 2 - No)\n";
      cin >> exitGame;
   }
   while (exitGame == 1);


   cout << "\nThanks for playing!\n";
   return 0;
}

Карты дилера должны отличаться от карт игрока, но при запуске программы они идентичны.

1 Ответ

0 голосов
/ 28 января 2019

Код шоу объявляет класс с двумя членами следующим образом:

int *dhand[];
int *phand[];

Это два члена класса, но это недопустимо, стандарт C ++.Массивы переменной длины не являются стандартными C ++.

Таким образом, вся логика в этом коде становится неопределенным поведением.Вы наблюдали поведение, состоящее в том, что эти два массива выглядят одинаково.Правильно.Вот что означает неопределенное поведение, и это, кажется, поведение, которое получается с вашим конкретным компилятором и реализацией C ++.Ваш компилятор C ++, по-видимому, реализует это путем создания члена класса, размер которого составляет всего 0 байтов (в конце концов, размер массива не указан, поэтому он равен nuthin '), ожидая, что это будет последний классчлен, и приложение будет нести ответственность за выделение некоторой дополнительной памяти в дополнение к той, которая требуется для экземпляра этого объекта, чтобы таким образом получить псевдомассив.

Но с двумя членами классазаявляет, таким образом, это заканчивается двумя членами класса, которые фактически являются одинаковыми.Какое поведение вы наблюдали.Другие компиляторы C ++ могут очень хорошо сообщать об ошибке компиляции, поскольку программа некорректна в отношении стандарта C ++.

Чтобы исправить эту проблему, вы должны заменить эти члены класса на соответствующие массивы.Просматривая показанный код, похоже, вы ожидаете, что эти массивы, по сути, будут массивами переменного размера.Это то, для чего нужен std::vector, и ваша книга C ++ должна иметь одну или несколько глав, в которых полностью объясняется, как использовать std::vector для реализации массива-подобного объекта, который может соответственно увеличиваться и уменьшаться в размере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...