嗨玩手游网

斗牛的算牛的算法实现

最近实现了一款斗牛的棋牌游戏,觉得还是有很多心得体会,想分享出来。今天主要分享一下斗牛的算牛的算法。

斗牛的牌型是 A、2、3、4、5、6、7、8、9、10、J、Q、K, 为了方便计算, 我们将它们转换成数值。 A=1, 2=2, 3=3,4=4,5=5,6=6,7=7,8=8,9=9, 10=10, J=11, Q=12,K=13。

斗牛的算法,核心内容是这样的: 先算出五张牌的总值除以十的余数为A,然后再遍历枚举任意的两张牌, 如果存在两张牌的和除以十的余数等于A,那么其他三张牌必然总和为十的倍数,那么这个余数A就是牛数,否则不存在牛。

定义牌的结构体如下:

struct NiuNiuPokerStyle_t

{

int num;// 牌的数值

int type;// 牌的花色

};

下面这个函数将实现斗牛的算牛的算法:

int calcCow(std::vector<NiuNiuPokerStyle_t> pokers)

{

if (pokers.size() != 5) return 0;

int lave = 0;

for (std::size_t i = 0; i < pokers.size(); i++)

{

lave += ((int)pokers[i].num > 10 ? 10 : (int)pokers[i].num);

}

lave = lave % 10;

for (std::size_t i = 0; i < pokers.size() - 1; i++)

{

for (std::size_t j = i + 1; j < pokers.size(); j++)

{

int a = (int)pokers[i].num > 10 ? 10 : (int)pokers[i].num;

int b = (int)pokers[j].num > 10 ? 10 : (int)pokers[j].num;

if ((a + b) % 10 == lave)

{

if (lave == 0)

{

return 10;

}

else

{

return lave;

}

}

}

}

return 0;

}

下面来写个测试测试一下该函数的正确性。

test.cpp:

int main(int argc, char ** argv)

{

if (argc != 6)

{

std::cout << \"参数错误. 比如: 1 2 3 4 5\" << std::endl;

return -1;

}

std::vector<NiuNiuPokerStyle_t> pokers;

std::vector<int> nums(13, 0);

for (int i = 1; i < argc; i++)

{

int p = atoi(argv[i]);

if (p < 1 || p > 13)

{

std::cout << \"牌不能小于1, 且不能大于13\" << std::endl;

return -1;

}

NiuNiuPokerStyle_t poker;

poker.num = p;

poker.type = 1;

nums[p]++;

pokers.push_back(poker);

}

for (std::size_t i = 0; i < nums.size(); i++)

{

if (nums[i] > 4)

{

std::cout << \"牌错误\" << std::endl;

return -1;

}

}

int cow = calcCow(pokers);

if (cow == 10)

{

std::cout << \" 牛牛\" << std::endl;

}

else if (cow == 0)

{

std::cout << \" 没牛\" << std::endl;

}

else

{

std::cout << \" 牛\" << cow << std::endl;

}

return 0;

}

结果:

./a.out 1 2 3 4 5

牛5

./a.out 10 11 12 9 8

牛7

看来算牛的结果是没有什么问题。好了,算牛的算法就分享到这里,大家有兴趣可以自己去测试一下。之后将会分享更多的棋牌游戏开发中的经验,感谢阅读。

法治课|怎样打牌,才不算“营利为目的”、不算“赌资较大”

玩多大的麻将可以不用担心被拘留?

继成都王彬如“打5元麻将、‘赌资’575元”被拘一案披露后,澎湃新闻注意到,2016年时广东顺德市民梁福胜与朋友玩牌,也因“个人赌资180元”,被拘留3日。后法院判决撤消了警方的行政处罚决定。

澎湃新闻检索中国裁判文书网发现,这类因“”被处以治安处罚,当事人后来起诉公安机关的行政案件,生行政判决书5376份,其中3382起诉讼进入二审。这类案件涉及到的“赌资”从100多元到数千元不等。部分当事人获得法院支持,处罚被撤销,多数则被驳回。

有接受澎湃新闻采访的律师和基层民警认为,对“是否以营利为目的”的自由裁量空间,易造成“选择性执法”;而对赌资金额的认定标准,大部分规定制定时间距今较长,已不能适应经济发展和收入提高的情况,建议尽早修改。

