这个东西我建议你去研学论坛上去问,那个地方玩纯算法的人比较。
csdn玩算法的比较少,都是搞应用开发的,算法部分没必要一般都是不做深入研究滴

解决方案 »

  1.   

    我很久前高中里写过,现在简单地写一下思路,13张牌,然后摸1张扔一张吃:当前对方牌为X 的话,在自己的牌里循环判断以下情况 
    1. X X+1 X+2  
    2. X-1 X X+1
    3. X-2 X-1 X
    只要符合其中一种,比如当前循环到第3张牌,然后发现,3 X 4 符合地2种类,那 3 4 就是可选的一组吃
    如果13-2张牌判断完毕只有符合要求的一组吃,就马上吃掉,如果有多组吃,就其实选择一组队吃法碰
    1.  X x x就是连续2个和对方牌X一样的相同的牌,然后和吃一样!一组马上碰,多组选择杠(明杠!)
    1. X x x x 不说了。。胡
    如果是对方出完牌,那把对方的牌和自己的牌合在一起考虑对方是不是点炮的!如果是自己摸到,就把摸到的和自己原有的牌合在一起考虑是不是自摸!
    这合起来的牌比如13+1张牌。去掉 X X+1 X+2 这种形式的组合,然后去掉 X X X X 杠 再去掉 X X X 最后再去掉 对子 X X ,
    然后所有牌如果都去掉了就胡了!!! 
    如果还有剩下的,说明不能胡!!!听原理和胡差不多,我原来有个很优化的写法忘了!不过最简单的写法是13+x:
    foreach (一个牌 in 马上所有的牌)
    {
      这一个牌+原来的牌(比如还有13张)->合成新的一副牌
      新的一副牌是不是胡了,胡了那这张牌就是可以胡的牌!,而且有一张就允许听牌!!!
      继续循环新建下一张牌进行判断
    }
      

  2.   

    另外,所有的牌都是一个整数,所有最开始就是13个整数的数组
    另外不同的牌型之间之间要隔开不能连续,不然吃麻烦,其实也不直观,
    所以要: 万(1-9)筒(11-19)索(21-29),东南西北什么的就>=31...
    1万 2万 2万 2万 4筒 4筒
    内存里就是
    1 2 2 2 14 14然后对方出了3万,组成合牌,对了,忘了说,每次别忘了排序!
    1万 2万 2万 2万 3万 4筒 4筒
    内存里就是
    [1 2 2 2 3 14 14]去掉 X X+1 X+2 ,这个例子里就是会去掉 一组 (1万 2万 3万) 后2万 2万 4筒 4筒
    内存里就是
    [2 2 14 14]再去掉 XXXX 没有!
    再去掉 XXX 没有!
    再去掉 XX 有! 而且有2组 (2万 2万)  (4筒 4筒)
    都去掉
    然后
    数组空了
    []
    胡了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  3.   

    对于>=31的东南西北中白发,吃的时候要忽略掉的,就是对排序后的牌只检索到<30
      

  4.   

    对了,有一点说错了
    如果在判断胡的时候发现牌里有XXXX是不允许胡的!但会允许暗杠,如果暗杠就补摸一张牌然后选仍哪张
      

  5.   

    我以前写过一点 写到一半太费时间了
    我可以提供相关的几处代码
    我看看能贴多少 不过麻将的算法是上海麻将
    如果你有兴趣 可以继续写下去 不过如果可以 麻烦把接下来的代码发一份到我邮箱[email protected] 有时间我也想继续下去
    public class CardData
        {
            private static CardData _cardData = null;
            private CardData()
            {
                initCards();
            }        public static CardData getCardDate()
            {
                if (_cardData == null)
                {
                    _cardData = new CardData();
                }
                return _cardData;
            }        //全局牌
            private int[] cards = new int[144];
            //全局游标
            private int lastIndex = 143;
            //全局出牌库
            private int[] pushCards = new int[144];
            //全局出牌游标
            private int pushCardIndex = 0;        //在范围内任意获取一张牌
            private int getRandomNo(int maxValue, int minValue)
            {
                int seed = System.DateTime.Now.Millisecond;
                Random r = new Random(seed);
                //Thread.Sleep(50);
                return r.Next(minValue, maxValue);
            }        public void Clear()
            {
                initCards();
            }        //获取牌
            public BasicPlayer.Card getCards()
            {
                if (lastIndex >= 0)
                {
                    int cardNo = getRandomNo(lastIndex, 1);
                    int returnNo = cards[cardNo];
                    cards[cardNo] = cards[lastIndex];
                    lastIndex--;
                    BasicPlayer.Card card = new BasicPlayer.Card();
                    card.index = -1;
                    card.date = returnNo;
                    return card;
                }
                else
                {
                    BasicPlayer.Card card = new BasicPlayer.Card();
                    card.index = -1;
                    card.date = -1;
                    return card;
                }
            }        //初始化所有基础牌数据
            private void initCards()
            {
                lastIndex = 144;
                pushCardIndex = 0;
                for (int i = 1; i < lastIndex; i++)
                {
                    cards[i] = i;
                    pushCards[i] = 0;
                }           
            }        //选手出牌后需调用的函数(把出的牌放入出牌库)
            public void pushCard(int cardNo)
            {
                pushCards[pushCardIndex] = cardNo;
                pushCardIndex++;
            }
     最后我是把判断胡牌的算法结束了 但是界面设计方面和电脑智能方面 都由于时间问题 没能继续下去
    后面的代码太长了
    如果需要你发个邮件给我 我有时间找下后面的代码然后发给你