Tic-A-Tac


   说到赌,作为80后难免要记起,赌神,赌侠,赌圣三部经典作品,其实这三部关于赌都过于留于形式,牌面设计都过于夸张,虽然刺激,却毫无真实性可言。我在大学毕业后看了马特达蒙演的赌王之王,看了不下十遍,非常有感触。故事里的主人公麦克是一所法律大学的学生,他有一个爱好,就是赌,他开始非常谨慎,他的大学学费都是靠这个赢来的。但是故事的开头,他做了一个冒险的决定,在KGB那里输掉他的全部家当,失魂落魄的他懊悔不已,这该是每一个赌徒都经历过的心情吧。靠着一个赌场的朋友帮助,麦克开起了货车,发誓不再赌博,好在他漂亮的女朋友也没有因此离他而去。 故事如果到了这里就结束了,那么他会是一部经典的社会主义反赌教育大片,偏偏这个时候,麦克人生里另一个重要角色出现了,worm,麦克最好的朋友,在他的循循善诱下,麦克又开始了无法自拔的***生涯,按照他的自述,只有在***的时候,才能找到自己的存在。由于worm的大笔欠债和出千被抓,使得麦克的生活急转直下,背负大笔赌债,女朋友毅然决断,最后靠着学校一位老教授的帮助,他又回到了KGB的赌桌上,和他做一对一的PK,赌局设计的饶有意味。在小胜KGB后,麦克放弃了安全走出KGB的赌场,选择再次和KGB做一次一对一的牌局,在经过艰苦的比赛后,麦克以类似89WOP中,jackie chen的手法拿下了KGB,那真是用生命在战斗。

    故事的最后,麦克背着一个挎包,告别了自己的前女朋友,还了教授的借的钱,踏上了去拉斯维加斯的路。我至今记得教授跟麦克说的话,什么是选择?。。。。 我从教会学来的最重要的就是...我们不能逃避自己.我们的命运决定了我们.

    泰坦尼克号赌船其实没多少关于***的游戏,它主要是一个益智游戏为主。Tic A Tac Poker是泰坦尼克号赌船里的一个游戏,给定9张牌,按照上图的形式排列,牌的位置可以随意调整,要求组合出给定的几手牌。怎么样算一手牌呢,规则如下

    三张牌组合符合以下任意情形的,可以作为一手

    顺子,同花,两对或者三条,上图中,绿色的线条可以表示可以作为一手的牌,可以看到,总共8组牌中,总共有5手牌

    怎么计算呢?直观的思维就是先列出每一种排列,然后对每一种排列进行计算,输出手数最多的那个组合。想法粗糙了一些,有没有更简单的办法呢,应该有,但是我还没有想到,所以,只能用傻一些的办法。

    在24点中,用过一种全排列的算法,那种效率相对要低下一些,这里用另外一种全排列算法。它也采用递归,但并不像前面算法需要记录那些数字可选,哪些不可选。它的基本思想是对于一个需要全排列的数组q[],从q[0]开始,按顺序选择一个数字和q[0]交换,然后以q[1]作为数组开头,按照上述的逻辑进行递归,直到程序结束。

  得到排列后,将8组牌型进行计算,得出几手,统计出最大的手数和对应的排列,最后输出取得的结果

 

程序清单

 

#include <stdio.h>  
#include <string.h>

#define END_DATA     10

struct poker  
{    
    int cards_type;//0-3 黑桃,红心,草,方片    
    int cards_num; //1-13 A-K    
};    
struct poker input[9] = {    
    {0,6},    
    {3,4},    
    {1,5},    
    {0,9},    
    {2,12},    
    {1,9},    
    {0,8},    
    {3,7},    
    {1,8}    
};    
int array[10] = {0,1,2,3,4,5,6,7,8,END_DATA};    
char card_type[4] = {6,3,5,4};//    
char *card_num[] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};    
int max_hands_array[9];    
int max_hands_count = 0;    
//  0 -- 1 -- 2    
//  | \  |  / |    
//  3 -- 4 -- 5    
//  |  / | \  |    
//  6 -- 7 -- 8  
//将8组牌对应的牌以其序号标出    
int  hand[8][3] = {    
    {0,1,2},    
    {3,4,5},    
    {6,7,8},    
    {0,3,6},    
    {1,4,7},    
    {2,5,8},    
    {0,4,8},    
    {2,4,6}    
};

void print_poker(struct poker p)  
{    
     printf("%c",card_type[p.cards_type]);    
     printf("%s",card_num[p.cards_num-1]);    
}    
void print_card_array(int *array)    
{    
    int i;    
    for(i=0;i<9;i++)    
    {    
       if(i%3==0)  printf("\n");    
       print_poker(input[array[i]]);    
    }    
    printf("\n");    
}    
int ishands(struct poker  a,struct poker b,struct poker c)    
{    
    int n;    
    if(a.cards_num==b.cards_num||b.cards_num==c.cards_num||a.cards_num==c.cards_num) return 0; //pair    
    if(a.cards_type==b.cards_type&&a.cards_type==c.cards_type) return 0;//flush    
    n = (a.cards_num-c.cards_num)*(b.cards_num-c.cards_num);    
    if(n==2||n==-1) //顺子    
    {    
        return 0;    
    }    
    return -1;    
}    
void process_hands(int *q)    
{    
     int i,hands=0;    
     int a,b,c;    
     for(i=0;i<8;i++)    
     {   
         a = q[hand[i][0]];    
         b = q[hand[i][1]];    
         c = q[hand[i][2]];    
         if(ishands(input[a],input[b],input[c])==0) hands++;    
     }    
     if(max_hands_count<hands)    
     {    
        memcpy(max_hands_array,array,sizeof(max_hands_array));    
        max_hands_count = hands;    
     }    
}    
void get_one_permutation(int *q)    
{    
      int i,j; //i,j是代码界的小明    
      if(q[0]==END_DATA)    
      {     
          process_hands(array);     
          return;    
      }    
      for(i=0;q[i]!=END_DATA;i++)    
      {    
          j = q[0];    
          q[0] = q[i];    
          q[i] = j;    
          get_one_permutation(q+1);    
          q[i] = q[0];    
          q[0] = j;    
      }    
}    
void main()    
{    
     get_one_permutation(array);    
     print_card_array(max_hands_array);    
     printf("最大手数%d  \n",max_hands_count);    
}

输出结果

 

 

下节预告

麻将有关

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值