龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

一个c++写的发牌程序

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
可以显示一、二、三、四家的牌,主要是为了练习我的牌感(记牌的能力),对有志于赌博或者桥牌事业的同志可能还有点用,编译为bd.exe,使用方法输入"bd -h"看帮助。 以下是源代码(处理命

  可以显示一、二、三、四家的牌,主要是为了练习我的牌感(记牌的能力),对有志于赌博或者桥牌事业的同志可能还有点用,编译为bd.exe,使用方法输入"bd -h"看帮助。

  

  以下是源代码(处理命令行参数的代码参考了vim):

  

  #include

  #include

  #include

  #include

  using namespace std;

  

  #include

  #include

  #include

  

  static char program_name[]="bd";

  #define THE_VERSION "0.1"

  

  namespace info{

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

  };

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

  static char card_symbol[]="23456789TJQKA";

  

  // p - pointer to argument

  // idx - index in argument

  // default value

  static int

  get_number_arg(char* p,int def)

  {

   if (isdigit(*p))

   {

   def = atoi(p);

   }

   return def;

  }

  

  static void

  print_help()

  {

   cout<<"Usage: "< cout<<"Bridge Dealer"<

   cout<<"Example: "< cout<

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

   cout<<" ""< cout<<" -n number of deals, default "1""<

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

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

   cout<

   exit(0);

  }

  

  static void

  print_version()

  {

   cout< exit(0);

  }

  

  static void

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

  {

   vector::iterator iter=ori;

   for(int i=0;i

   {

   for(int j=0;j

   cout<

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

   {

   cout<

   }

   cout<

   }

  }

  

  

  static void

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

  {

   vector::iterator iter1=o1;

   vector::iterator iter2=o2;

   int j;

   int cnt;

   for(int i=0;i

   {

   cout<

   cnt=2;

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

   {

   cout<

   cnt=cnt+2;

   }

  

   for(j=0;j

   cout<

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

  

   {

   cout<

   }

   cout<0)

   {

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

   {

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

   switch(c)

   {

   case 0:

   //do nothing

   argv_idx=-1;

   break;

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

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

   print_version();

   }

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

   print_help();

   }

   argv_idx=-1;

   break;

   case 'h':

   print_help();

   break;

   case 'v':

   print_version();

   break;

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

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

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

   argv_idx=-1;

   }

   else{ // "-p {tag}"

   want_argument=true;

   }

   break;

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

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

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

   if(number_of_deals<=0) number_of_deals=1;

   argv_idx=-1;

   }

   else{ // "-n {tag}"

   want_argument=true;

   }

   break;

   default:

   break;

   }

  

  

   //handle options with argument

   if(want_argument)

   {

   if (argv[0][argv_idx]){

   cerr<

  

   }

  

   --argc;

   if (argc<1){

   cerr<

   }

   ++argv;

   argv_idx = -1;

  

   switch(c)

   {

   case 'p':

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

   argv_idx=-1;

   break;

   case 'n':

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

   if(number_of_deals<=0) number_of_deals=1;

   argv_idx=-1;

   break;

   default:

   ; //impossible

   }

   }

  

   }

   else{

   argv_idx=-1;//do nothing

   }

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

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

   // skipped.

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

   {

   --argc;

   ++argv;

   argv_idx = 1;

   }

   }

   //init

   srand(time(0));

  

   //original card

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

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

   const int dim=52;

   int cards[dim];

  

   for(int i=0;i

   {

   cards[i]=i;

   }

   vector h(dim);

   h.assign(cards,cards+dim);

  

   //redeal

   bool need_id=number_of_deals>1;

   for(int k=0;k

   {

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

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

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

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

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

  

   //dump

   if(need_id){

   cout<<"ID: "<

   }

   switch(players)

   {

   case 1:

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

   break;

   case 2:

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

   break;

   case 3:

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

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

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

   break;

   case 4:

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

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

  

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

   break;

   default:

   ;//impossible

   }

   cout<

   }

   return 0;

  }

  

精彩图集

赞助商链接