天天看點

一個c++寫的發牌程式

可以顯示一,二,三,四家的牌

主要是為了訓練我的牌感(記牌的能力),對有志于賭博或者橋牌事業的同志可能還有點用

編譯為bd.exe,使用方法輸入"bd -h"看幫助

以下是源代碼(處理指令行參數的代碼參考了vim):

一個c++寫的發牌程式

 #include  < iostream > 

一個c++寫的發牌程式

#include  < algorithm > 

一個c++寫的發牌程式

#include  < functional > 

一個c++寫的發牌程式

#include  < vector > 

一個c++寫的發牌程式

 using   namespace  std;

一個c++寫的發牌程式
一個c++寫的發牌程式

#include  < cstdlib > 

一個c++寫的發牌程式

#include  < ctime > 

一個c++寫的發牌程式

#include  < cctype > 

一個c++寫的發牌程式
一個c++寫的發牌程式

 static   char  program_name[] = " bd " ;

一個c++寫的發牌程式

 #define  THE_VERSION "0.1" 

一個c++寫的發牌程式
一個c++寫的發牌程式

 namespace  info {

一個c++寫的發牌程式

     enum   { WEST = 0 ,NORTH = 1 ,EAST = 2 ,SOUTH = 3 ,} ;

一個c++寫的發牌程式

} ;

一個c++寫的發牌程式

 static   char *  deno[] = { " Spade " , " Heart " , " Diamond " , " Cotton " ,} ;

一個c++寫的發牌程式

 static   char  card_symbol[] = " 23456789TJQKA " ;

一個c++寫的發牌程式
一個c++寫的發牌程式

 //  p - pointer to argument

一個c++寫的發牌程式

 //  idx - index in argument

一個c++寫的發牌程式

 //  default value  

一個c++寫的發牌程式

 static   int 

一個c++寫的發牌程式

get_number_arg( char *  p, int  def)