杨卫华律师建议,有关的自由裁量标准应根据社会发展水平定期修改,“最好由地方人大制定条例,然后公开”。

“赌资”180元被拘3日

中国裁判文书网上一份判决书显示,2016年2月3日,广东顺德市民梁福胜、郭兆伦、陈文华在顺德区某茶庄打麻将,约定每注5-10元。在打麻将过程中,四人被顺德公安分局的民警当场抓获,民警从陈浩朋身上查获180元、从梁福胜身上查获200元、从郭兆伦、陈文华身上分别查获100元,共计580元赌资。

2016年2月4日,顺德区公安分局作出佛顺公行罚决字[2016]03527号《行政处罚决定书》,依据治安管理处罚法规定,决定对梁福胜处以行政拘留三日、收缴赌资180元。

梁福胜不服该处罚,于2016年7月20日,向顺德区人民法院提起行政诉讼。

顺德区2016年12月27日作出的判决认为,“构成违反治安管理处罚法应当给予行政处罚的行为主观上要以营利为目的,客观上实施了为提供条件或参与赌资较大的行为。”

关于原告是否属于以营利为目的,法院认为,根据顺德公安局对原告等人所作的询问笔录,原告等人是互相认识的,晚饭后兴致来潮相约到茶庄打麻将,并约定了每注金额5-10元,且原告的户籍资料显示原告是有工作单位,均不能推定原告打麻将是以营利为目的。

关于原告是否为提供条件或参与赌资较大,法院认为,“由于我国目前的法律没有规定行为中‘赌资较大’的起算点,根据合理性原则,该界定应根据各地经济情况综合判断。从现场查获的情况来看,参与打麻将的资金人均一百余元,佛山市2015年度城镇职工月平均工资为5151元,从合理性原则判断,原告等人的打麻将活动,不属于赌资较大的情形。”

最后,法院判决撤销被告佛山市顺德区公安局于2016年2月4日作出的佛顺公行罚决字[2016]03527号行政处罚决定。

多少算“赌资较大”?

关于违法行为的界定,《治安管理处罚法》这样规定:以营利为目的,为提供条件的,或者参与赌资较大的,处五日以下拘留或者五百元以下罚款;情节严重的,处十日以上十五日以下拘留,并处五百元以上三千元以下罚款。

北京盈科(上海)律师事务所律师杨卫华告诉澎湃新闻,治安处罚法规定的条文对违法行为的表述都比较“模糊”,因为各地情况不同,确也无法制定“一刀切”的标准。通常是最高司法机关给出司法解释,或地方司法机关制定具体标准。

但他认为,类争议案件频发的症结,并不在于缺乏统一的标准,而在于地方制定的具体标准时,是否充分考虑到受到当地经济发展水平和文化、习俗的差异。

澎湃新闻梳理发现,对于“赌资较大”与“情节严重”认定标准,各地差别较大。“赌资较大”的认定,一些地方有明确规定,一些地方则没有。

2009年,《四川省公安机关办理治安管理处罚案件自由裁量标准》出台,并未对“赌资较大”作出界定,只对“情节较重”作出规定,包括“多次参与的”、“以欺骗方式,诱人参赌的”等五类情况。

但在1989年出台的《四川省禁止条例》中,第二条规定,“凡以财物作赌注比输赢的活动,都是行为。任何形式的都是违法行为,必须严厉禁止,坚决取缔。”

在王彬如“打‘5元麻将’被拘15日”一案中,王彬如据此认为,她与任恒全、刘琼之间玩牌,属于亲友间打牌娱乐,且均不是以营利为目的,不应该予以处罚。但二审法院引用1989年出台《四川省禁止条例》,认定其行为属于。

四川以外,在麻将较为流行的湖南、湖北等地,有关“赌资较大”和“情节严重”的具体规定,与其他地区并无太大差异。

2015年出台的《湖南省公安行政处罚裁量权基准实施办法》规定颇为详细:

单注金额二十元以上五十元以下的,或全场输赢额两千元以上不足五千元的;参与“扳砣子”、“斗牛”、“三跟(公)”、“推牌九” 等方式的,单注金额二十元以下或全场输赢额二千元以下的,为“一般情节”,处五日以下拘留或者五百元以下罚款。

