Kai-Uwe Bux
10/19/2008 12:14:00 AM
daniel.kaner@gmail.com wrote:
> 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:
>
> #include <iostream>
> #include <ctime>
> #include <cmath>
> #include <windows.h>
<windows.h> isn't a standard header. You only need it for GetTickCount(),
for which there are portable alternatives.
You also need the header <cstdlib> for rand().
> 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];
You actually need arrays of length 7. Writing beyond the bounds of an array
is undefined behavior, and might cause the strange behavior that you are
observing.
Also, why all the static variables?
> 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;
random is an identifier declared by one of the headers. You have a name
conflict.
> 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]);
This is not so good.
a) The %52 approach introduces a bias. (Not all that big)
b) The code is longish.
c) Collisions are more likely than you think. Thus, it can take a long time
for this loop to finish. (Though, not as long as the next loop.)
An alternative approach would be to put all 52 cards into one array and use
one call to std::random_shuffle(). Then, use the first 7 of that array.
> //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]);
This loop does not actually change the cards. So, if there is a rank
collision, this loop will not terminate. Are you sure, you want the loop?
> //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()
> {
[snip]
I guess, some poker knowledge would be needed to scrutinize this part.
> 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');
>
> }
The idea of setting a global variable (PlayAgain) in betGame() and read it
in main() is strange.
Best
Kai-Uwe Bux