一個c++寫的發牌程式

 {

一個c++寫的發牌程式

     if  (isdigit( * p))

一個c++寫的發牌程式

     {

一個c++寫的發牌程式

    def  =  atoi(p);

一個c++寫的發牌程式

    } 

一個c++寫的發牌程式

     return  def;

一個c++寫的發牌程式

一個c++寫的發牌程式
一個c++寫的發牌程式

 static   void 

一個c++寫的發牌程式

print_help()

一個c++寫的發牌程式
一個c++寫的發牌程式

    cout << " Usage:  " << program_name << "  [OPTION]

一個c++寫的發牌程式

 " << endl;

一個c++寫的發牌程式

    cout << " Bridge Dealer " << endl;

一個c++寫的發牌程式

    cout << " Example:  " << program_name << "  -p4 " << endl;

一個c++寫的發牌程式

    cout << endl;

一個c++寫的發牌程式

    cout << "  -p           number of players, value ranges from 1 to 4 " << endl;

一個c++寫的發牌程式

    cout << "               \ "" <<program_name<< " \ "  with NO option equals \ "" <<program_name<< "   - p1\ "   " << endl;

一個c++寫的發牌程式

    cout << "  -n           number of deals, default \ " 1 \ "" << endl;

一個c++寫的發牌程式

    cout << "  -v,--version print version information and exit " << endl;

一個c++寫的發牌程式

    cout << "  -h,--help    display this help and exit " << endl;

一個c++寫的發牌程式
一個c++寫的發牌程式

    exit( 0 );

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

print_version()

一個c++寫的發牌程式
一個c++寫的發牌程式

    cout << program_name << "  version  " << THE_VERSION << endl;

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

dump_one_hand(vector < int > ::iterator ori, int  sps = 0 )

一個c++寫的發牌程式
一個c++寫的發牌程式

    vector < int > ::iterator iter = ori;

一個c++寫的發牌程式

     for ( int  i = 0 ;i < sizeof (deno) / sizeof (deno[ 0 ]);i ++ )

一個c++寫的發牌程式
一個c++寫的發牌程式

         for ( int  j = 0 ;j < sps;j ++ ) cout << "   " ;

一個c++寫的發牌程式

        cout << deno[i][ 0 ] << " :  " ;

一個c++寫的發牌程式

         for (;(iter != ori + 13 )  &&  ( * iter) / 13 == i;iter ++ )

一個c++寫的發牌程式

         {

一個c++寫的發牌程式

            cout << card_symbol[( * iter) % 13 ] << "   " ;

一個c++寫的發牌程式

        } 

一個c++寫的發牌程式

        cout << endl;

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

dump_two_hands(vector < int > ::iterator o1, vector < int > ::iterator o2, int  sps = 0 )

一個c++寫的發牌程式
一個c++寫的發牌程式

    vector < int > ::iterator iter1 = o1;

一個c++寫的發牌程式

    vector < int > ::iterator iter2 = o2;

一個c++寫的發牌程式

     int  j;

一個c++寫的發牌程式

     int  cnt;

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

        cnt = 2 ;

一個c++寫的發牌程式

         for (;(iter1 != o1 + 13 )  &&  ( * iter1) / 13 == i;iter1 ++ )

一個c++寫的發牌程式
一個c++寫的發牌程式

            cout << card_symbol[( * iter1) % 13 ] << "   " ;

一個c++寫的發牌程式

            cnt = cnt + 2 ;

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

         for (j = 0 ;j < sps + sps - cnt;j ++ ) cout << "   " ;

一個c++寫的發牌程式
一個c++寫的發牌程式

         for (;(iter2 != o2 + 13 )  &&  ( * iter2) / 13 == i;iter2 ++ )

一個c++寫的發牌程式
一個c++寫的發牌程式

            cout << card_symbol[( * iter2) % 13 ] << "   " ;

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

 // error message routines---------------begin 

一個c++寫的發牌程式

 static   char *  bs_errors[] = 

一個c++寫的發牌程式
一個c++寫的發牌程式

     " Unknown option " ,

一個c++寫的發牌程式

 #define  BS_UNKNOWN_OPTION 0 

一個c++寫的發牌程式

     " Too many arguments " ,

一個c++寫的發牌程式

 #define  BS_TOO_MANY_ARGS 1 

一個c++寫的發牌程式

     " Argument missing after " ,

一個c++寫的發牌程式

 #define  BS_ARG_MISSING 2 

一個c++寫的發牌程式

     " Garbage after option " ,

一個c++寫的發牌程式

 #define  BS_GARBAGE      3 

一個c++寫的發牌程式

     " Too many extra commands " ,

一個c++寫的發牌程式

 #define  BS_EXTRA_CMD        4 

一個c++寫的發牌程式

     " Invalid argument for " ,

一個c++寫的發牌程式

 #define  BS_INVALID_ARG      5 

一個c++寫的發牌程式
一個c++寫的發牌程式

 // error message routines---------------end 

一個c++寫的發牌程式
一個c++寫的發牌程式

 int 

一個c++寫的發牌程式

main( int  argc,  char **  argv)

一個c++寫的發牌程式
一個c++寫的發牌程式

     int  argv_idx  =   1 ;        /*  active option letter is argv[0][argv_idx]  */ 

一個c++寫的發牌程式

     int  players = 1 ;

一個c++寫的發牌程式

     int  number_of_deals = 1 ;

一個c++寫的發牌程式

     bool  want_argument = false ;

一個c++寫的發牌程式
一個c++寫的發牌程式

     while (argc > 0 )

一個c++寫的發牌程式
一個c++寫的發牌程式

         if (argv[ 0 ][ 0 ] == ' - ' )

一個c++寫的發牌程式
一個c++寫的發牌程式

             char  c = argv[ 0 ][argv_idx ++ ];

一個c++寫的發牌程式

             switch (c)

一個c++寫的發牌程式

             {

一個c++寫的發牌程式

             case   0 :

一個c++寫的發牌程式

                 // do nothing 

一個c++寫的發牌程式

                 argv_idx =- 1 ;

一個c++寫的發牌程式

                 break ;

一個c++寫的發牌程式

             case   ' - ' :  //  "--" don't take any more options 

一個c++寫的發牌程式

                  if (strcmp(argv[ 0 ] + argv_idx, " version " ) == 0 ) {

一個c++寫的發牌程式

                    print_version();

一個c++寫的發牌程式

                } 

一個c++寫的發牌程式

                  else   if (strcmp(argv[ 0 ] + argv_idx, " help " ) == 0 ) {

一個c++寫的發牌程式

                    print_help();

一個c++寫的發牌程式
一個c++寫的發牌程式

                argv_idx =- 1 ;

一個c++寫的發牌程式
一個c++寫的發牌程式

             case   ' h ' :

一個c++寫的發牌程式

                print_help();

一個c++寫的發牌程式
一個c++寫的發牌程式

             case   ' v ' :

一個c++寫的發牌程式

                print_version();

一個c++寫的發牌程式
一個c++寫的發牌程式

             case   ' p ' :  //  1,2,3,4 players, default 1 

一個c++寫的發牌程式

                  if  (argv[ 0 ][argv_idx]) {  //  "-p{tag}" 

一個c++寫的發牌程式

                     players = get_number_arg(argv[ 0 ] + argv_idx, 1 );

一個c++寫的發牌程式

                    argv_idx =- 1 ;

一個c++寫的發牌程式
一個c++寫的發牌程式

                  else {  //  "-p {tag}" 

一個c++寫的發牌程式

                     want_argument = true ;

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

             case   ' n ' :  // number of deals, default 1 

一個c++寫的發牌程式

                  if  (argv[ 0 ][argv_idx]) {  //  "-n{tag}" 

一個c++寫的發牌程式

                     number_of_deals = get_number_arg(argv[ 0 ] + argv_idx, 1 );

一個c++寫的發牌程式

                     if (number_of_deals <= 0 ) number_of_deals = 1 ;

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

                  else {  //  "-n {tag}" 

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

             default :

一個c++寫的發牌程式
一個c++寫的發牌程式

            } 

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

             // handle options with argument 

一個c++寫的發牌程式

              if (want_argument)

一個c++寫的發牌程式
一個c++寫的發牌程式

                 if  (argv[ 0 ][argv_idx]) {

一個c++寫的發牌程式

                    cerr << bs_errors[BS_GARBAGE] << " : \ "" <<argv[0]<< " \ "" << endl;

一個c++寫的發牌程式

                    exit( 1 );

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

                 -- argc;

一個c++寫的發牌程式

                 if  (argc < 1 ) {

一個c++寫的發牌程式

                    cerr << bs_errors[BS_ARG_MISSING] << " : \ "" <<argv[0]<< " \ "" << endl;

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

                 ++ argv;

一個c++寫的發牌程式

                argv_idx  =   - 1 ;

一個c++寫的發牌程式
一個c++寫的發牌程式

                 switch (c)

一個c++寫的發牌程式

                 {

一個c++寫的發牌程式

                 case   ' p ' :

一個c++寫的發牌程式

                    players = get_number_arg(argv[ 0 ], 1 );

一個c++寫的發牌程式
一個c++寫的發牌程式

                     break ;

一個c++寫的發牌程式

                 case   ' n ' :

一個c++寫的發牌程式

                    number_of_deals = get_number_arg(argv[ 0 ], 1 );

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

                 default :

一個c++寫的發牌程式

                    ;  // impossible 

一個c++寫的發牌程式

                 } 

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

          else {

一個c++寫的發牌程式

            argv_idx =- 1 ; // do nothing 

一個c++寫的發牌程式

         } 

一個c++寫的發牌程式

         //  If there are no more letters after the current "-", go to next

一個c++寫的發牌程式

         //  argument.  argv_idx is set to -1 when the current argument is to be

一個c++寫的發牌程式

         //  skipped. 

一個c++寫的發牌程式

          if  (argv_idx  <=   0   ||  argv[ 0 ][argv_idx]  ==   0 )

一個c++寫的發牌程式
一個c++寫的發牌程式

             -- argc;

一個c++寫的發牌程式

             ++ argv;

一個c++寫的發牌程式

            argv_idx  =   1 ;

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

     // init 

一個c++寫的發牌程式

     srand(time( 0 ));

一個c++寫的發牌程式
一個c++寫的發牌程式

     // original card

一個c++寫的發牌程式

     // value: spade, 0-12; heart, 13-25; diamond 26-38; cotton 39-51;

一個c++寫的發牌程式

     // array index: west, 0-12; north, 13-25; east 26-38; south 39-51; 

一個c++寫的發牌程式

      const   int  dim = 52 ;

一個c++寫的發牌程式

     int  cards[dim];

一個c++寫的發牌程式
一個c++寫的發牌程式

     for ( int  i = 0 ;i < dim;i ++ )

一個c++寫的發牌程式
一個c++寫的發牌程式

        cards[i] = i;

一個c++寫的發牌程式
一個c++寫的發牌程式

    vector < int >  h(dim);

一個c++寫的發牌程式

    h.assign(cards,cards + dim);

一個c++寫的發牌程式
一個c++寫的發牌程式

     // redeal 

一個c++寫的發牌程式

      bool  need_id = number_of_deals > 1 ;

一個c++寫的發牌程式

     for ( int  k = 0 ;k < number_of_deals;k ++ )

一個c++寫的發牌程式
一個c++寫的發牌程式

        random_shuffle(h.begin(),h.end());

一個c++寫的發牌程式

        sort(h.begin() + info::WEST * 13 ,h.begin() + info::WEST * 13 + 13 );

一個c++寫的發牌程式

        sort(h.begin() + info::NORTH * 13 ,h.begin() + info::NORTH * 13 + 13 );

一個c++寫的發牌程式

        sort(h.begin() + info::EAST * 13 ,h.begin() + info::EAST * 13 + 13 );

一個c++寫的發牌程式

        sort(h.begin() + info::SOUTH * 13 ,h.begin() + info::SOUTH * 13 + 13 );

一個c++寫的發牌程式
一個c++寫的發牌程式

         // dump 

一個c++寫的發牌程式

          if (need_id) {

一個c++寫的發牌程式

            cout << " ID:  " << k + 1 << endl;

一個c++寫的發牌程式
一個c++寫的發牌程式

         switch (players)

一個c++寫的發牌程式
一個c++寫的發牌程式

         case   1 :

一個c++寫的發牌程式

            dump_one_hand(h.begin() + info::SOUTH * 13 );

一個c++寫的發牌程式

             break ;

一個c++寫的發牌程式

         case   2 :

一個c++寫的發牌程式

            dump_two_hands(h.begin() + info::EAST * 13 ,h.begin() + info::WEST * 13 , 26 );

一個c++寫的發牌程式
一個c++寫的發牌程式

         case   3 :

一個c++寫的發牌程式

            dump_one_hand(h.begin() + info::NORTH * 13 , 26 );

一個c++寫的發牌程式

            dump_one_hand(h.begin() + info::EAST * 13 );

一個c++寫的發牌程式

            dump_one_hand(h.begin() + info::SOUTH * 13 , 26 );

一個c++寫的發牌程式
一個c++寫的發牌程式

         case   4 :

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

         default :

一個c++寫的發牌程式

            ; // impossible 

一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式
一個c++寫的發牌程式

     return   0 ;

一個c++寫的發牌程式
一個c++寫的發牌程式

繼續閱讀