/** ×××不带王的一幅完整的牌 /
public static const CARDS_NO_JOKER:Array=[102,103,104,105,106,107,108,109,110,111,112,113,114,202,203,204,205,206,207,208,209,210,211,212,213,214,302,303,304,305,306,307,308,309,310,311,312,313,314,402,403,404,405,406,407,408,409,410,411,412,413,414];
设计两个帮助方法/** 获得特定处于的花色 @param card
* @return
/
public static function getHuaShe(value:int):int{
return Math.floor(value/100);
}
/** 获得特定牌的原始值 @param card
* @return
/
public static function getPureValue(value:int):int{
return value%100;
} 2)牌有了,我们开始设计一个发牌的函数 2.1)发一张牌,发牌函数相对比较简单,直接从一幅牌的数组中取一张即可,注意的是,取完后应该将该牌删除,以免下次再发一样的牌。
/** 获得牌组中一张随机的牌值 @param cards
* @return
/
public static function getRadomCard(cards:ArrayCollection):int{
if (cards.length==0) return -1;
var key:int=Math.round(Math.random()*(cards.length-1));
return cards.removeItemAt(key) as int;
} 2.2)发一手牌,对斗地主来说,一手牌就是17张,最后的三张就是底牌,在发牌的时候,我们考虑的是给牌排序,这样,发完牌后就自动从大到小排列。
/** 获得一个随机的一手牌。 @param cards 全部牌
* @param num 牌的数量 @param sort 是否排序 @return
*
*/
public static function getRadomCards(cards:ArrayCollection,num:int,sort:Boolean=true):ArrayCollection{
var temp:ArrayCollection=new ArrayCollection();
do{
var cardvalue:int=getRadomCard(cards);
trace("生成牌:"+getDisplayName(cardvalue));
if (!sort)
temp.addItem(cardvalue);
else
{
var added:Boolean=false;
for (var i:int=0;i<temp.length;i++)
{
var value:int=temp.getItemAt(i) as int;
if (cardvalue%100>value%100)
{
temp.addItemAt(cardvalue,i);
added=true;
break;
}
}
if (!added)
{
temp.addItemAt(cardvalue,i);
}
}
num--;
}while(num>0);
trace("排序后:"+temp.toString());
return temp;
}3)进入斗地主的逻辑,我们现在设计一个通用类叫 DoudizhuHelp.as。 斗地主游戏中的牌型很多,算法也各有不同,但我总觉得网上一些通用的算法有点铺天盖地,所以,我决定自己来重新想一下算法,总的来说,无论你出什么处于,三带二,炸,4带一等,你总是有个主牌的,从牌只认张数,大小是无所谓的,所以,我将主牌清点出来应该就只有 对子,3条,×××,双王,顺子这五类,所以,在发牌或者拿到底牌后,我们直接将所有的主牌类型清理出来即可。
现在,写一个清理主牌类型的函数。
/** 获得当前牌的所有牌型 @return
*
*/
public function initType():void{
var temp:ArrayCollection=new ArrayCollection(); for (var i:int=0;i<_cardAC.length-1;i++)
{ var card1:ICard=_cardAC.getItemAt(i) as ICard;
var card2:ICard=_cardAC.getItemAt(i+1) as ICard;
//添加至双王
if (card1.pureValue==18||card1.pureValue==19)
{
if (!shuangwangAC.contains(card1.pureValue))
shuangwangAC.addItem(card1.pureValue);
}
//相同部分,我们只需要判断一次
if (card1.pureValue==card2.pureValue)
{
//添加至×××
if (this.santiaoAC.contains(card1.pureValue))
{
if (!this.zhadanAC.contains(card1.pureValue))