我很久前高中里写过,现在简单地写一下思路,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张)->合成新的一副牌 新的一副牌是不是胡了,胡了那这张牌就是可以胡的牌!,而且有一张就允许听牌!!! 继续循环新建下一张牌进行判断 }
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张)->合成新的一副牌
新的一副牌是不是胡了,胡了那这张牌就是可以胡的牌!,而且有一张就允许听牌!!!
继续循环新建下一张牌进行判断
}
另外不同的牌型之间之间要隔开不能连续,不然吃麻烦,其实也不直观,
所以要: 万(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筒)
都去掉
然后
数组空了
[]
胡了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
如果在判断胡的时候发现牌里有XXXX是不允许胡的!但会允许暗杠,如果暗杠就补摸一张牌然后选仍哪张
我可以提供相关的几处代码
我看看能贴多少 不过麻将的算法是上海麻将
如果你有兴趣 可以继续写下去 不过如果可以 麻烦把接下来的代码发一份到我邮箱[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++;
}
最后我是把判断胡牌的算法结束了 但是界面设计方面和电脑智能方面 都由于时间问题 没能继续下去
后面的代码太长了
如果需要你发个邮件给我 我有时间找下后面的代码然后发给你