哈哈 陈根同学! 我真是一猜就知道了!.......................
回复 30楼 cacker
我想您没看懂我在26楼给出的那段伪代码吧(尤其是那个for循环).虽然后来发现其中有一点点错误.那个循环就是用来识别 各种类型的牌的.不过对于都地主有些规则我不知道,所以有很多地方还要改动.比如我不知道 四张还可以带2对等.
下面我对于那个循环做简单说明.
程序代码:
*card = *cards;//第一张牌 for ( sub=0,--cards; !table[ *++cards ] ; ) // { if ( card[sub] == *cards )//这张牌和前面的那张一样, { ++len[sub];//只要在原来张数上再加1就好了 continue; } else{ card[++sub] = *cards;//新的一种牌,所以下标sub要加1 ++ count[sub];//新的一种牌的数量也要加1,最开始是0 if ( sub<2 ) ;//如果下标小于2,什么也不做 else if ( (Len) )//这里是主体部分已经确定了的情况 { if ( (len[Len-1]<=len[sub-1]) || (2*Len<=sub) ) return 0;//附带部分的张数要比主体部分的小,对与(2*Len<=sub)这个判断要放到循环结束后去,我不知道4可带2对 } else if ( (len[sub-2] == len[sub-1]) )//这里还不能却定主体部分到了没,所以sub-1,sub-2肯定还是主体部分 { if ( table[card[sub-1]] - table[card[sub-2]] != 1 ) return 0;// 这里是主体部分还没完,那么主体部分每次要加1 } else{ Len = sub-1;//确定主体部分 } }//if card[sub]...else }//for /*/ * 我给出的只是伪代码,只给出了实现的方案,所以这中间还会有很多小问题的. * 对于下面的switch语句中的case情况, 如case 1表示下面我所归纳的第一大类;case 2 ,第二大类,依次类推. * 还有,在这个循环后面,还要加如一些判断,有的情况是没能在那个循环中的情况中的. * 对于那些只有主体部分,没有附带部分.这些情况也是很容易判断的,只要一比较Len,sub,等的值结果就很显然了. /*/
按照先主体部分后附带部分出牌那是很简单判断 牌是属于什么类型的。若您要可以打乱顺序出牌,那么就要先对它排序,变成先主体部分再附带部分
,然后在来判断。
下面我来对各种类型的牌进行分类(依据主体部分):
一.单张组成的牌:首先我再for循环以前就单独考虑了单张的情况,所以单张组成的牌只有两类,顺子和对王。
二.对子组成的牌: 有2类,单独的对子和连对(3对以上)。
三.三张组成的牌: 有2类,单独的三张和连三张.
四.四张组成的牌: 有3类,炸弹和四张带牌和连四张(这里也有些规则我也不情况)
(总共就这么几种情况,所有的牌的带牌规则我都是不怎么清楚的)
对牌分类我是采取这样的依据的:
1.用Len来记录主体部分有多少种牌,如顺子6789AJQK的Len=8,连三张33344487的Len=2,连三张33344455589A的Len=3(其中A表示10)。
2.数组Len是用来记录某种牌的张数, 用来判断主体部分和附带部分分界的依据。主体部分的张数是len[Len-1]。如果某种牌的张数突然变得比前面的牌的张数,那么这里开始是附带部
分了(33344455589J从8开始是附带部分了)。如果附带部分的牌突然又比主体部分的张数还多(333444555897777这是错误的),那么这明显是错 误的出牌了。如果附带的牌的种类比
主体部分的种类还多(333444555679JK也是错误的),那么 也是错误了。当然也不能带一对王,这里也要注意一 下。
3.如果主体部分不只有1种牌,那么主体部分必须是连续的,故主体部分的大小是要依次加1的。
就只要这3点,很容易判断牌是哪种类型的了。只是有可能其中有些细节我没考虑到。
[ 本帖最后由 Windy0Winll 于 2010-9-13 17:55 编辑 ]