C++麻将胡牌算法
背景
m * AAA + n * ABC + AA
m 和 n 可 為0
實現算法
當玩家摸牌之后,玩家手中會有14張牌,使用一個vector<int>來保存玩家手中所有的牌,將一萬到九萬映射到1-9,一條到九條映射到21-29,一筒到九筒映射到31-39,再用100-700表示風牌。
經過上面的轉換,得到一個長度為14的vector<int>。
可以看到,通過簡單的遞歸,即可判斷麻將是否胡牌。
實現代碼
判斷vec是否滿足m * AAA + n * ABC 的函數
static bool isFormat(std::vector<int> vec){if(vec.size() == 0){return true;}else if(vec.size() < 3 || vec.size() % 3 != 0){return false;}bool res = false;// vec[0] 位于 AAA型if(vec[0] == vec[1] && vec[1] == vec[2]){std::vector<int> left(vec.begin()+3,vec.end());if(isFormat(left)){res = true;}}// vec[0] 位于 ABC型std::vector<int> left;int i=0,j=0;for(int k=1;k<vec.size();++k){if(vec[k]==vec[0]+1){i=k;}if(vec[k]==vec[0]+2){j=k;}}if(i!=0 && j!=0){std::vector<int> left;for(int k=1;k<vec.size();++k){if(k==i || k==j){continue;}left.push_back(vec[k]);}if(isFormat(left)){res = true;}}return res; }結束語
為了鍛煉代碼能力,用c++寫了個麻將游戲,很不美觀,但是基本框架搭好了,跟朋友玩了兩局,都是我贏了,然后ta鄙視我說這是開發者的陰謀。
沒有開杠,沒有碰牌,沒有屁胡,只有自摸……
如果有想要源碼的朋友,可以私信我。
總結
- 上一篇: 广域网协议(HDLC协议和PPP协议)
- 下一篇: 控制电机的几种控制电路原理图