房卡麻將分析系列之 發牌器 演算法設計

2021-07-28 04:55:08 字數 4211 閱讀 9612

房卡麻將分析系列之"發牌器"演算法設計

回顧開發過程,我深深的體會到,乙個有多年摸牌經驗的伺服器主程是有多麼重要!記得年前幫一家公司做房卡麻將專案,對方從上到下,基本沒人會玩麻將,諸事都需要請教麻友,這樣的情況我覺得上線的產品應該也不太會好吧,沒愛的設計~!不過我可是8歲就上牌桌,八十年代家裡就有了一幅竹製麻將。而童年時每年最開心的事情,莫過於過年時和小夥伴們」搓麻「賭壓歲錢了。上大學離家之前的十幾年裡,時常家裡」叮叮咣咣「的」呼啦「聲是我人生最重要的記憶了。現在的我,雖然一年也打不上兩圈牌了,但是仍然可以不看牌面的情況下用手摸出每一張牌。

在這種情況下,寫麻將似乎是得心應手的事情。而在碰到胡牌演算法除錯時,快速理解並寫出對應的發牌器演算法,也是很有意思並且實用的事情。

」發牌器「

就是一套能夠對所有操作需求生成出給玩家相應牌型的演算法。對於棋牌開發者來說,這是必不可少的,他可以快速的幫助開發者除錯出吃,碰,槓,聽,胡等各個操作的正確性。節省除錯的時間和成本。試想下,如果你讓測試員自已打出」天胡「

,這似乎是比登天還難的事情罷~。

今天,我們就來講一下「發牌器」的開發原理和設計方法。

」發牌器「

的演算法基於現有的麻將牌邏輯類擴充套件出一些函式即可,然後在。比如這樣:

在原本隨機發牌函式的基礎上增加各個牌型的發牌函式即可。然後就是為每個函式完成相應的牌型安排。

比如,「七對子」牌型:

//牌型發牌 - 七對子

void cgamelogic::setcarddata_qiduizi(byte cbleftcardcount, byte cbcarddata, byte cbmaxcount)

;byte cbp2paidata[13] = ;

byte cbp3paidata[13] = ;

byte cbp4paidata[13] = ;

//發給玩家的牌

byte cbp1qipai = 0x09;//玩家起牌**。

byte cbp2qipai = 0x09  ;//玩家起牌打出去吃胡。

byte cbp3qipai = 0x23; 

byte cbp4qipai = 0x04; 

byte cbp5qipai = 0x19; 

byte cbp6qipai = 0x26; 

byte cbp7qipai = 0x33;

byte cbp8qipai = 0x28;

//填充到發牌的手牌資料裡。

copymemory(&cbcarddata[cbleftcardcount - (max_count - 1)], cbp1paidata, sizeof(cbp1paidata));

copymemory(&cbcarddata[cbleftcardcount - 2 * (max_count - 1)], cbp2paidata, sizeof(cbp2paidata));

copymemory(&cbcarddata[cbleftcardcount - 3 * (max_count - 1)], cbp3paidata, sizeof(cbp3paidata));

copymemory(&cbcarddata[cbleftcardcount - 4 * (max_count - 1)], cbp4paidata, sizeof(cbp4paidata));

//填充到起牌的資料前八個牌裡面。

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 1] = cbp1qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 2] = cbp2qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 3] = cbp3qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 4] = cbp4qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 5] = cbp5qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 6] = cbp6qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 7] = cbp6qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 8] = cbp6qipai;

}這樣在牌局開始時,四個玩家即按如上牌型得到手牌牌牆,並按設定的起牌摸牌。這樣即可快速進行七小對的測試。

再來看乙個「槓底開花」

//牌型發牌 - 槓上開花

void cgamelogic::setcarddata_gangshangkaihua(byte cbleftcardcount, byte cbcarddata, byte cbmaxcount)

;byte cbp2paidata[13] = ;

byte cbp3paidata[13] = ;

byte cbp4paidata[13] = ;

//發給玩家的牌

byte cbp1qipai = 0x01;//起手暗槓

byte cbp2qipai = 0x31;//槓後起牌東風胡

byte cbp3qipai = 0x23; 

byte cbp4qipai = 0x24;

byte cbp5qipai = 0x25; 

byte cbp6qipai = 0x26;

byte cbp7qipai = 0x27;

byte cbp8qipai = 0x28;

copymemory(&cbcarddata[cbleftcardcount - (max_count - 1)], cbp1paidata, sizeof(cbp1paidata));

copymemory(&cbcarddata[cbleftcardcount - 2 * (max_count - 1)], cbp2paidata, sizeof(cbp2paidata));

copymemory(&cbcarddata[cbleftcardcount - 3 * (max_count - 1)], cbp3paidata, sizeof(cbp3paidata));

copymemory(&cbcarddata[cbleftcardcount - 4 * (max_count - 1)], cbp4paidata, sizeof(cbp4paidata));

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 1] = cbp1qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 2] = cbp2qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 3] = cbp3qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 4] = cbp4qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 5] = cbp5qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 6] = cbp6qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 7] = cbp6qipai;

cbcarddata[cbleftcardcount - 4 * (max_count - 1) - 8] = cbp6qipai;

}玩家在拿到一餅後即可暗槓,摸出東風後胡。

其它的演算法也都可以按同樣的路子改出來,注意好牌型和玩家對應關係就可以了。

好,這節課就講到這裡,咱們下次繼續講」房卡「麻將的開發技巧~

房卡麻將開發系列之「缺人玩法」

一般玩麻將都是四個人,遇到 三缺一 怎麼辦?大多數情況下,玩家只好等待或叫人,這無疑增加了玩家的等待時間,同時也減緩了房卡的消耗速度。其實四個人並不是玩麻將的硬性條件,如果能在遊戲中不受四人限制隨時開局,就會大大提公升房卡麻將的實用性和可玩性,同時有效的加快房卡銷售速度。所謂 缺人玩法 即在原有基礎...

房卡麻將分析之」IPV6 改造

前一段一是太忙,二是太忙,三還是太忙,不過實放說,肚子裡的素材也的確需要沉澱一下了。先上百科 ipv6是internet protocol version 6的縮寫,其中internet protocol譯為 網際網路協議 ipv6是ietf 網際網路工程任務組,internet engineeri...

鬥地主系列之洗牌和發牌

大家都知道,鬥地主的一副牌有54張,三位玩家,每位17張牌,3張底牌 17 3 3 54 所以,我們定義乙個list listcards new arraylist cards.get 0 cards.get 12 方塊3,方塊4 方塊k,方塊a,方塊2 cards.get 13 cards.get...