单注金额五十元以上一百元以下,或全场输赢额五千元以上一万元以下的;参与“扳砣子”、“斗牛”、“三跟(公)”“推牌九”等方式的,单注金额二十元以上不足五十元或全场输赢额二千元以上不足五千元的,属于“情节严重”,处十日以上十二日以下拘留,并处五百元以上二千元以下罚款。

单注金额一百元以上或全场输赢金额一万元以上的;参与“扳砣子”、“斗牛”、“三跟(公)”、“推牌九”等方式的坐庄,或者单注金额五十元以上或全场输赢额五千元以上的,为“情节特别严重”,处十二日以上十五日以下拘留,并处二千元以上三千元以下罚款。

陕西省公安厅《治安管理处罚法裁量细化标准》未对“赌资较大”明确规定,但规定人均参赌金额在200元以上或者当场赌资在800元以上的,视为“情节严重”。

《湖北省公安机关行政处罚裁量权细化标准》规定,人均赌资不满1000元的,属于“麻将娱乐”,不予处罚;人均赌资1000以上不满3000元的,处500元以下罚款;人均赌资3000以上不满5000元的,处5日以下拘留;人均赌资5000元以上的,处10日以上15日以下拘留,并处500元以上3000元以下罚款。

江西省某地基层民警(化名)告诉澎湃新闻,有关“”认定的地方规定,有些制定的时间距今很久,已不能与经济的发展和收入的增加相适应,亟待修改提高标准。

他以江西省2009年出台的《江西省公安行政处罚自由裁量权参照执行标准》为例说,该标准距今近十年,“如果按照省厅的标准,(江西)打麻将的可能大部分都能拘留。”

《江西省公安行政处罚自由裁量权参照执行标准》规定,“个人赌资在200以上的,处500元以下罚款,情节特别轻微的,不予处罚;个人赌资数额500元以上的,处五日以下拘留,情节严重的,处十日以上十五日以下拘留,并处500元以上3000元以下罚款。”

杨卫华还说,一些地方有关认定标准的规定,属于公安内部规定,未主动对外公开,这不利于法律的普及。此前他办理的一起类似案件,就是通过向公安机关申请信息公开,才获得认定标准的。

怎么认定“以营利为目的”?

除了“赌资”大小外,是否以营利为目的,也是最容易引起争议的部分。

多位基层民警告诉澎湃新闻,执法中公安机关对的界定,主要看赌资的大小和牌的玩法,“这个东西民警有很大裁量权”。

杨卫华律师告诉澎湃新闻,他曾代理过一起案件,当事人开了一家棋牌室,当日有几个人打牌,“赌资”共计800多元,被公安查获后,分别被处以3-5日拘留,这位开棋牌室的当事人,则被拘留15日。提起行政诉讼后,当事人获得法院支持被撤销了处罚,最后还获得了2000多元国家赔偿。

杨卫华表示,对打牌是否营利的认定,自由裁量空间大,容易变成选择性执法,伤害执法公信力。

2005年5月25日,公安部出台《关于办理违法案件适用法律若干问题的通知》,第九条规定,“不以营利为目的,亲属之间进行带有财物输赢的打麻将、玩扑克等娱乐活动,不予处罚;亲属之外的其他人之间进行带有少量财物输赢的打麻将、玩扑克等娱乐活动,不予处罚。”

西部某地派出所所长王旭(化名)介绍,抓赌属于常规性执法的一种,因玩牌是当地老百姓流行的娱乐方式,只要不是“炸金花”,“吹牛牛”动辄输赢几万的情况,警方一般不会主动去查,“都是有人举报,或者打架斗殴才查”。

王旭说,对于的认定标准,一是界定涉案人员是否为亲属关系,二是看赌资大小。警方一般通过查询户籍信息,确定是否为亲属关系,此外通过分开询问,通过口供比对是否为亲属;对于赌资大小的认定,则根据该省制定的标准。

王旭坦言,如果严格按照标准执行,该省玩牌的人中“百分之六七十的人都要被拘留。”

前述江西基层民警认为,认定应当从玩牌方式和下注金额两个方面综合考虑,才能避免打击面过大,“像那种要事先下赌注,或者利用机进行的,应该被认定为”,亲友间常规的玩牌,不应该被视为。“如果多数人都成为违法嫌疑人,这样的法律就会失去法律效益与社会效益。”他说。

更多资讯
游戏推荐
更多+