请教南城带百搭的麻将胡牌算法的算法

麻将算法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢5600人阅读
麻将的算法提高篇
1.先说说,数值的构成。
类型字&0:东南西北中发白&》,,,,,,
类型万&1:万2万万万万万万万万》,,,,,,,,
类型条&2:条条条条条条条条条》,,,,,,,,
类型饼&3:饼饼饼饼饼饼饼饼饼》,,,,,,,,
如果我知道一个数字,。
马上就知道是对应类型,就是属于“条”。26%10=6,就能得出是条。
如果要匹配到相应的图片的话,中间的,就是代表你要的是条。还有声音文件的话,也可如此。
除数结果为类型,取余为第几个。
std::vector&int&&mPaiValueV&&//装所有牌的容器
1,,,,,,
11,,,,,,,,
21,,,,,,,,
31,,,,,,,,
把上面的数据放到&mPaiValueVector&中,循环4次。(共&34&*&4&=&136&张牌)
//再用这个来打乱上面容器里面所有数值的顺序
//当然是越乱越好
random_shuffle(mPaiValueVector.begin(),&mPaiValueVector.end());
每次发牌都从mPaiValueVector的末尾发一张,先发13张。
(A为庄南,B东,C北,D西)
玩家A&:&4,&13,&23,&5,&14,&22,&22,&14,&38,&17,&28,&5,&37&&+&19&
玩家B&:&14,&3,&13,&15,&24,&12,&2,&24,&18,&17,&28,&15,&17&
玩家C&:&24,&23,&3,&25,&34,&32,&12,&3,&7,&17,&28,&25,&27&
玩家D&:&34,&33,&13,&35,&4,&4,&32,&34,&28,&17,&28,&35,&7&
发牌后,按从小到的数据排序。
玩家A&:&4,&5,5,13,&14,&14,&17,&19&,22,&22,&23,&28,&37,&38&
结果你就能看到字,万,条,饼的先后出现,且是从1到9的顺序。
字不足5个,就打字先,把4打出去。
玩家B中比较下,没有两个4,玩家C中,也没有。
D中找到两个4,那玩家D,就能碰。(当然B,C中没有人胡牌)。
和碰类似,只不过先有3只一样的,后面要补张牌好像。
清一色:14个的数值分别除以,结果全为一样的。
小对:14个数据中,有对是一样的。有碰有胡,除外(有个一样的数据,有个一样的数据就除外)。
平胡:3连连连连对。&(连在一起的个数据或者碰到的对,有类似对,再上对的数据)。
杠上开花:
类推,还有什么胡法(我也不太懂)。
总体上,按上面排序的数值处理,会简单很多的。
麻将服务器方面:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7529次
排名:千里之外
(1)(3)(2)(3)(1)微软算法面试题「判断麻将是否和牌」应该如何做? - 知乎738被浏览23246分享邀请回答31 条评论分享收藏感谢收起微软算法面试题「判断麻将是否和牌」应该如何做? - 知乎738被浏览23246分享邀请回答#include &iostream&
#include &vector&
#include &algorithm&
using namespace std;
static vector&int& result;
//for debug
void prtvct(const vector&int& &v, bool nxtline = true) {
for (auto it = v.begin(); it != v.end(); ++it) {
cout && *it && " ";
if (nxtline)
cout && endl;
bool erase_by_val(vector&int& &in, int val) {
for (auto it = in.begin(); it != in.end(); ++it) {
if (*it == val) {
in.erase(it);
return true;
return false;
void push_result(int a, int b, int c) {
result.push_back(a);
result.push_back(b);
result.push_back(c);
bool shrink(vector&int& &in) {
if (in[0] == in[1] && in[1] == in[2]) {
push_result(in[0], in[1], in[2]);
auto it = in.erase(in.begin());
it = in.erase(it);
in.erase(it);
return true;
if (in[in.size()-1] - in[0] & 2) {
return false;
for (i = 0, t = in[0]; i & 3; ++i, ++t) {
erase_by_val(in, t);
push_result(t-3, t-2, t-1);
return true;
void group(vector&int& &input, vector&vector&int& & &grp) {
vector&int& member;
if (input.begin() != input.end()) {
member.push_back(input[0]);
for (auto it = input.begin()+1; it != input.end(); ++it) {
if (*it == *(it-1) || *it == *(it-1)+1) {
member.push_back(*it);
grp.push_back(member);
member.clear();
member.push_back(*it);
grp.push_back(member);
bool isLegal(vector&int& &input) {
vector&vector&int& & grp;
if (input.size() % 3 != 0) {
return false;
if (input.size() == 3) {
if (input[0] == input[1] && input[1] == input[2]) {
push_result(input[0], input[1], input[2]);
return true;
if (input[1] == input[0] + 1 && input[2] == input[1] + 1) {
push_result(input[0], input[1], input[2]);
return true;
return false;
group(input, grp);
// for each group
for (auto it = grp.begin(); it != grp.end(); ++it) {
if (shrink(*it) == false) {
return false;
if (isLegal(*it) == false) {
return false;
return true;
bool isHu(vector&int& &input) {
sort(input.begin(), input.end());
int i = 0;
while (i & input.size()-1) {
result.clear();
auto incopy = input;
if (input[i] == input[i+1]) {
result.push_back(input[i]);
result.push_back(input[i+1]);
auto it = incopy.erase(incopy.begin() + i);
incopy.erase(it);
// process
if (isLegal(incopy) == true) {
return true;
do { ++i; } while (i & input.size()-1 && input[i] == input[i-1]);
return false;
int main()
int n = 0;
vector&int& input;
for (int i = 0; i & n; ++i) {
input.clear();
for (int j = 0; j & 14; ++j) {
input.push_back(a);
if (isHu(input)) {
cout && "Hu: ";
prtvct(result);
cout && "Not Hu" && endl;
2添加评论分享收藏感谢收起

我要回帖

更多关于 杜桥麻将的胡头算法 的文章

 

随机推荐