Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   Poker Issue. (http://www.go4expert.com/forums/poker-issue-t14616/)

dankbc1 19Oct2008 04:59

Poker Issue.
 
I use a betting system and after 2 or 3 bets, it somehow increases the amount of money the user/computer has. Anyone know why that happens or how to possibly fix it? Lastly, can someone please help me with the winning conditions for this program? Thank you very much for all the help!

Here is the code:
Code:

#include <iostream>
#include <ctime>
#include <cmath>
#include <windows.h>

using namespace std;

int compMONEYONE, compMONEYTWO, compMONEYTHREE, compMONEYFINAL;
int compMONEY = 1000;
int playerMONEY = 1000;
int compBETONE, compBETTWO, compBETTHREE, compBETFINAL;
int placeBETONE, placeBETTWO, placeBETTHREE, placeBETFINAL;
int card[6];
int suitC[6];
int rankC[6];

const char* rank[] = {"Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"};
const char* suit[] = {"Hearts!", "Spades!", "Diamonds!", "Shamrock!"};

int numPlayers;
int random;

char choice;
char PlayAgain;

void preGame()
{
srand(GetTickCount());

//loop so that all the cards are different, if one is the same as another, the loop restarts
do
{
//random number from 1-52 which is a card deck
card[0] = ((rand() % 52) + 1);
//cout << card[0] << endl;
card[1] = ((rand() % 52) + 1);
card[2] = ((rand() % 52) + 1);
card[3] = ((rand() % 52) + 1);
card[4] = ((rand() % 52) + 1);
card[5] = ((rand() % 52) + 1);
card[6] = ((rand() % 52) + 1);
}while(card[0] == card[1] || card[0] == card[2] || card[0] == card[3] || card[0] == card[4] || card[0] == card[5] || card[0] == card[6] || card[1] == card[2] || card[1] == card[3] || card[1] == card[4] || card[1] == card[5] || card[1] == card[6] || card[2] == card[3] || card[2] == card[4] || card[2] == card[5] || card[2] == card[6] || card[3] == card[4] || card[3] == card[5] || card[3] == card[6] || card[4] == card[5] || card[4] == card[6] || card[5] == card[6]);

//ranks - ace, one, two, three, four, five, six, seven, eight, nine, ten, jack, queen, king
//remainder of number which then goes through the console testing loop
//ranks are all different or loop restarts
do
{
rankC[0] = (card[0] % 13);
//cout << rank[0] << endl;
rankC[1] = (card[1] % 13);
//cout << rank[1] << endl;
rankC[2] = (card[2] % 13);
//cout << rank[2] << endl;
rankC[3] = (card[3] % 13);
//cout << rank[3] << endl;
rankC[4] = (card[4] % 13);
//cout << rank[4] << endl;
rankC[5] = (card[5] % 13);
//cout << rank[5] << endl;
rankC[6] = (card[6] % 13);
//cout << rank[6] << endl;
}while(rankC[0] == rankC[1] || rankC[0] == rankC[2] || rankC[0] == rankC[3] || rankC[0] == rankC[4] || rankC[0] == rankC[5] || rankC[0] == rankC[6] || rankC[1] == rankC[2] || rankC[1] == rankC[3] || rankC[1] == rankC[4] || rankC[1] == rankC[5] || rankC[1] == rankC[6] || rankC[2] == rankC[3] || rankC[2] == rankC[4] || rankC[2] == rankC[5] || rankC[2] == rankC[6] || rankC[3] == rankC[4] || rankC[3] == rankC[5] || rankC[3] == rankC[6] || rankC[4] == rankC[5] || rankC[4] == rankC[6] || rankC[5] == rankC[6]);

//4 suits - hearts, spades, shamrocks, diamonds
suitC[0] = (rand() % 4);
suitC[1] = (rand() % 4);
suitC[2] = (rand() % 4);
suitC[3] = (rand() % 4);
suitC[4] = (rand() % 4);
suitC[5] = (rand() % 4);
suitC[6] = (rand() % 4);

/* if(numPlayers > 5 || numPlayers < 1)
{
cout << "Please enter the number of players that you would like to include in this game(no more than 5): ";
cin >> numPlayers;
}*/
}

void betGame()
{

cout << "Player Money Total: $" << playerMONEY << endl;
cout << "Computer Money Total: $" << compMONEY << endl;
// random = (rand() % 1);

// if(random == 0)
// {
cout << "Small blind: $25 put up by the computer." << endl;
cout << "Big blind: $50 put up by the player." << endl;
cout << "Player Money Total: $" << playerMONEY - 50 << endl;
cout << "Computer Money Total: $" << compMONEY - 25 << endl;
compMONEYONE = compMONEY - 25;
/* }
else
{
cout << "Small blind: $25 put up by the player." << endl;
cout << "Big blind: $50 put up by the computer." << endl;
cout << "Player Money Total: $" << playerMONEY - 25 << endl;
cout << "Computer Money Total: $" << compMONEY - 50 << endl;
}*/

cout << "Player's First Card: " << rank[rankC[0]] << " of " << suit[suitC[0]] << endl;

cout << "Player's Second Card: " << rank[rankC[1]] << " of " << suit[suitC[1]] << endl;

//SECOND YOU FLIP 1 CARD AND YOU SEE YOUR CARDS AND 1 CARD -- BET #2

cout << "How much would you like to bet?";
cin >> placeBETONE;
compBETONE = (rand() % compMONEYONE);
cout << "Computer bet: " << compBETONE << endl;
cout << "Player Money Total: $" << playerMONEY - 50 - placeBETONE << endl;
cout << "Computer Money Total: $" << compMONEY - 25 - compBETONE << endl;
compMONEYTWO = compMONEY - 25 - compBETONE;


cout << "Flop First Card: " << rank[rankC[2]] << " of " << suit[suitC[2]] << endl;

cout << "Flop Second Card: " << rank[rankC[3]] << " of " << suit[suitC[3]] << endl;

cout << "Flop Third Card: " << rank[rankC[4]] << " of " << suit[suitC[4]] << endl;


placeBETTWO = -1;
while(placeBETTWO < 0 || placeBETTWO > 25)
{
cout << "How much would you like to bet?";
cin >> placeBETTWO;
compBETTWO = (rand() % compMONEYTWO);
cout << "Computer bet: " << compBETTWO << endl;
cout << "Player Money Total: $" << playerMONEY - 50 - placeBETONE - placeBETTWO << endl;
cout << "Computer Money Total: $" << compMONEY - 25 - compBETONE - compBETTWO << endl;
compMONEYTHREE = compMONEY - 25 - compBETONE - compBETTWO;

cout << "Turn Card: " << rank[rankC[5]] << " of " << suit[suitC[5]] << endl;
}

placeBETTHREE = -1;
while(placeBETTHREE < 0 || placeBETTHREE > 25)
{
cout << "How much would you like to bet?";
cin >> placeBETTHREE;
compBETTHREE = (rand() % compMONEYTHREE);
cout << "Computer bet: " << compBETTHREE << endl;
cout << "Player Money Total: $" << playerMONEY - 50 - placeBETONE - placeBETTWO - placeBETTHREE << endl;
cout << "Computer Money Total: $" << compMONEY - 25 - compBETONE - compBETTWO - compBETTHREE << endl;
compMONEYFINAL = compMONEY - 25 - compBETONE - compBETTWO - compBETTHREE;

cout << "River Card: " << rank[rankC[6]] << " of " << suit[suitC[6]] << endl;;
}

placeBETFINAL = -1;
while(placeBETFINAL < 0 || placeBETFINAL > 25)
{
cout << "How much would you like to bet?";
cin >> placeBETFINAL;
compBETFINAL = (rand() % compMONEYFINAL);
cout << "Computer bet: " << compBETFINAL << endl;
cout << "Player Money Total: $" << playerMONEY - 50 - placeBETONE - placeBETTWO - placeBETTHREE - placeBETFINAL << endl;
cout << "Computer Money Total: $" << compMONEY - 25 - compBETONE - compBETTWO - compBETTHREE - compBETFINAL << endl;
}

//WINNING CONDITIONS

cout << "Do You Want To Play Again: " << endl;
cin >> PlayAgain;
}

int main()
{
do
{
cout << "Welcome to Texas Hold 'Em!" << endl;

preGame();
betGame();

}while(PlayAgain == 'y');

}


xpi0t0s 20Oct2008 16:04

Re: Poker Issue.
 
Your second while loop in pregame() will be infinite if it has to restart, since the results of the calculation will be the same every time through. Does it need to go back to the top of the _first_ while loop if there are duplicate ranks?

What you could do to track the source of the money appearing is at each statement that modifies the variable that unexpectedly increases, print a debug statement that displays the current money, the money added and the result, and why. There are several money variables and you don't say which one has the wrong value, so for example if it's ......

Aha.

int card[6];
...
card[6] = ((rand() % 52) + 1);

That could be the problem. If you declare int card[6], the size of the card array is six, starting at zero, so (count them) the elements are 0,1,2,3,4 and FIVE as the last one. So you have undefined behaviour whenever you write to card[6] (same goes for the other two arrays). This is the infamous buffer overrun bug. If the game uses 7 cards, you need to declare the arrays to have 7 elements, e.g. int card[7]; which will give you elements (count them again) 0,1,2,3,4,5 and SIX.

Don't be tempted to declare arrays one too large and use elements 1-7, ignoring zero. It's a bad habit. If I ever do this I end up confusing the hell out of myself; I end up with a program where some arrays are zero based and some are 1 based, and I end up with silly +1's and -1's everywhere, and it's a source of lots of irritating bugs. If the user wants to count from 1 instead of zero, that's a user interface issue and should be dealt with at the user interface ONLY; those +1's should NOT be allowed to trickle down into the program logic. Convert from 1-based to 0-based when the user enters data, and convert from 0-based to 1-based when you display results.


All times are GMT +5.5. The time now is 19:55.