Thread: Help!For poker game simulation

  1. #1
    Registered User
    Join Date
    May 2007
    Posts
    67

    Question Help!For poker game simulation

    This is our problem:
    Video Poker Simulation



    Acme Software, Inc, has been contracted to write a Video Poker Simulation game in basic C++ that follows the following rules:



    Basic Setting:

    The player places an initial bet between one (1) and fifty (50) coins. The player is then dealt five (5) cards and allowed to choose which cards, if any, they wish to keep. The cards that they do not wish to keep are discarded, and replacement cards are dealt so that they again have a total of five (5) cards. The computer then determines what amount they have won, if any.



    Card Ranks and Suits:

    Cards are ranked, from highest to lowest:

    · Ace

    · King

    · Queen

    · Jack

    · Ten

    · Nine

    · Eight

    · Seven

    · Six

    · Five

    · Four

    · Three

    · Two

    · Ace

    (Ace can count as either low or high. See "Royal Flush"'s scoring, below.)

    The card suits are: Hearts, Clubs, Diamonds, and Spades



    Hand Ranks:

    When you are dealt replacement cards for your discards, your new hand is evaluated. Based on what kind of hand you're holding, you'll receive a certain number of points.

    Hands are listed below, from best (highest scoring), to worst (no score):

    · Royal Flush - 2000 points

    A straight flush, with the Ace high.

    In other words, a Ten, Jack, Queen, King and Ace, all of the same suit.

    · Straight Flush - 250 points

    A straight flush.

    In other words, all five cards are consecutive and are the same suit.

    For example: Three of Clubs, Four of Clubs, Five of Clubs, Six of Clubs and Seven of Clubs.

    · Four of a Kind - 125 points

    Four cards of the same value. (Obviously, each of different suits.)

    · Full House - 40 points

    A three of a kind and a pair at the same time.

    · Flush - 25 points

    All cards in your hand are the same suit.

    · Straight - 20 points

    All five cards are consecutive.

    For example: Three of Clubs, Four of Spades, Five of Clubs, Six of Diamonds, and Seven of Hearts.

    · Three of a Kind - 15 points

    Three cards of the same value.

    · Two Pair - 10 points

    Two pairs of cards.

    In other words, two cards in your hand are the same value, and two other cards in your hand are also the same value.

    · Pair - 5 points

    Two cards in your hand are the same value. In this version, they must be Jacks or better!

    · None of the Above - 0 points

    Each turn "costs" 5 dollars, so if you get a pair, no money actually end up added to your total score. If you don't get anything, you actually lose five dollars! If you bet more than one 5 dollar coin, then the returns above are multiplied by the number of coins entered to give the actual yield. This is just how handheld and Vegas video poker games actually work!



    Project Requirements:

    Your project must meet the following specifications:

    1. Text-based display of what is in the player’s hand.
    2. Read all cards to be discarded at once
    3. Read from the command line as a program parameter the name of a file that contains the state of a previous game so that a player can resume a game at any point. Thus, your program must read and write to a file as well as verify that a file exists.
    4. Provided adequate “help” for the player on how to play the game.
    5. Score all hands correctly.
    6. Know the player’s name and be “friendly”


    This is the code I learned.
    Code:
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    #include <time.h>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    void loadDeck(string suits[4], string faceValue[13])
    {
         ifstream in; 
         in.open("cards.dat");
         if(in.fail())
         {
            in.close();
            cout<<"Deck of cards not found, program ending"<<endl;
            exit(1);
         }
         for(int i=0; i<4; i++)
            in>>suits[i];
         for(int i=0; i<13; i++)
            in>>faceValue[i];
         in.close();
    }
    
    void shuffle( bool cards[52], int hand[5])
    {
         for(int i=0;i<52; i++)
            cards[i] = false;
         for(int i=0; i<5; i++)
            hand[i] = -1;
    } 
    
    void deal(bool card[], int hand[], int pos)
    {
         int dealt;
         while(card[dealt=rand()%52]);
         hand[pos] = dealt;
         card[dealt] = true;
    }
    
      
    void initialDeal(bool card[], int hand[])
    {
         for(int i=0; i<5; i++)
             deal(card, hand, i);
    }
    
    void discard(bool card[], int hand[])
    {
         char str[80];
         cout<<"Which cards would you like to discard: ";
         cin.getline(str, '\n',80);
         char * pch;
         pch = strtok (str," ,.-");
         while (pch != NULL)
         {
            deal(card, hand, atoi(pch));
            pch = strtok (NULL, " ,.-");
         }
    }
    
    void display(int hand[], string suit[], string faceValue[])
    {
         cout<<"The cards in your hand are: "<<endl;
         for(int i=0; i<5; i++)
            cout<<i<<".  "<<faceValue[hand[i]%13]<<" of "<<suit[hand[i]%4]<<endl;
    //          cout<<hand[i]<<endl;
         cout<<endl;
    }
    
    bool again()
    {
         string ans;
         cout<<"Do you want to do this again? ";
         cin>>ans;
         return (toupper(ans[0]) == 'Y');
    }
    
    int main(int argc, char *argv[])
    {
        string suits[4], faceValue[13];
        bool cards[52];
        int hand[5];
        srand(time(NULL));
        loadDeck(suits, faceValue); 
        do
        {
           shuffle(cards, hand);
           initialDeal(cards, hand);
           display(hand, suits, faceValue);
           discard(cards, hand);
           display(hand, suits, faceValue);       
        }while(again());
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    as you guys see,it finished almost the half of the project.But the last step:show the points to player.I really don't know how to do that.Can you guys show me how to do?
    And when you run the program,there is a strange problem:when you want to discard cards,you must use control+z to make system do this,or the system will not response.Why?
    How to fix?


    Super Beginner!

  2. #2
    Frequently Quite Prolix dwks's Avatar
    Join Date
    Apr 2005
    Location
    Canada
    Posts
    8,057
    This is the code I learned.
    So you didn't actually write that code, or what?

    Code:
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    #include <time.h>
    Try not to mix <c*> and <*.h> C header files, it's confusing.

    Also, toupper() is in <ctype.h> or <cctype>.
    dwk

    Seek and ye shall find. quaere et invenies.

    "Simplicity does not precede complexity, but follows it." -- Alan Perlis
    "Testing can only prove the presence of bugs, not their absence." -- Edsger Dijkstra
    "The only real mistake is the one from which we learn nothing." -- John Powell


    Other boards: DaniWeb, TPS
    Unofficial Wiki FAQ: cpwiki.sf.net

    My website: http://dwks.theprogrammingsite.com/
    Projects: codeform, xuni, atlantis, nort, etc.

  3. #3
    Registered User
    Join Date
    May 2007
    Posts
    67
    in fact,my professor explain it to us,and I try to do it in my style,and I used some from my professor.

  4. #4
    Registered User
    Join Date
    May 2007
    Posts
    67
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    #include <time.h>
    really?But my professor always do that.And I don't think it is so bad,at least I am not confused.

  5. #5
    Frequently Quite Prolix dwks's Avatar
    Join Date
    Apr 2005
    Location
    Canada
    Posts
    8,057
    When C++ was created, the creators did not want to derive C++ programmers of the C header files that they were used to. So originally one could access the C header files just like in C programs, with <X.h> (like <stdio.h>). Then, when C++ was standardized, and all of the .h extensions on the standard header files were dropped, the header files became <cX> (like <cstdio>). The old .h form is not deprecated, though, so there's nothing wrong with using it, except that it doesn't look as consistent. But mixing <cX> and <X.h> seems like begging for confusion.
    dwk

    Seek and ye shall find. quaere et invenies.

    "Simplicity does not precede complexity, but follows it." -- Alan Perlis
    "Testing can only prove the presence of bugs, not their absence." -- Edsger Dijkstra
    "The only real mistake is the one from which we learn nothing." -- John Powell


    Other boards: DaniWeb, TPS
    Unofficial Wiki FAQ: cpwiki.sf.net

    My website: http://dwks.theprogrammingsite.com/
    Projects: codeform, xuni, atlantis, nort, etc.

  6. #6
    Registered User
    Join Date
    Jan 2005
    Posts
    7,366
    >> And when you run the program,there is a strange problem:when you want to discard cards,you must use control+z to make system do this,or the system will not response.Why?

    What compiler do you use? What input are you giving?

    I can see a problem where the second time you run it (after saying 'Y' to again()) the discard function won't work. That is because after typing 'y' the user hits <enter> and when discard calls getline, it stops at the newline leftover from that <enter>. To solve this you'd need to add cin.ignore(1000, '\n') or something similar after your call to cin >>. I'm not sure if this is causing the Ctrl-Z problem, but you never know.


    >> really?But my professor always do that.And I don't think it is so bad,at least I am not confused.

    Using those headers is legal and not that bad. It is just a little confusing because <cstdlib> is the new style C++ version of the C header, but <math.h> and <time.h> are the old style C versions. This is not a big deal, though.

    >> The old .h form is not deprecated
    The old .h is deprecated. It is standard, but deprecated by the standard. This means it is legal and valid, but that the <c*> versions are preferred.

  7. #7
    Registered User
    Join Date
    May 2007
    Posts
    67
    I use Dev-4 and I just input number from 0-4(as you see,to discard cards).

  8. #8
    Frequently Quite Prolix dwks's Avatar
    Join Date
    Apr 2005
    Location
    Canada
    Posts
    8,057
    >> The old .h form is not deprecated
    The old .h is deprecated. It is standard, but deprecated by the standard. This means it is legal and valid, but that the <c*> versions are preferred.
    That was the view I always held, until I got into an argument here a few weeks ago. I'll see if I can find the thread, though it likely disapeared when the board crashed.

    [edit] No, you're right. http://cboard.cprogramming.com/showthread.php?t=87815

    Okay, let me get this straight. The old .h header files have to be included with the standard, but they are deprecated. So is it safe to use them or not?

    I guess the main distinction is that the contents of the .h files are not in the namespace std. [/edit]
    Last edited by dwks; 05-24-2007 at 06:23 PM.
    dwk

    Seek and ye shall find. quaere et invenies.

    "Simplicity does not precede complexity, but follows it." -- Alan Perlis
    "Testing can only prove the presence of bugs, not their absence." -- Edsger Dijkstra
    "The only real mistake is the one from which we learn nothing." -- John Powell


    Other boards: DaniWeb, TPS
    Unofficial Wiki FAQ: cpwiki.sf.net

    My website: http://dwks.theprogrammingsite.com/
    Projects: codeform, xuni, atlantis, nort, etc.

  9. #9
    Registered User
    Join Date
    May 2007
    Posts
    67
    5. Score all hands correctly.

    Hand Ranks:

    When you are dealt replacement cards for your discards, your new hand is evaluated. Based on what kind of hand you're holding, you'll receive a certain number of points.

    Hands are listed below, from best (highest scoring), to worst (no score):

    &#183; Royal Flush - 2000 points

    A straight flush, with the Ace high.

    In other words, a Ten, Jack, Queen, King and Ace, all of the same suit.

    &#183; Straight Flush - 250 points

    A straight flush.

    In other words, all five cards are consecutive and are the same suit.

    For example: Three of Clubs, Four of Clubs, Five of Clubs, Six of Clubs and Seven of Clubs.

    &#183; Four of a Kind - 125 points

    Four cards of the same value. (Obviously, each of different suits.)

    &#183; Full House - 40 points

    A three of a kind and a pair at the same time.

    &#183; Flush - 25 points

    All cards in your hand are the same suit.

    &#183; Straight - 20 points

    All five cards are consecutive.

    For example: Three of Clubs, Four of Spades, Five of Clubs, Six of Diamonds, and Seven of Hearts.

    &#183; Three of a Kind - 15 points

    Three cards of the same value.

    &#183; Two Pair - 10 points

    Two pairs of cards.

    In other words, two cards in your hand are the same value, and two other cards in your hand are also the same value.

    &#183; Pair - 5 points

    Two cards in your hand are the same value. In this version, they must be Jacks or better!

    &#183; None of the Above - 0 points

    Each turn "costs" 5 dollars, so if you get a pair, no money actually end up added to your total score. If you don't get anything, you actually lose five dollars! If you bet more than one 5 dollar coin, then the returns above are multiplied by the number of coins entered to give the actual yield. This is just how handheld and Vegas video poker games actually work!
    I really don't know how to score points.for example:
    &#183; Straight - 20 points

    All five cards are consecutive.

    For example: Three of Clubs, Four of Spades, Five of Clubs, Six of Diamonds, and Seven of Hearts.
    how to represent 5 consecutive cards?Can you guys give me some hints?

  10. #10
    Frequently Quite Prolix dwks's Avatar
    Join Date
    Apr 2005
    Location
    Canada
    Posts
    8,057
    Well, probably the same way you'd represent any five cards. You'd just have to check to make sure they were consecutive.
    Code:
    type array[5];
    But I think you're complicating things. Just store all of the cards in a player's hand, and look in that hand for the consecutive cards. You don't have to actually store the consecutive cards separately.
    dwk

    Seek and ye shall find. quaere et invenies.

    "Simplicity does not precede complexity, but follows it." -- Alan Perlis
    "Testing can only prove the presence of bugs, not their absence." -- Edsger Dijkstra
    "The only real mistake is the one from which we learn nothing." -- John Powell


    Other boards: DaniWeb, TPS
    Unofficial Wiki FAQ: cpwiki.sf.net

    My website: http://dwks.theprogrammingsite.com/
    Projects: codeform, xuni, atlantis, nort, etc.

  11. #11
    Registered User
    Join Date
    May 2007
    Posts
    67
    Quote Originally Posted by dwks View Post
    Well, probably the same way you'd represent any five cards. You'd just have to check to make sure they were consecutive.
    Code:
    type array[5];
    But I think you're complicating things. Just store all of the cards in a player's hand, and look in that hand for the consecutive cards. You don't have to actually store the consecutive cards separately.
    SORRY,I can't understand your meaning.

  12. #12
    Frequently Quite Prolix dwks's Avatar
    Join Date
    Apr 2005
    Location
    Canada
    Posts
    8,057
    I just meant that you don't have to store consecutive cards are differently than ordinary cards.
    dwk

    Seek and ye shall find. quaere et invenies.

    "Simplicity does not precede complexity, but follows it." -- Alan Perlis
    "Testing can only prove the presence of bugs, not their absence." -- Edsger Dijkstra
    "The only real mistake is the one from which we learn nothing." -- John Powell


    Other boards: DaniWeb, TPS
    Unofficial Wiki FAQ: cpwiki.sf.net

    My website: http://dwks.theprogrammingsite.com/
    Projects: codeform, xuni, atlantis, nort, etc.

  13. #13
    Registered User
    Join Date
    Jan 2005
    Posts
    7,366
    >> how to represent 5 consecutive cards?Can you guys give me some hints?
    Just look at the values of the card and determine if they are consecutive. You already have code to get face value, so get each face value for the cards and sort them. If the five face values are in order, they are a straight (be careful with aces, though, since they can be high or low in straights).

    You should have separate functions for each possible hand type to make the code less confusing. Just send the hand array to each function from highest to lowest score and stop when one matches.

    You can ignore the rest of this post, it is directed at dwks...

    >> Okay, let me get this straight. The old .h header files have to be included with the standard, but they are deprecated. So is it safe to use them or not? I guess the main distinction is that the contents of the .h files are not in the namespace std.

    If your compiler is standards compliant, you can use either. The <*.h> headers are standard but deprecated, and the <c*> versions are standard and preferred. The difference is the std namespace, but even then some modern compilers allow you to use <c*> without specifying std.

    This advice only applies to C library headers. The <*.h> C++ library headers are not standard and should not be used at all.

    The OP is using Dev-4, which is old and not necessarily standards compliant anyway.

  14. #14
    Registered User
    Join Date
    May 2007
    Posts
    67
    >> how to represent 5 consecutive cards?Can you guys give me some hints?
    Just look at the values of the card and determine if they are consecutive. You already have code to get face value, so get each face value for the cards and sort them. If the five face values are in order, they are a straight (be careful with aces, though, since they can be high or low in straights).

    You should have separate functions for each possible hand type to make the code less confusing. Just send the hand array to each function from highest to lowest score and stop when one matches.
    sorry,I found I was too silly!I know your meaning,but how to apply it?Can you give me a sample?

  15. #15
    Registered User
    Join Date
    Jan 2005
    Posts
    7,366
    There's so many ways to do it and it involves quite a bit of code. Besides, it appears to be a large part of the assignment.

    How would you do this on paper? Write out the steps, I gave a real quick summary of one method in that post. Once the steps make sense on paper, then you should try to move it to code.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. how do the game engine and the api interact?
    By Shadow12345 in forum Game Programming
    Replies: 9
    Last Post: 12-08-2010, 12:08 AM
  2. Open Source / Semi Open source game idea. Help needed
    By CaptainPatent in forum Projects and Job Recruitment
    Replies: 10
    Last Post: 05-16-2007, 10:44 AM
  3. game engine advice?
    By stien in forum Game Programming
    Replies: 0
    Last Post: 01-23-2007, 03:46 PM
  4. My Maze Game --- A Few Questions
    By TechWins in forum Game Programming
    Replies: 18
    Last Post: 04-24-2002, 11:00 PM