当前位置:编程学习 > C#/ASP.NET >>

急求麻将的具体算法

最近要项目答辩
我想靠做单击版长沙麻将来做拿个优秀项目奖
但我又是一个新手
怕会有误
现在就麻烦各位前辈给小妹提供一个C#的具体的麻将算法
多谢各位了
要C#写的哦!!! --------------------编程问答-------------------- ..关注. --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- 关注就来点帮助赛!!! --------------------编程问答-------------------- 我是这么想地
如果句子那么加()扩起来
如果是对子那么用【】扩起来
如果是成坎的那么用{}
这样的话[]必须出出现一次,因为必须要一对将

剩下的牌按3个一组并按上面的规则打上()或{}
这样话,也就所有的牌都必须在成对的标记类
而且这些标记不能嵌套


或许要参考一下模式匹配方面的资料,蚁群算法或模拟退火算法估计都可以选择吧!我估计模拟退火算法可能更有效点 --------------------编程问答-------------------- 恩,想了一下。似乎有点思路

这个里面视乎有优先级的

对子优先,坎次之,句子最后

哦,忽然发现漏了一个东西,好像还有杠啊,还有某些地方有赖子,呵呵,比较头痛了! --------------------编程问答-------------------- 这个东西我建议你去研学论坛上去问,那个地方玩纯算法的人比较。
csdn玩算法的比较少,都是搞应用开发的,算法部分没必要一般都是不做深入研究滴 --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 顶,算法太重要了,可惜没学好。 --------------------编程问答-------------------- 这个不是算法的问题了, 已经上升到数学模型的水平了。

如果单独只是判定和牌,那么 有现成的算法,去搜索一下就肯定有。

如果是要计算出牌和打牌的话,那就真的需要数学模型了。

好像大多 棋牌游戏的高级算法 都是采用二维矩阵或者三维矩阵甚至四维的。 
国际象棋就是三维矩阵, --------------------编程问答-------------------- 我很久前高中里写过,现在简单地写一下思路,

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张)->合成新的一副牌
  新的一副牌是不是胡了,胡了那这张牌就是可以胡的牌!,而且有一张就允许听牌!!!
  继续循环新建下一张牌进行判断。。。
}

--------------------编程问答-------------------- 最后不是马上 是麻将。。 --------------------编程问答--------------------  继续循环新建下一张牌进行判断。。。 
为的是找出所有可以胡的牌,用个道具后可以看什么用的 --------------------编程问答-------------------- 另外,所有的牌都是一个整数,所有最开始就是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筒)
都去掉
然后
数组空了
[]
胡了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


--------------------编程问答-------------------- 对于>=31的东南西北中白发,吃的时候要忽略掉的,就是对排序后的牌只检索到<30 --------------------编程问答-------------------- 对了,有一点说错了
如果在判断胡的时候发现牌里有XXXX是不允许胡的!但会允许暗杠,如果暗杠就补摸一张牌然后选仍哪张 --------------------编程问答-------------------- 再补充一下,一副牌每张牌都只有4张

还有关于电脑的ai
难度越高,很让你组成吃碰杠胡的牌有越大的概率不给你或放自己牌里不出由于每张牌只有4张等于减少了你拿到的机会但又不是绝对的不让你摸到
而电脑摸到自己能吃碰杠的牌就留下来,另外,给电脑自己的牌一般都有牌型 --------------------编程问答-------------------- 以上的电脑ai可以当你用个道具让大家都能明着对方牌的时候不会发现电脑不是完全随机吃碰杠胡的 --------------------编程问答-------------------- 不会打麻将,爱莫能助 --------------------编程问答-------------------- 难度应该在于:当你得到一张新牌而没有和时,你该出哪张牌?
要判断哪张牌是最孤立的?在"孤立度"相同的情况下,应该优先打"东西南北中发白"或者优先打别人出过的牌(以避免出的牌被别人杠到)...
在听牌时,还有判断还有多大的机率可以和到(即你所听的牌已经出了多少张)...然后拿到新的牌,要判断换牌是否可以增大和的机率....
...... --------------------编程问答-------------------- 要看哪里的麻将?
比如杭州麻将就比较好写
财神狂多的那种就难
据说湖北的麻将财神>10 --------------------编程问答-------------------- 我做的是长沙麻将
是可以只吃上家的牌
然后可以随便碰的
胡牌一定要一对将的 --------------------编程问答-------------------- 我以前写过一点 写到一半太费时间了
我可以提供相关的几处代码
我看看能贴多少 不过麻将的算法是上海麻将
如果你有兴趣 可以继续写下去 不过如果可以 麻烦把接下来的代码发一份到我邮箱dkxzq@163.com 有时间我也想继续下去
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++;
        }
 最后我是把判断胡牌的算法结束了 但是界面设计方面和电脑智能方面 都由于时间问题 没能继续下去
后面的代码太长了
如果需要你发个邮件给我 我有时间找下后面的代码然后发给你


补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,