紮金花 遊戲開發細節與部分代碼,鬥地主遊戲中的牌型很多,演算法也各有不同,但我總覺得網上一些通用的演算法有點鋪天蓋地,所以,我決定自己來重新想一下演算法,總的來說,無論你出什麼處於,三帶二,炸,4帶一等,你總是有個主牌的,從牌只認張數,大小是無所謂的,所以,我將主牌清點出來應該就只有 對子,3條,炸彈,雙王,順子這五類,所以,在發牌或者拿到底牌後,我們直接將所有的主牌類型清理出來即可。
這是我希望開發的第一個紙牌類遊戲,鬥地主本身來說是一個有限使用者的回合制遊戲,核心邏輯與棋類遊戲並無多大的不同,但是因為並無多大的行棋演算法,所以位置顯得不那麼的重要。所以我決定還是用開發四國軍棋形成的flexchessapi來開發這個遊戲,如果flexchessapi不能勝任這個工作,我會考慮形成一個通用的flexcardapi來開發這個遊戲。這樣,我就能利用flexcardapi開發更多的遊戲,比如詐金花等。紮金花
核心邏輯開發完成後效果
好了,現在我們開始設計一些紙牌類的一般邏輯思考,放在一個靜態類如CardHelp.as中。。
1) 設計一幅牌 紮金花
我們對一幅牌的每一張牌應該給定一個值,每個值包括花色與本身的大小,這樣,我們就以一個3位元的值來代表一張牌,比如303代表紅花3,414代表黑桃A,這樣,我們就能夠設計出一幅牌的完整數組,不同的牌需要的完整數不同,比如紮金花是不要王,鬥地主是要王的,現在,我們設計一幅牌。
/**
*鬥地主帶王的一幅完整的牌
* 在鬥地主中,2是比A還大的牌,我們不能叫102,就叫115吧。
*/
public static const CARDS_WITH_JOKER:Array=[115,103,104,105,106,107,108,109,110,111,112,113,114,215,203,204,205,206,207,208,209,210,211,212,213,214,315,303,304,305,306,307,308,309,310,311,312,313,314,415,403,404,405,406,407,408,409,410,411,412,413,414,518,519];
/**
*紮金花不帶王的一幅完整的牌
*/
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。