摘要:麻將是棋牌游戲中最復雜的棋牌游戲之一。從程序的角度,鞍山麻將是復雜度可以說是“五星級”的。那么程序是怎么實現的讓電腦玩麻將的呢?鞍山麻將相比其他地區的麻將多了混牌,槍牌,三叉,二八將,四歸一,大哥大。邏輯核心就是如何判斷牌是否胡牌。
關鍵詞:混;混皮;槍;大哥大;三叉;二八將;番;分張
中圖分類號:TP37文獻標識碼:A文章編號:1009-3044(2011)04-0878-02
The Internet Card Game-Anshan Mahjong
LV Bao-sheng, ZHONG Bao-rong
(College of Computer Science, Yangtze University, Jingzhou 434023, China)
Abstract: Mahjong is one of the most complex card games. At the view of the programming, the complexity of Anshan Mahjong could be said to be \"five-star \". Then how does the computer achieve it by programming? Anshan Mahjong comparing to others has Hun card which can place any card, gun card, double cards which value is two or eight , four same cards in hand, the count of theZhong card or Fa card or Bai card is three. How to determine whether the cards is winning is the core logic.
Key words: hun card; hunpi card; gun card; mobile card; trigeminal card; two or eight card; fan; the separation
1 游戲介紹
鞍山麻將是遼寧省鞍山地區特有的麻將玩法,其特點在于“混”和“槍”的規則。第一局隨機確定莊家,再由莊家擲第一次色子,從此次擲出來的點數確定翻混牌的位置,并由此點數位置的玩家擲第二次骰子,確定從何處抓牌。每局莊家為上一局第一個胡牌的玩家。
2 關鍵詞解釋
混皮:在服務器端隨機一張牌稱為“混皮”。
混:就是比混皮大1的牌稱為“混牌”?;炜梢援斎我馀?。
槍:就是有人胡牌后,再順序摸起的那張牌以及比這張牌大1的牌稱為“槍牌”。
大哥大:中發白不管哪個牌如果有三張一樣的就叫一個“大哥大”。
刻:三張相同的牌稱為“刻”。
三叉:如果有三個刻就稱為“三叉”。
二八將:就是胡的時候有二,八任意一個成對,就叫“二八將”。這要算作一番的。
番:一番就是一倍。計算得分用的。
分張:倒數26張牌是每人摸一張牌,放在手里不打出。稱為“分張”。
四歸一:如果手里摸到三張混皮稱為“四歸一”,如果手里有四張一樣的牌也稱為“四歸一”。
3 游戲流程
圖1為流程圖。
4 網絡鞍山麻將實現基本原理
136張牌全在服務器端隨機排列,然后發給每一個客戶端。吃,碰,杠,胡,以及摸牌,分張,算分全部是在服務器端判斷完成,然后把數據發到客戶端繪制顯示出來。
結合圖2,大哥更容易理解。桌面上只要大家可以看到的牌,那都是服務器發過來數據,然后客戶端根據服務器數據調用相應的圖片資源進行繪制顯示。大家注意算分界面后面的牌墻,其實那些牌墻只是一個顯示,如果你翻開牌墻看,你會發現牌的另一面是白的,沒有任何數據。同理算分界面上的數據也都來自服務器。
5 鞍山麻將核心胡牌算法
難點分析:因為鞍山麻將中有混牌,所以胡牌的情況就多了很多,這樣不遺漏任何一種胡牌情況就成了難點。
基本原理:把混牌換成34種牌中的一張牌插入到牌隊列中進行分析,如果返回值不為空則認為胡啦。
代碼剖析:
cbCardIndexTemp[cbHunIndex]--;
for (BYTE j=0;j {//胡牌分析 BYTE cbCurrentCard1=SwitchToCardData(j); BYTE cbHuCardKind =AnalyseChiHuCard(cbCardIndexTemp,cbCardIndexTemp1,WeaveItem,cbItemCount,cbCurrentCard1,dwChiHuRight, cbHunIndex,cbHunPiIndex,ChiHuResult,j); //結果判斷 if (cbHuCardKind!=CHK_NULL) { cbCardIndexTemp[cbHunIndex]=1; ChiHuResult.dwQiongHu=0; return WIK_CHI_HU; } } cbCardIndexTemp[cbHunIndex]=1; 此段代碼既是當牌隊列中有一個混牌時的分析:先把牌隊列中的混牌刪除,在依次插入34種牌中的每一張牌進行胡牌分析。一旦返回值不為空,就說明胡了,就要發胡牌提示給相應的玩家。最后還有一步就是還原混牌。 同理無論有幾張混牌,都按此理論進行判斷,就不會忽略任意一種胡牌牌型。 6 總結 因為鞍山麻將是中國最復雜地方麻將之一,所以只要能實現鞍山麻將的邏輯與算法。在任何一種地方麻將實現起來都肯定相當簡單。 當前算法不足之處,胡牌類型最優化的分析與計算不夠完善。具體在算法上就是二八將加番與三叉加番沖突未解決。所以胡牌最優化算法有待進一步完善與提高。 參考文獻: [1] Deloura M.游戲編程精粹1[M].北京:人民郵電出版社,2004. [2] Deloura M.游戲編程精粹2[M].北京:人民郵電出版社,2003. [3] Treglia D.游戲編程精粹3[M].北京:人民郵電出版社,2003. [4] Kirmse A.游戲編程精粹4[M].北京:人民郵電出版社,2005. [5] Pallister K.游戲編程精粹5[M].北京:人民郵電出版社,2007. [6] Dickheiser M.游戲編程精粹6[M].北京:人民郵電出版社,2007. [7] 榮欽科技.Visual C++游戲編程基礎[M].北京:電子工業出版社,2005. [8] 楊正華,張秋生.Visual C++游戲編程導學[M].北京:清華大學出版社,2004. [9] 榮欽科技.Visual C++游戲設計[M].北京:北京科海電子出版社,2003. [13] LaMothe A.Windows游戲編程大師技巧[M].北京:中國電力出版社,2004.